一. 多态
1.在Java中,多态体现在两个方面:由方法重载实现的静态多态性(静态多态)和方法重写实现的动态多态性(运行时多态)
2.多态的体现:父类的引用指向了子类对象,父类的引用也可以接收自己的子类对象。
3.多态的前提:类与类之间要么继承,要么实现,同时存在一个前提:重写。
4.多态的弊端:只能使用父类的引用访问父类成员。
5.多态的特点:
Anima a=new cat();
在多态中,非静态成员函数,成员函数在多态调用时,编译看左边,运行看右边。
在多态中,静态成员函数,无论编译和运行,都看左边。
在多态中,成员变量的特点,无论编译和运行,都参考左边。
案例说明:
A类:
public class A {
static int k=8;
int m=8;
public void liu(){
System.out.println("我是A");
}
public static void fang(){
System.out.println("我是A fang");
}
}
B类:
public class B extends A
{
static int k=3;
int m=5;
public void liu(){
System.out.println("我是B liu");
}
public void jian(){
System.out.println("我是 b jian");
}
public static void fang(){
System.out.println("我是 b fang");
}
}
Test类:
public class Test {
public static void main(String args[]){
A a=new B();
System.out.println("m:"+a.m+"===k:"+a.k);
B b=new B();
System.out.println("m:"+b.m+"===k:"+b.k);
}
}
结果为:
m:8===k:8
m:5===k:3
结论为:在多态中,成员变量(静态或者非静态)的特点,无论编译和运行,都参考左边。
Test类:
public class Test {
public static void main(String args[]){
A a=new B();
System.out.println("liu():");
a.liu();//liu为非静态成员函数,显示右边,即子类的函数
System.out.println("=======");
a.fang();//fang为静态成员函数,显示左边,即父类中的函数
System.out.println("=======");
//a.jian();//报错,jian方法没有在A中定义。
B b=new B();
b.jian();
System.out.println("bijiao:"+a+"===="+b);
}
}
结果为:
liu():
我是B liu
=======
我是A fang
=======
我是 b jian
bijiao:com.stylefeng.guns.modular.handler.B@2a3046da====com.stylefeng.guns.modular.handler.B@2a098129
Process finished with exit code 0
结论为:liu()方法为非静态成员函数,fang()为静态成员函数,
在多态中,非静态成员函数,成员函数在多态调用时,编译看左边,运行看右边。看a.liu()
在多态中,静态成员函数,无论编译和运行,都看左边。看a.fang()
A a=new B();a的hash值和 B b=new B();的b的hash值时不同的,不是同一个对象。
二 子类和父类的变量获取
父类: public class Fu { int m=4; }
子类:
public class Zi extends Fu {int m=5; public void show(){ System.out.println("父类:"+super.m+"子类:"+this.m); } }
调用:
public class Test { public static void main(String args[]){ Zi z=new Zi(); z.show(); } }
结果:
父类:4子类:5
Process finished with exit code 0
结论:
子、父类中的变量:1.如果子类出现与父类相同名字的非私有变量,子类要访问本类的变量用this,子类要访问父类中的变量用super。