/*
*成员变量
*编译看左边(父类),运行看左边(父类)
*/classDemo2_Polymorphic{publicstaticvoidmain(String[] args){
Father f =newSon();//父类引用指向子类对象;
System.out.println(f.num);
Son s =newSon();
System.out.println(s.num);}}classFather{int num =10;}classSonextendsFather{int num =20;}
多态中的访问特点之成员方法
/*
成员方法
编译看左边(父类),运行看右边(子类)(动态绑定)
*/classDemo2_Polymorphic{publicstaticvoidmain(String[] args){/*Father f = new Son(); //父类引用指向子类对象;
System.out.println(f.num);
Son s = new Son();
System.out.println(s.num); */
Father f =newSon();
f.print();}}classFather{int num =10;publicvoid print (){
System.out.println("father");}}classSonextendsFather{int num =20;publicvoid print (){
System.out.println("son");}}
classDemo3_SuperMan{publicstaticvoidmain(String[] args){
Person p =newSuperMan();//父类引用指向子类对象//父类引用指向子类对象,就是向上转型
System.out.println(p.name);//体现父类属性;
p.business();//调用子类方法
SuperMan s =(SuperMan)p ;//向下转型
s.fly();/*
基本数据类型自动类型提升和强制类型转换
int i = 10;
byte b = 20;
i = b; //自动类型转换
b = (byte)i; //强制类型转换
*/}}classPerson{
String name ="John";publicvoidbusiness(){
System.out.println("谈生意");}}classSuperManextendsPerson{
String name ="superman";publicvoidbusiness(){
System.out.println("谈几个亿的大单");}publicvoidfly(){
System.out.println("飞出去救人");}}
多态的好处和弊端
/*A:多态的好处
a:提高了代码的维护性(继承保证);
b:提高了代码的扩展性(由多态保证);
B:多态的弊端
*不能使用子类特有的属性和行为;
C:案例演示*/classDemo4_Animal{publicstaticvoidmain(String[] args){method(newCat());method(newDog());}
Animal a =newCat();//开发的时候很少在创建对象的时候用父类引用指向子类对象,直接创建子类对象更方便,可以使用子类中的特有属性/*public static void method(Cat c){
c.eat() ;
}
public static void method(Dog d){
d.eat() ;
*///若果把狗强制转换成猫就会出现类型转换异常, ClassCastException: Dog cannot be cast to Catpublicstaticvoidmethod(Animal a){//当做参数的时候用多态,因为扩展性强/*Cat c = (Cat)a;
c.eat();
c.catchMouse();
*///关键字 instanceof 判断前边的引用是否是后边的数据类型if(a instanceofCat){
Cat c =(Cat)a;
c.eat();
c.catchMouse();}elseif(a instanceofDog){
Dog d =(Dog)a;
d.eat();
d.watchDog();}else{
a.eat();}}}classAnimal{publicvoideat(){
System.out.println("动物吃饭");}}classCatextendsAnimal{publicvoideat(){
System.out.println("猫吃鱼");}publicvoidcatchMouse(){
System.out.println("抓老鼠");}}classDogextendsAnimal{publicvoideat(){
System.out.println("狗吃肉");}publicvoidwatchDog(){
System.out.println("看家护院");}}
多态案例演示
classTest1_Polymorphic{publicstaticvoidmain(String[] args){
Fu f =newZi();//f.method();
Zi z =(Zi)f;
z.method();
f.show();}}classFu{publicvoidshow(){
System.out.println("fu show");}}classZiextendsFu{publicvoidshow(){
System.out.println("Zi show");}publicvoidmethod(){
System.out.println("Zi method");}}
classTest2_Polymorphic{publicstaticvoidmain(String[] args){
A a =newB();
a.show();
B b =newC();
b.show();}}classA{publicvoidshow(){show2();}publicvoidshow2(){
System.out.println("我");}}classBextendsA{publicvoidshow2(){
System.out.println("爱");}}classCextendsB{publicvoidshow(){super.show();}publicvoidshow2(){
System.out.println("你");}}
抽象类
抽象类的概述及其特点
A:抽象类概述:*抽象就是看不懂的;
B:抽象类特点:*a:抽象类和抽象方法必须用abstract关键字修饰;*abstractclass 类名{}*publicabstractvoideat();*b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者接口;*c:抽象类如何实例化:*按照多态的方式,用具体的子类实例化,其实这也是多态的一种,抽象类多态
*d:抽象类的子类
*要么是抽象类
*要么重写抽象类中所有抽象方法;
C:案例演示
*抽象类特点
classDemo1_Abstract{publicstaticvoidmain(String[] args){//Animal a = new Animal(); //错误: Animal是抽象的; 无法实例化
Animal a =newCat();
a.eat();}}abstractclassAnimal{//抽象类publicabstractvoideat();//抽象方法}classCatextendsAnimal{/*public void eat(){
System.out.println("猫吃鱼");
}*/}