static关键字
在类中,用static声明的成员变量为静态成员变量。(类名.static成员方法或属性,并没有创建对象)
--它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化,
--对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
--可以使用”对象.类属性”来调用。不过,一般都是用“类名.类属性”。
--用static声明的方法为静态方法
--不需要对象,就可以调用(类名.方法名)
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
静态方法不能调用非静态的属性和方法。不能使用 this 和 super。
非静态方法既可以调用静态的属性和方法,也可以调用非静态的属性和方法。
静态初始化块
--是在类初始化时执行,不是在创建类时执行。
--静态初始化块中不能访问非 static 成员。
成员变量加static:看数据是否共享
成员方法加static:看方法中的变量(如果方法没有调用过非静态成员,将方法定义为静态)
如果父类和子类存在相同的用 static 修饰的成员变量和成员方法,如果父类调用变量和方法,会调用父类的(多态指的是对象的多态,static 修饰的属性和方法属于类,不存在多态)
this关键字
:本类对象的引用,哪个对象调用的,this 就表示哪一个对象
--普通方法中,this 总是指向调用该方法的对象。
--构造方法中,this 总是指向正要初始化的对象。
this最长用的用法
--this point 让类中的一个方法,访问该类的另一个方法或属性。
--this()使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。
注意事项:
-- this 不能用于static方法!(this指向当前对象,static方法跟对象没有一毛钱的关系)
-- this(实参列表):调用本类中的构造方法
super关键字
--super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
普通方法:没有顺序限制,可以随便调用。
构造函数:任何类的构造方法中,若是构造方法的第一行代码没有显式的调用super(...);那么Java默认都会调用super(); 所以你这里的super(); 加不加都无所谓。
调用父类的成员变量--super.成员变量。
调用父类的成员方法--super.成员方法()。
注意:
--在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式 super();语句。
--子类中所有的构造方法,无论重载多少个,第一行必须是super()。
--如果父类有多个构造方法,子类任意调用一个就可以。
为什么子类对象创建都要访问父类的构造方法?
因为子类继承了父类的内容,所以创建对象时,必须要先看父类是如何对其内容进行初始化的。
this 和 super 既然都能位于第一行,只使用其中一个;但是无论如何,子类的所有构造方法,直接或间接,必须调用到父类构造方法。
1 public class Fu { 2 int a; 3 public Fu(int a){ 4 this.a = a; 5 } 6 } 7 8 9 public class Zi extends Fu{ 10 public Zi(){ 11 //调用的是自己的构造方法,间接形式调用了父类的构造方法 12 this(6); 13 } 14 15 public Zi(int a){ 16 super(a); 17 } 18 }
final关键字
修饰变量:
--被final修饰的变量不可改变。即初始化一次后,就不能再次被赋值!即,变为常量!
注意:修饰成员变量,需要在创建对象前赋值,否则报错。
1 public class Demo { 2 3 final int m = 1; 4 5 final int n; 6 7 public Demo(int n){ 8 this.n = n; 9 } 10 }
修饰方法:
--被final修饰的方法不可以被子类重写!
修饰类:
--被final修饰的类不能被继承!