文章目录 5-3 四种访问权限修饰符 5-4 关键字:super super的概念 调用父类的构造器 this和super的区别 5-5 面向对象特征之三:多态性 多态性的概念 多态性应用举例 虚拟方法调用(Virtual Method Invocation) 多态小结 instanceof 操作符 对象类型转换 (Casting )
5-3 四种访问权限修饰符
Java权限修饰符public、protected、 (缺省)、 private置于类的成员定义前,用来限定对象对该类成员的访问权限。 对于class的权限修饰只可以用public和default(缺省)。 public类可以在任意地方被访问。 default类只可以被同一个包内部的类访问。
修饰符 内部类 同一个包 不同包的子类 同一个工程 private yes 缺省 yes yes protected yes yes yes public yes yes yes yes
5-4 关键字:super
super的概念
在Java类中使用super来调用父类中的指定操作: super可用于访问父类中定义的属性 super可用于调用父类中定义的成员方法 super可用于在子类构造器中调用父类的构造器 注意: 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员 super的追溯不仅限于直接父类 super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
调用父类的构造器
子类中所有的构造器默认 都会访问父类中空参数 的构造器 当父类中没有空参数的构造器时,子类的构造器必须通过**this(参数列表)或者 super(参数列表)**语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
this和super的区别
NO 区别点 this super 1 访问属性 访问本类中的属性,如果本类没有此属性则从父类中继续查找 直接访问父类中的属性 2 调用方法 访问本类中的方法,如果本类没有此方法则从父类中继续查找 直接访问父类中的方法 3 调用构造器 调用本类构造器,必须放在构造器的首行 调用父类构造器,必须放在子类构造器的首行
5-5 面向对象特征之三:多态性
多态性的概念
多态性,是面向对象中最重要的概念,在Java中的体现,对象的多态性:父类的引用指向子类的对象 可以直接应用在抽象类和接口上 Java引用变量有两个类型:编译时类型 和运行时类型 。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边。 若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism) 多态情况下, “看左边”:看的是父类的引用(父类中不具备子类特有的方法)“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法) 对象的多态 —在Java中,子类的对象可以替代父类的对象使用 一个变量只能有一种确定的数据类型 一个引用类型变量可能指向(引用)多种不同类型的对象
Person p = new Student ( ) ;
Object o = new Person ( ) ;
o = new Student ( ) ;
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型(upcasting)。 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法
Student m = new Student ( ) ;
m. school = “pku”;
Person e = new Student ( ) ;
e. school = “pku”;
多态性应用举例
方法声明的形参类型为父类 类型,可以使用子类的对象 作为实参调用该方法
public class Test { public void method ( Person e) { e. getInfo ( ) ; } public static void main ( Stirng args[ ] ) { Test t = new Test ( ) ; Student m = new Student ( ) ; t. method ( m) ; }
}
虚拟方法调用(Virtual Method Invocation)
Person e = new Person ( ) ;
e. getInfo ( ) ;
Student e = new Student ( ) ;
e. getInfo ( ) ;
虚拟方法调用(多态情况下) 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
Person e = new Student ( ) ;
e. getInfo ( ) ;
编译时类型和运行时类型 编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类 的getInfo()方法。——动态绑定
多态小结
多态作用:提高了代码的通用性,常称作接口重用 前提: 需要存在继承或者实现关系 有方法的重写 成员方法: 编译时:要查看引用变量所声明的类中是否有所调用的方法。 运行时:调用实际new的对象所属的类中的重写方法。 成员变量:不具备多态性,只看引用变量所声明的类。
instanceof 操作符
x instanceof A:检验x是否为类A的对象,返回值为boolean型。 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。 如果x属于类A的子类B,x instanceof A值也为true。
对象类型转换 (Casting )
基本数据类型的Casting: 自动类型转换:小的数据类型可以自动转换成大的数据类型 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型 对Java对象的强制类型转换称为造型 从子类到父类的类型转换可以自动进行 从父类到子类的类型转换必须通过造型(强制类型转换)实现 无继承关系的引用类型间的转换是非法的 在造型前可以使用instanceof操作符测试一个对象的类型