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来定义重写方法。当父类中的方法是私有权限时,子类压根就不知道这个方法的存在更何谈对它进行拓展!