Java多态与向上转型

文章讨论了Java编程中的关键概念,包括所有类继承自Object类及其toString方法的用途;对象的相等比较(==与.equals)的区别;访问修饰符(如private,default,protected)的作用和范围;类之间的组合关系;以及多态的实现、意义和价值,特别是方法重写的原则和注解@Overrride的使用。
摘要由CSDN通过智能技术生成

1、在Java中所有类都默认继承自Object类(所有Java类的父类,不需要extends)

(1)因为所有类默认继承自Object类,则Object中的方法所有类都有
①Object类的toString方法实现∶

public String toString() {
    return getClass().getName() + "@” + Integer.toHexString(hashCode());
}

        · 将任意对象传入println方法默认就会调用该对象的toString方法进行输出打印!
        · 既然所有类的对象都具备这个toString方法,就可以在当前类中自定义toString方法来实现一些个性化的输出,此时当使用println时候就可以输出自己想要的

 

2、相等比较(== 与 .equals)

①在Java中,"=="操作符比较的是两个变量的保存的数值是否相等,对于基本类型来说,比较保存的数值是否一样,对于引用数据类型来说,比较保存的地址值是否一样,就是看这两个引用是否指向相同的对象
②同一个类的不同对象之间,要想判断内部的属性值是否一致,调用equals方法

3、关于访问修饰符

(1)protected修饰符的可见性
private(当前类的内部可见) < default(当前包(同级目录)的不同类之间可见) < protected
(2)protected 在有继承关系的类之间,子类可以访问父类中protected修饰的属性或方法(子类和父类可以在不同包之中!!)
(3)所有protected修饰的属性,只有在子类的{}内部可见。出了子类{},即便通过子类对象,也不能访问protected权限内容!(B类继承了A类的protected name,B类中可访问name,但实例化B类有了对象x,x不可以访问name)
(4)当一个属性在类中被protected修饰符修饰,这个属性在同一个包中的不同类(没有继承关系的)仍然可见!!!

 

4、类和类之间除了继承关系之外,还有组合(包含)关系

public class aaa {
    public static void main(String[] args) {
        Z z = new Z();
        z.x.name = "HaHaHa";
        System.out.println(z.x.name); //可以正常输出
    }
}

class X {
    String name;
}

class Y {
    String name;
}

class Z {
    X x = new X() ;
    Y y = new Y();
}

5、多态

        简而言之,相同的行为/方法,通过不同对象来使用时,展现出不同的状态,这样的一种特性称为多态性。
(1)在Java中实现多态要同时满足以下三个条件:
        ①多态的实现依赖于继承,必须在继承体系下实现多态
        ②子类中必须要对父类中的方法进行重写(覆盖,类似toString方法)
        ③必须通过父类的引用来调用这些重写方法
(2)动态绑定:
        在定义fun时,形参为Animal的引用,至于到底会有哪个子类对象传入该方法定义fun这一刻不知道的

(4)多态的意义与价值:最高的参数统一化!
(5)多态的表现形式:必须通过父类的引用来调用这些重写方法
(6)引用和产生对象的向上转型关系:
①语法:父类名称 父类引用 = new 子类名称();

Animal animal = new Dog();

②再通过这个父类引用调用方法时,到底调用的是谁?
        看new在哪,只要new的子类覆写了调用的方法,则调用的一定是这个子类覆写后的方法!
③向上转型(动态绑定)的价值:参数统一化,让代码的实现更加灵活,以最低的成本来拓展新的子类与功能,方便进行子类的拓展(功能拓展)。参数的统一化只要参数是父类的引用,可以接收所有的子类对象!
(7)总结
        ①父类名称 父类引用 = new 子类对象();
        ②父类引用.方法名称() 到底调用的是子类还是父类中的方法?
        只要子类正确覆写了这个方法,则调用的一定是子类覆写后的方法,只有当子类没有进行该方法覆写时,才会调用父类中的方法

6、关于方法重写(override) :

(1)定义:发生在有继承关系的类之间,子类定义了和父类除了方法权限不同以外,其他完全相同的方法,子类的方法就称为重写方法
(2)关于重写方法的权限∶
        要求子类权限必须 >= 父类权限,才能正确重写(其中private不包含在内)
(3)举例

Dog dog = new Dog();
dog.eat();//则调用的是重写后的eat方法

(4)在方法上使用@Override注解检查当前定义的方法是否正确覆写了父类中的相同方法
(5)方法重写不能使用private来定义重写方法。当父类中的方法是私有权限时,子类压根就不知道这个方法的存在更何谈对它进行拓展!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值