1、当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run()方法,其中super.run()不必放在第一行语句,因此此时父类对象已经构造完毕,先调用父类的run()方法还是先调用子类run()方法是根据程序的逻辑决定的。(子类调用父类中的方法,可以使用super.方法名(参数)的格式。)
2、在定义一个类时,如果没有显示指定该类的父类,那么该类就会继承于java.lang.object类(jdk提供的一个类,object类是java中所有类的直接或者间接父类)。object类是最顶层的类,根类。
3、多态(polymorphism):我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类型的对象。
4、父类型的引用可以指向子类型的对象。
5、 当使用多态方式调用方法时,首先检查父类中是否有调用的方法,如果没有则编译错误;如果有,再去调用子类的该方法。
如:parent p = new Child(); 当使用多态方式调用方法时,首先检查父类中是否有sing()方法,如果没有则编译错误;如果有,再去调用子类的sing()方法。
编译的出错信息:
6、关于强制类型转换, 一共有两种类型的强制类型转换:
A) 向上类型转换(upcast):比如说将Cat类型转换为animal类型,即将子类型转换为父类型。对于向上类型转换,不需要显式指定。
B) 向下类型转换(downcast):比如将animal类型转换为cat类型。即将父类型转换为子类型,对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。不是什么父类型都可以向下转换的,要看这个父类型变量具体指向的是什么对象。
为什么要使用向下类型转换?为了使用子类中特有的方法和属性,按照继承,父类中有的子类中一定有,子类中可以增加新的和修改原有的,而如果使用父类型指向一个子类型对象,就不能使用子类中的新增方法等。
public
class PolyTest3 { public static
void main(String[] args)
{ /* Animal animal = new Cat(); Animal animal2 = new Animal(); animal2 =animal; //animal和animal2都是Animal类型变量,同种变量类型可以相互赋值 //animal2由原来的指向Animal对象改为指向Cat对象 animal2.run(); //打印结果为cat is run */ /* Animal animal = new Cat(); Animal animal2 = new Animal(); animal =animal2; //animal和animal2都是Animal类型变量,同种变量类型可以相互赋值 //animal由原来的指向Cat对象改为指向Animal对象 animal.run(); //打印结果为animal is run */ Cat cat = new Cat(); Animal animal = cat; //animal和cat是不同类型的类型变量,将Cat类型变量赋值给Animal类型变量 //animal指向Cat对象,父类型变量指向子类型对象 animal.run(); //打印结果为子类型方法结果:cat is run /* Animal animal = new Animal(); Cat cat = (Cat)animal; //编译通过,运行错误, */ //向上类型转换 Cat cat = new
Cat(); Animal animal = (Animal)cat; //这里(Animal)cat是向上类型转换,可以不显示转换直接写cat animal.run(); //向下类型转换 Animal a = new
Cat(); //Cat cat =a;这样写不行,这样写就是说父类就是子类 Cat c =(Cat)a; c.run(); } } class
Animal { public void
run() { System.out.println( "animal is run" ); } } class
dog extends Animal { public void
run() { System.out.println( "dog is run" ); } } class
Cat extends Animal { public void
run() { System.out.println( "cat is run" ); } } |
在参数传递中使用的非常多,如定义一个方法
public void run(Animal animal)
{
}
传递参数时
Cat cat = new Cat();
.run(cat);