(四)面向对象:
5、继承:
(1)理解:
概念:
继承是面向对象的三大特征之一
继承是类与类之间关系的一种(是父类与子类的关系)
使用场景:
一个类与另一个类之间存在is a 的关系,这两个类他们有相似的属性和行为,那这个类就可以继承另一个类。
eg:例如,蛇继承了爬行动物,爬行动物继承了动物,我们就可以描述:蛇 is a 爬行动物,爬行动物是动物中的一种。
使用带来的优点:
①提高代码的复用性,子类继承父类后,可以直接使用父类中非私有的属性与方法
②提高了代码的可维护性,只要修改父类,子类就可以全部生效
③提高了代码的可拓展性,子类继承父类,在子类中定义自己特有的方法,拓展功能
④是多态的前提
缺点:
①继承让代码与代码之间有了关系,耦合度上升
②父亲修改后,子类不得不跟着变化,削弱了子类的独立性,降低了代码的灵活性
(2)继承的实现与特点:
实现:
①使用extends关键字
②格式:[ public ] class 子类名 extends 父类名{
}
③相关名词:父类又称基类,超类;子类又称泛生类。
案例展示:
//定义Person类,作为父类
class Person {private String name;public void setName(String name) {this.name = name;}public void sayHello() {System.out.println("hello~ I am " + name);}
}//定义Student类,作为子类继承Person
class Student extends Person {// 新增内容可以为空
}//测试类
public class Test{// 测试代码public static void main(String[] args) {// 实例化一个子类对象Student stu = new Student();// setName方法从父类中继承而来stu.setName("tom");// sayHello方法从父类中继承而来stu.sayHello();}
}
特点:
Java只支持单继承,不支持多继承。即一个类只能继承一个类,不能同时继承两个父类。
Java支持多层继承,即a类继承b类,b类继承c类。
如果一个类没有显式继承另外一个类,则默认继承Object类
补充:1、Java支持多实现,即一个类可以实现多个接口;
2、Object类(这里简单介绍方法的作用,至于具体用法,大家可以适当拓展)
clone():
有返回值,是Object类型
不会改变原对象
用处:创建该对象的一个副本,并返回
----------------------------------------------------------
equals():
有返回值,为boolean型
不会改变原对象
用处:用于判断两个对象是否相等,其实比较的是两个对象的引用地址值,想要对内容进行比较,需要重写方法
-----------------------------------------------------------
getClass():
有返回值,返回此对象的运行时类名
不会改变原对象
用处:返回对象的运行时类
-----------------------------------------------------------
hashCode():
有返回值,返回int型
不会改变原对象
用处:返回对象的哈希码,帮助在哈希表中快速定位对象的位置。默认实现是根据对象的引用地址计算哈希码
-----------------------------------------------------------
toString():
有返回值,为String类型
不会改变原对象
用处:返回对象的字符串表示形式,默认实现形式为:类名@哈希码的十六进制
注意事项:
子类只能继承父类所有的非私有的成员
(private不能直接使用子类,如果父类中有共有的方法控制这个属性,那子类可以控制。)
案例展示,增加理解:
父类Animal.java
//提供父类
public class Animal {//成员一个私有,一个公有private String color;public int age;//提供get|set方法public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getAge() {System.out.println("in Animal getAge() ...");return age;}public void setAge(int age) {this.age = age;}
}
子类Dog.java
//定义Dog子类 继承 Animal
public class Dog extends Animal {// 父类中的private成员,子类中不可以直接操作(无直接访问权限)// Animal: private String color;// 父类中的非private成员,子类中可以直接操作// Animal: public int age;// 子类新增属性private String name;// 子类新增get|set方法public void setName(String name) {this.name = name;}public String getName() {return name;}// 子类新增方法:输出子类对象所有属性(含新增属性、从父类继承)public void disp() {// 子类方法中 不能直接操作 父类private成员// System.out.println("继承 color: " + color); error// 子类方法中 可以间接操作(借助public的get|set) 父类private成员System.out.println("继承 color: " + getColor());// 子类方法中 可以直接操作 父类非private成员System.out.println("继承 age: " + age);System.out.print("新增:" + name);}
}
测试类:
public class Test0204_AccessMember {public static void main(String[] args) {Animal a = new Animal();a.setColor("black");a.setAge(3);a.show();System.out.println("------------");Dog d = new Dog();//子类对象调用从父类继承的public方法d.setColor("yellow");d.setAge(2);//子类对象调用新增的方法d.setName("虎子");d.disp();}
}
内存结构:
(3)super关键字:
定义:
与this相似,this表示自己;super表示父类,可以理解为父类对象的引用
变量访问优先级:
1. 先在子类局部范围中找局部变量
2. 再在子类新增的范围中查找
3. 最后从父类继承的成员范围中查找
(4)构造方法的继承:
用处:
子类对象初始化,要借助父类的构造方法,对父类部分成员进行初始化
注意:
子类构造方法使用前,会优先找到父类的构造方法调用,默认调用父类的无参构造,对父类继承部分成员进行初始化,父类初始化后,在调用子类的构造代码。
子类可以通过super(参数),显式调用父类的构造器,但注意必须放在构造方法中的第一行,注释除外,由于this()也要放在第一行,因此他们不能同时使用
显式调用父类的构造器后,就不会再默认调用父类的无参构造了
显式调用的父类的构造方法,父类中必须定义了
(5)静态成员(属性与方法)的继承:
子类可以继承父类的静态成员,但不能重写