1.this表示本类, super表示父类
2.类中函数两个特点:
(1)重载:同一个类中,用overload
(2)覆盖:子类中,也称重写,覆写。用override 。子类方法覆盖父类方法时,子类方法权限要大于等于父类方法权限。
3.看下面的例子,应该输出什么呢?
class Fu { Fu() { System.out.println('A'); } Fu(int x) { System.out.println('B'); } } class Zi extends Fu { Zi() { System.out.println('C'); } Zi(int x) { System.out.println('D'); } } class Demo { public static void main(String []args) { new Zi(6); } }
答案应该是输出:AD
因为在每个子类的构造函数的第一行里都会默认执行super(),以执行父类的构造函数。所以输出为AD,而并不是我们想象的BD。如果想要结果输出为BD,则需要我们在Zi类中的Zi(int x)构造函数里的第一行手工添加super(x);
如果父类没有无参数的构数函数,则子类的构造函数中必须有super函数来明确要调用父类中的哪个构造函数。
class Fu { Fu() { super(); show(); return; } void show() { System.out.println("Fu show"); } } class Zi { int num=8; Zi() { super(); return ; } void show() { System.out.println("Zi show "+num); } } class Demo { public static void main(String [] args) { Zi z=new Zi(); z.show(); } }
上述代码执行的结果为:
Zi show 0
Zi show 8
很多人可能认为结果应该是:
Fu show
Zi show 8
问题的关键是在执行到父类的无参构造函数时,show()调用的时子类的函数,应为此时this为当前的对象,即子类对象。
子类中的属性变量在生成类时被赋予默认值,在执行完父类的无参构造函数时,再被赋予初始值。
一个对象实例化过程:
Person p=new Person();
1.JVM会读取指定的路径下(classpath)的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接父类的情况下);
2.在堆内存中开辟空间,分配地址。
3.在堆内存的对象空间中,对对象中的属性进行默认初始化。
4.调用对应的构造函数进行初始化。
5.在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6.父类初始化完毕后,再对子类的属性时行显示初始化。
7.再进行子类构造函数的特定初始化。
8.初始化完毕后,将地址值赋值给引用变量。
final关键字
1.final是一个修饰符,可以修饰类、方法、变量。
2.final修饰的类不可以被继承。
3.final修饰的方法不可以被覆盖。
4.final修饰的变量是一个常量,只能被赋值一次。
5. final使用时必须显式初始化,常量所有字母一般都大写,多个单词中间用下划线连接。