u父类声明,子类实例化的对象称为上转型对象。
u1.上转对象不能操作子类新增的成员变量,失掉了这部分属性,不能使用子类新增的方法,失掉了一些功能。
u2.上转型对象可以操作子类继承的成员变量,也可以使用子类继承的或重写的方法。
u3.如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。因为程序在运行时知道,这个上转对象的实例是子类创建的,只不过损失了一些功能而已。
u1.可以将上转型对象再强制转换为一个子类对象,此时对象又具备了子类所有属性和功能(即将上转型对象还原为子类对象)。
u2.不可以将父类创建的对象赋值给子类声明的对象。
ufinal关键字可以用来修饰类、方法和变量。
–1.final修饰的类不能被继承。
–2.final修饰的方法不能被重写。
3.final修饰的变量是常量,不能修改其值。
abstract class Parent {
abstract void grow();
}
class Son extends Parent {
void grow() {
System.out.println("我比父亲成长条件好");
}
void play() {
System.out.println("我会踢球");
}
}
public class Human {
public static void main(String[] args) {
//上转型,用父类的引用子类的对象
Parent p = new Son();
//调用父类中有的方法
p.grow();
//p.play();这里会报错,因为父类中没有play()方法
//对进行过上转型的对象,进行强制下转型
Son s = (Son) p;
//调用子类中的方法
s.play();
}
}
abstract class Parent {
abstract void grow();
}
class Son extends Parent {
void grow() {
System.out.println("我比父亲成长条件好一点:son");
}
void play() {
System.out.println("我会踢球");
}
}
class Daughter extends Parent {
void grow() {
System.out.println("我比父亲成长条件好很多:daughter");
}
void dance() {
System.out.println("我会跳舞");
}
}
public class Human {
public static void main(String[] args) {
Parent p = new Son();
show(p);
Parent p2 = new Daughter();
show(p2);
}
public static void show(Parent p) {
//现将父类中有的方法输出
p.grow();
//对进行过上转型的对象进行类型判断,然后进行相应的强制下转型
if (p instanceof Son) {
//判断是哪个类的上转型对象,然后进行下转型
Son s = (Son) p;
//调用子类中的方法
s.play();
} else if (p instanceof Daughter) {
Daughter d = (Daughter) p;
d.dance();
}
}
}