继承:
继承是两个类之间的一种关系。当一个类B继承了一个已经存在的类A后,类B就拥有了类A所有的非private属性和方法,同时类B还可以根据自己的需要添加新的属性和方法。继承是is-a关系。
子类不能继承父类的构造方法,但可以通过super关键字来调用
因为子类没有继承父类的private方法所以,要使用set和get方法来获得父类的private属性
注意:子类对象在实例化的时候会先调用父类的构造方法,再调用自身的构造方法,所以在实例化子类的时候需要先将父类的属性初始化。
提示:子类的构造方法中隐含了一个super()语句。
this和super
主要作用:
1、使用this调用奔雷中的属性
2、使用this调用构造方法
3、this标示当前对象
1、在子类中使用super调用父类的成员属性和方法
2、在子类的构造方法中,使用super调用父类的某个特定构造方法。
提示:由于this标示的是当前实例的引用。因此只能在实例方法中使用,而不能在静态方法中使用。
super关键字可以在子类中引用父类的属性、方法和构造方法,主要应用形式有以下几种:
1、在子类中调用父类的属性和方法
如果在子类中隐藏了父类的属性以及重写了父类的方法,那么需要在子类中调用父类被覆盖的属性或方法时则不能直接调用了,这时候需要使用super关键字
2、在子类中调用父类的构造方法
在子类对象实例化时,必须调用父类的构造方法,但是 子类不能继承父类的构造方法,因此要调用父类的构造方法,必须在子类的构造方法首行使用super()。使用super可以在子类构造方法内部根据自身需要调用父类的构造方法
提示:在子类的构造方法内部会自动调用父类中默认的构造方法。但是如果父类中没有默认的构造方法时,则必须手动进行调用。
小问题:
请简述对象中的成员变量初始化的步骤?
一、父类静态成员和静态初始化块,按在代码中出现的顺序依次执行
二、子类静态成员和静态初始化块,按在代码中出现的顺序依次执行
三、父类实例成员和实例初始化块,按在代码中出现的顺序依次执行
四、执行父类构造方法。
五、子类实例成员和实例初始化块,按在代码中出现的顺序依次执行
六、执行子类构造方法
3、转型
多态是面向对象技术中最灵活的机制,多态不但可以增加程序的可维护性,还可以提高代码的可读性。多态性是依赖继承性的,甚至说是多态性是继承性的发展。多态性分为对象方法的多态和对象类型的多态。
对象方法的多态:方法的重载和重写,记住重载要有不同,重写相同
对象类型的多态:在java中对象类型的多态可以分为向上转型和向下转型。
注意:向上转型——》子类对象到父类对象的类型转换。父类可以调用子类重写的方法,但是不能调用子类新增的方法。
注意:在进行对象的向下转换前,必须先对对象进行向上转换,否则会发生错误。
例子:
public class ThisTest01 { public static void main(String[] args) { Perso per = new Stu(); System.out.println("i1= "+per.i1+", i2= "+per.i2); per.tell(); per.staticTell(); Stu stu = (Stu)per; System.out.println("i1= "+stu.i1+", i2= "+stu.i2); stu.tell(); stu.staticTell(); } } class Perso { int i1 =1; static int i2 = 10; public void tell(){ System.out.println("父类的实例方法tell()Person"); } public static void staticTell(){ System.out.println("父类的静态实例方法staticTell()Person"); } } class Stu extends Perso{ int i1 =2; static int i2 =20; public void tell(){ System.out.println("子类的实例方法tell()Stu"); } public static void staticTell(){ System.out.println("子类的静态实例方法staticTell()Stu"); } }
运行结果:
子类重写父类的静态方法和子类重写父类的实例方法,这两者的区别在于运行时java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定;成员变量(包括静态变量和实例变量)与所属的类绑定
instanceof关键字
是属于java的二元运算符,其作用是判断某个对象是否属于某个类或接口类型,
对象名 instanceof 类名 返回的是boolean