一、对象的上转型对象
1.对象的上转型对象的实体是由子类负责创建的,但是上转型对象会失去原对象的一些属性和功能(上转型对象相当于子类对象的一个“简化”对象),上转型对象具有的属性和功能如下:
(1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性)和成员方法(失掉了这部分行为)。
(2)上转型对象可以操作子类继承或者隐藏的成员变量,也可以调用子类继承的实例方法或子类重写的实例方法。上转型对象操作子类继承或者隐藏的成员变量或子类重写的实例方法,其作用等价于子类对象去调用这些方法
关于对象的上转型对象,有以下四个注意事项
给出一个对象的上转型对象实例:
class LeiRenYuan{
void Speak(String str) {
System.out.println(str);
}
}
class People extends LeiRenYuan{
void Speak(String str) {
System.out.println("***"+str+"***");
}
void Cry(String str) {
System.out.println("+++"+str+"+++");
}
}
public class Test1 {
public static void main(String[] args) {
LeiRenYuan a=new LeiRenYuan();
People sun = new People();
a.Speak("hahaha");
a=sun;//将子类的引用放到父类对象中,这时就称a为sun的上转型对象
a.Speak("hahaha");//***hahaha*** 等同于 sun.speak("hahaha");
a.Cry("hahaha");//编译通不过,上转型对象不能操作子类新增的成员
People p = (People) a;
p.Cry("hohoho");
}
}
运行结果:
hahaha//这时a还不是一个上转型对象,调用的Speak是LeiRenYuan类的Speak
***hahaha***//这时a成了一个上转型对象,调用Speak是People类的Speak
+++hohoho+++//将a强制转换成为People类的一个对象,这时就可以调用People类中新增的方法Cry
可以看到,上转型对象调用子类重写的方法等同于子类对象调用这些方法,而且上转型对象不能操作子类新增的对象
二、继承与多态
多态性就是指父类的方法被某个子类重写的时候,可以各自产生自己的功能行为
三、abstract类和abstract方法(重在理解)
对于abstract方法,只允许声明,不允许实现(没有用方法体),而且不允许使用final和abstract同时修饰一个方法或类,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法
1.abstract类中可以有abstract方法,也可以有非abstract方法
非abstract类中不可以有abstract方法
2.abstract类不能用new运算符创建对象。如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不允许使用final和abstract同时修饰一个方法或者类的原因:必须能够重写
3.abstract类的子类
非abstract类是abstract类的子类,它必须重写父类的abstract方法,即去掉abstract方法的abstract修饰并给出具体的方法体。
abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法。
4.abstract类的对象作为上转型对象
可以用abstract类声明对象,尽管不能使用new运算符创建该对象,但该对象可以成为其子类的上转型对象,那么该对象就可以调用子类重写的方法。
5.理解abstract类
理解抽象类意义是最为重要的:
(1)抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必须要有的行为标准。
(2)抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准,给出具体的行为。
抽象类的具体实例:
abstract class Girl{ abstract void speak() ; abstract void cook(); } class ChineseGirl extends Girl{ void speak() { System.out.println("你真棒!"); } void cook() { System.out.println("面条!"); } } class Boy{ Girl girl; void setGirlrfiend(Girl girl) { this.girl=girl; } void showGirlfriend() { girl.speak(); girl.cook(); } } class AmericanGirl extends Girl{ void speak() { System.out.println("You are good!"); } void cook() { System.out.println("noodle!"); } } public class Test1{ public static void main(String[] args) { Boy b = new Boy(); Girl g=new ChineseGirl(); b.setGirlrfiend(g); b.showGirlfriend(); g=new AmericanGirl(); b.setGirlrfiend(g); b.showGirlfriend(); } }
你真棒!
面条!
You are good!
noodle!