多态
概念:事务的多种形态。
在java中的表现:
1)方法的重载(方法名相同,方法参数不同,包括参数的类型和个数都不同,叫做方法的重载):是同一个方法的多态。
2)多态字符类间的成员方法特点:java中所说的多态更多的指的就是对象的多态;具体说就是父类类型的引用或者接口类型的引用指向子类对象或者实现类对象;
多态子父类间成员属性的特点:
1)父类有的成员属性子类没有,对象.属性 使用的都是父类的;
2)父类没有的成员属性子类有,对象.属性 拿不到,报错
3)父类和子类中具有相同属性时,对象.属性 拿到的仍然是父类的;
总结:多态 对象.属性 拿到的始终是引用变量(引用对象)所属的父类的属性,因为引用的是父类的引用,所以始终是父类的;其次就是多态思想不是应用在成员属性上的;
多态子父类间成员方法发特点:
1)父类有的成员方法子类没有,对象.方法 使用父类的;
2)父类没有的成员方法即使子类有,对象.方法 也拿不到会报错;
3)子父类见出现相同方法时,对象.方法 使用的是子类覆盖继承自父类的方法;
多态所应用的地方:就是子父类间覆盖的方法的,父类引用所指向的是子类对象,那么就只需改变父类引用所指向子类对象,就能动态的改变所执行的子类覆盖父类的方法;
public class Demo1{
public static void main(String[] args){
//创建对象
A a = new C();
test(a);
}
public static void test(A a){
/*
多态的弊端:父类没有的成员如果子类有,对象.方法 是拿不到的会报错;
解决多态弊端:判断然后进行类型强转;
判断如果父类A的引用a指向子类对象属于C类对象,就将其强转回子类C类的对象,然后去调用C类对象自己的show2()方法;
*/
a.show3();//父类没有show3()
if(a instanceof B){
B b = (B)a;
b.show2();
}
if(a instanceof C){
C c = (C)a;
c.show3();
}
}
}
class A{
public void show1(){
System.out.println("A.....show1");
}
}
class B extends A{
public void show2(){
System.out.println("B....show2");
}
}
class C extends A{
public void show3(){
System.out.println("C....show3");
}
}
可以用继承的方式看方法和变量是否被继承
可以用多态的方式看方法是否被覆盖
多态就是应用在父类引用子类对象(覆盖方法)这方面的
/*
静态成员子父类间是否存在继承?
*/
public class Demo1
{
public static void main(String[] args)
{
B b = new B();
System.out.println(b.x);//10
b.show();//A..static..show()
System.out.println("-----------------------------------------");
System.out.println(A.x);//10
A.show();//A..static..show()
System.out.println("-----------------------------------------");
System.out.println(B.x);//10
B.show();//A..static..show()
System.out.println("-----------------------------------------");
/*
前三个可以看出,子父类间静态成员也存在继承,但是静态成员方法没有所谓的覆盖,
因为静态成员虽然能继承,但是是属于类而不是属于对象的
*/
//多态
A a = new B();
/*
从表面看调用的是父类引用a的show()方法,而是show()方法是静态,
是属于类的,所以其实调用的是A类的show()方法
*/
a.show();//A..static..show()
}
}
class A
{
//成员变量
public static int x = 10;
//成员方法
public static void show(){
System.out.println("A..static..show()");
}
}
class B extends A
{
//成员方法
public static void show(){
System.out.println("B..static..show()");
}
}