JAVA基础——多态

目录

一、多态的定义以及存在条件

1.1 多态的定义

 例如:手机分为智能机和老人机,老人机得按键拨号,而智能机可以语言控制拨号

 ​编辑多态就是多种形态,对象在不同条件下表现出不同形式

1.2 多态的存在条件 

继承:多态性要求存在继承关系,即子类继承父类。

方法重写:子类需要重写父类中的方法,即在子类中提供一个具有相同方法名、参数列表和返回类型的新实现。

接口实现:接口也可以实现多态,当一个类实现了一个或多个接口,并提供了接口中声明的方法的具体实现时,可以通过接口引用调用实现类的方法。

抽象类和抽象方法:抽象类不能被实例化,但可以作为其他类的基类,抽象方法必须在子类中被重写。

1.3 多态的格式 

方法重写:子类重写父类的方法时,方法名、参数列表和返回类型必须与父类中的方法完全一致。

向上转型:将子类对象赋值给父类引用,这是实现多态的基础。

1.4  多态中成员特点

多态成员变量

父类Animal 

子类Pig,继承Animal

测试类:

多态成员方法

父类Animal 

子类Pig,继承Animal,并且对Animal中eat()方法进行重写

测试类:

1.5 多态特点

父类Animal 

子类Pig

测试类:

1.6 练习 

创建了A、B、C、D四个类

B继承A 

C继承B

D继承B 

 请写出下面代码的运行结果

答案:


一、多态的定义以及存在条件

1.1 多态的定义

多态是什么?

  1.   多态是同一个行为具有不同的表现形式或形态的能力
  2.   同一方法可以根据发送对象的不同而采用不同的行为方式

 例如:手机分为智能机和老人机,老人机得按键拨号,而智能机可以语言控制拨号

 
多态就是多种形态,对象在不同条件下表现出不同形式

1.2 多态的存在条件 

  1. 继承多态性要求存在继承关系,即子类继承父类。
  2. 方法重写:子类需要重写父类中的方法,即在子类中提供一个具有相同方法名、参数列表和返回类型的新实现。
  3. 接口实现:接口也可以实现多态,当一个类实现了一个或多个接口,并提供了接口中声明的方法的具体实现时,可以通过接口引用调用实现类的方法。
  4. 抽象类和抽象方法:抽象类不能被实例化,但可以作为其他类的基类,抽象方法必须在子类中被重写。

1.3 多态的格式 

方法重写:子类重写父类的方法时,方法名、参数列表和返回类型必须与父类中的方法完全一致。

class Parent {
    void show() {
        System.out.println("Parent's show()");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("Child's show()");
    }
}

向上转型:将子类对象赋值给父类引用,这是实现多态的基础。

Parent p = new Child(); 
p.show(); // 调用子类重写的方法
  1. 父类类型  变量名 = new 子类类型();
    代码中:Parent p = new Child(); 
  2. 然后通过 变量名.方法名()调用在子类中重写的方法
    代码中:p.show();

1.4  多态中成员特点
 

多态成员变量
 

父类Animal 
public class Animal {
    String name = "动物";
}
子类Pig,继承Animal
public class Pig extends Animal{
    String name = "猪";
}
测试类:
public class Test {
    public static void main(String[] args) {
        Animal pig = new Pig();
        System.out.println(pig.name);
    }
}

输出结果为:动物 


解释:Pig的引用类型是Animal,Pig是属于Animal类,Animal中变量的值是多少就通过对象就取得多少

多态成员方法

父类Animal 
public class Animal {
    
    public void eat(){
        System.out.println("动物吃饭");
    }
}
子类Pig,继承Animal,并且对Animal中eat()方法进行重写
public class Pig extends Animal{
    
    @Override
    public void eat(){
        System.out.println("猪吃饭");
    }
}
测试类:
public class Test {
    public static void main(String[] args) {
        Animal pig = new Pig();
        pig.eat();
    }
}

输出结果为:猪吃饭

Animal 为引用类型,pig为实际类型为Pig,pig.eat();调用的是重写之后的

1.5 多态特点

  1. 多态情况下,子类和父类存在同名的成员变量时,访问的时父类的成员变量
  2. 多态情况下,子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
  3. 多态情况下,子父类存在同名的静态成员变量成员方法时,访问的是父类的成员函数
  4. 多态情况下,不能访问子类独由的方法
父类Animal 
public class Animal {

    public void eat(){
        System.out.println("动物吃饭");
    }
    public void run(){
        System.out.println("动物奔跑");
    }
}
子类Pig
public class Pig extends Animal{
    public void play(){
        System.out.println("猪在玩");
    }
    @Override
    public void eat(){
        System.out.println("猪吃饭");
    }
}
测试类:
public class Test {
    public static void main(String[] args) {
        Animal pig = new Pig();
        pig.eat();
        pig.run();
        pig.play();
    }
}

我们在调用子类独有的方法是会发现爆红

所以对于子类独有的方法,父类无法访问。

1.6 练习 

创建了A、B、C、D四个类
public class A {
    public String show(D obj) {
        return ("A and D");
    }
    public String show(A obj) {
        return ("A and A");
    } 
}
B继承A 
public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}
C继承B
public class C extends B{
}
D继承B 
public class D extends B{
}
 请写出下面代码的运行结果
public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
    }
}
答案:
  1. A and A
  2. A and A
  3. A and D
  4. B and A
  5. B and A
  6. A and D
  7. B and A
  8. B and A
  9. A and D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值