Java继承

面向对象的多态性

在面向对象设计中多态性描述的是同一结构在执行时会根据不同的形式展现出不同的效果, 在Java中多态性可以分为两种展示方式.

方法的多态性

方法的重载: 同一个方法可以根据传入的参数类型或个数的不同实现不同功能。

方法的覆写:同一个方法可以根据实现子类的不同有不同的实现。

方法重载与覆写的区别
No.区别重载覆写
1英文OverloadingOverriding
2定义方法名称相同,参数的类型及个数不同方法名称、参数的类型及个数、返回值类型完全相同
3权限没有权限要求被子类所覆写的方法不能拥有比父类更严格的访问控制权限
4范围发生在一个类中发生在继承关系类中
方法重载方法覆写
class Message{
    public void print(){
        //方法重载
        System.out.println("it is message");
    }
    public void print(String str){
        //方法重载
        System.out.println("str");
    }
}

 

class Message{
    public void print(){
        System.out.println("basic message");
    }
}

class DataBaseMessage extends Message{
    public void print(){
        System.out.println("database message");
    }
}

class NetworkMessage extends Message{
    public void print(){
        System.out.println("network message");
    }
}

 

对象的多态性

对象向上转型: 父类 父类实例 = 子类实例, 自动完成转换

对象向下转型: 子类 子类实例= (子类) 父类实例,强制完成转换

对象向上转换

class Message{
    public void print(){
        System.out.println("basic message");
    }
}

class DatabaseMessage extends Messge{
    public void print(){
        System.out.println("database message");
    }
}

class NetworkMessage extends Message{
    public void print(){
        System.out.println("network message");
    }
}

class Channel{
    public static void send(Message mes){
        msg.print();
    } 
}

public class Javaxiangshang{
    public static void main(String args[]){
        Message msgA = new DatabaseMessage();
        msgA.print();
        Message msagB = new NetworkMessage();
        msgB.print();
        Channel.send(new DatabaseMessage());
        Channel.send(new NetworkMessage());
    }
}

//程序输出结果
//database message
//network message
//database message
//network message

在这个例子中,使用子类对父类对象进行实例化,由于print()方法已经被子类所覆写,所以最后调用的方法就是被实例化的子类所覆写的方法.对象向上转型的最大特点是可以通过父类对象自动接收子类实例, 在实际开发中可以通过这个原理实现方法接收或返回参数类型的统一。一旦发生对象的向上转型,那么父类可以使用的方法只能是本类或其父类定义的方法,是无法直接调用子类扩充方法的。

对象向下转型

子类继承父类之后可以对父类的功能进行扩充,有两种方法,一种是对已有方法进行覆写,还有一种是子类定义自己的新方法。对于子类扩充的方法只有子类实例才可以调用。在这种情况下,如果子类已经发生向上转型后就需要强制向下转型来实现子类方法的调用。

class Person{
    public void run(){
        System.out.print("human need to run.");
    }
}

class Student extends Person{
    public void learn(){
        System.out.print("student needs to learn");
    }
    public void read(){
        System.out.print("student needs to read");
    }
}

public class Javaxiagnxiazhuanxing{
    public static void main(String args[]){
        Person per = new Student();
        per.run();
        if (per instanceof Student){
            Student stu = (Student) per;
            stu.learn();
            stu.read();
        }esle{
            System.out.println("class cast exception");
        }
    }
}

//human need to run.
//student needs to learn
//student needs to read

在对象向下转型中,父类实例是不可能强制转换为任意子类实例,必须先通过子类实例化,利用向上转型让父类对象与具体子类实例发生联系后才可以向下转型,否则就会出现ClassCastException异常.

所有的类均继承自object类,所有的引用数据类型都可以向Object类进行向上转型,利用Object可以实现方法接收参数或返回数据类型的统一.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值