【黑马软件工程师】面向对象(二) 第六天
【黑马程序员】面向对象(二) 第六天













创建结果如下图所示:




------- android培训、java培训、java学习型技术博客、期待与您交流! ----------
知识点
(来自百度百科)有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static
成员的最常见的例子是main()。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。
声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。
01)static静态关键字
public class PersonDemo { public static void main(String[] args) { Person p = new Person(); p.show(); System.out.println(p.country);//通过引用调用。 System.out.println(Person.country);//通过类名直接调用 } } class Person{ String name;//成员变量,实例变量。 static String country = "CH";//静态变量。被static修饰的属性在方法区(共享区、数据区)被创建。被所有创建的对象所共享。 void show(){ System.out.println(name + "的国籍是:" + country); } }运行结果如下图所示:
02)main函数
public class MainDemo { public static void main(String[] args) {//参数args是可以更改的。arsg、ag、xx都可以。【args】只是一种习惯。 String[] arr = {"hah", "huohuo", "heh", "hihi", "hiahia"}; MainTest.main(arr);//通过类之间调用静态方法(main)。 } } class MainTest{ public static void main(String[] args) { System.out.println("一共有"+ args.length + "个元素,分别是:"); for (int i = 0; i < args.length; i++){ System.out.print(args[i] + " "); } } }
运行结果如下图所示:
03)何时使用静态?(static)
要从两方面考虑:因为静态修饰的内容有成员变量和函数(方法)。
如果想让一个类的所有实例共享数据,就要使用静态变量(类变量)。(对象中的特有数据要定义成非静态存在堆内存中。)
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
public class PersonDemo_2 { public static void main(String[] args) { // Person_2 p = new Person_2(); // p.show();//如果只是调用show()方法,楼上的创建对象将变的无意义。 Person_2.show();//直接通过类名调用。 } } class Person_2{ String name; public static void show(){//因为方法不访问name变量,所以需要修饰为static。 System.out.println("Welcome to Java!"); } }运行结果如下图所示:
04)静态的应用——工具类
代码:
首先创建工具类:ArrayTool。
然后创建测试类:ArrayToolDemo。运行。
public class ArrayTool {//工具类 private ArrayTool(){}//私有化。 public static int getMax(int[] arr){//获取最大值。 int max = arr[0]; for (int i = 1; i < arr.length; i++){ if (arr[i] > max) max = arr[i]; } return max; } public static int getMin(int[] arr){//获取最小值。 int min = arr[0]; for (int i = 1; i < arr.length; i++){ if (arr[i] < min) min = arr[i]; } return min; } public static void selectSort(int[] arr){//选择排序:升序。 for (int i = 0; i < arr.length - 1; i++){ for (int j = i + 1; j < arr.length; j++){ if (arr[i] > arr[j]) swap(arr, i, j); } } } public static void bubbleSort(int[] arr){//冒泡排序:降序。 for (int i = arr.length - 1; i > 0 ; i--){ for (int j = i - 1; j > -1 ; j--){ if (arr[i] > arr[j]) swap(arr, i, j); } } } private static void swap(int[] arr, int a, int b){//位置置换。 int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void printArray(int[] arr){ System.out.print("["); for (int i = 0; i < arr.length; i++){ if (i != arr.length - 1) System.out.print(arr[i] + ", "); else System.out.println(arr[i] + "]"); } } }创建测试类:ArrayToolDemo。运行。
public class ArrayToolDemo { public static void main(String[] args) { int[] arr = {31, 321, 4325, 6, 412, 4, 423}; /* //为了让程序更严谨,就不需要通过创建对象来调用方法,所以ArrayTool类中的方法都可以修饰为static。 ArrayTool tool = new ArrayTool(); int max = tool.getMax(arr); System.out.println("Max is: " + max); int min = tool.getMin(arr); System.out.println("Min is: " + min); tool.printArray(arr);//排序前 tool.selectSort(arr); tool.printArray(arr);//排序后 tool.bubbleSort(arr); tool.printArray(arr);//排序后 */ int max = ArrayTool.getMax(arr); System.out.println("Max is: " + max); int min = ArrayTool.getMin(arr); System.out.println("Min is: " + max); ArrayTool.printArray(arr);//排序前 System.out.println("--------------分割线---------------"); ArrayTool.bubbleSort(arr);//升序 ArrayTool.printArray(arr);//排序后 System.out.println("--------------分割线---------------"); ArrayTool.selectSort(arr);//降序 ArrayTool.printArray(arr);//排序后 } }运行结果如下图所示:
05)帮助文档的制作。
/** * 这是一个可以对数组进行操作的工具类,该类中提供了获取最值,排序(升降序),打印数组中元素等功能。 * @author (作者) * @version (版本) * @param (参数) * @return (返回) */cmd运行示例
将doc文档创建到D盘myhelp文件中。
创建结果如下图所示:
注意:
06)静态代码块
/* * 静态代码块。 * 格式: * static{ * 静态代码块中的执行语句。 * } * 特点:随着类的加载而执行,只执行一次。 * 用于给类进行初始化,并优先有主函数。 * */ class StaticCode{ static{//静态代码块。 System.out.println("a"); } } public class StaticCodeDemo { static{//静态代码块。 System.out.println("b"); } public static void main(String[] args) { new StaticCode();// new StaticCode();//这两个只执行一次,上面执行后,这行将不执行。 System.out.println("Over"); } static{//静态代码块。 System.out.println("c"); } }运行结果如下图所示: