Java——类的继承
前言
我不知道在别人看来,我是什么样的人;但在我自己看来,我不过就象是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展现在我面前的浩瀚的真理的海洋,却全然没有发现。
—— 牛顿
1.什么是继承?
- 在程序中,继承描述的是事物之间的所属关系,通过继承可以是多种事物之间形成一种关联系。
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好地建模。
- 继承关系的两个类,一个为子类(派生类),一个为父类(超类,基类)。子类继承父类,使用关键字extends来表示。
2.类继承的语法格式
[修饰符] class 子类名 extends 父类名{
//程序核心代码
}
3.类继承代码实例
package com.juebie01;
//定义Animal类
public class Animal {
String name;
public void shout(){
System.out.println("发出叫声");
}
}
package com.juebie01;
//Dog类继承Animal类
public class Dog extends Animal{
//定义一个打印name的方法
public void printName(){
System.out.println("Name : " + name);
}
public void eat() {
System.out.println("狗吃骨头");
}
}
package com.juebie01;
//定义一个测试类
public class Tset {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "旺财";
dog.printName();
dog.eat();
dog.shout();
}
}
运行结果:
name : 旺财
狗吃骨头
发出叫声
4.类继承的注意事项
(1)exdends 的意思是“扩展”,子类是父类的扩展。
(2)继承是两个类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等。
(3)在Java中,类只支持单继承,不允许多重继承(例如:一个儿子只能由有一个父类,一个父类可以有多个儿子)。
class A{}
class B extends A{}
class C extends A{}//类B和类C都可以继承类A
(4)在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类。
class C{}
class C extends B{}//类C继承类B,即类B是类C的父类,同时类B是类A的子类
class B extends A{}//类B继承类A,即类A是类B的父类。
(5)在java中所有的类都默认直接或者间接继承Object类(在IDEA中:用快捷键CTRL+H来查看类的继承关系)
5.super关键字
(1)作用
用来访问父类的成员。
(2)格式即实例
①使用super关键字访问父类的成员变量和成员方法,具体格式:
super.成员变量;
super.成员方法([参数1,参数2...]);
②使用super关键字访问父类的构造方法,具体格式:
super([参数1,参数2...])
③代码实例:
package com.juebie01;
//定义父类Animal类
public class Animal {
String name;
//无参构造
public Animal(){
}
//有参构造
public Animal(String name) {
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat() {
System.out.println("吃饭");
}
}
package com.juebie01;
/*定义一个子类Cat类
*Cat类继承animal类
*/
public class Cat extends Animal{
public Cat() {
super();//默认有的+
//子类在实例化会默认地去调用父类无参的构造方法
}
public Cat(String name) {
super(name);//访问父类的有参构造
}
public void eat() {
super.eat();
System.out.println("肥猫爱吃火腿");
}
@Override//
public String toString() {
return "Cat [Name = " + getName() + "]";
}
}
package com.juebie01;
/*
*super关键字
*/
//定义测试类
public class Test {
public static void main(String[] args) {
Cat c = new Cat("肥猫");
System.out.println(c);//当System.out.println打印一个对象的时候,会调用对象的toString()方法。(每个对象都会有toString方法)
c.eat();
}
}
运行结果:
Cat [Name = 肥猫]
吃饭
肥猫爱吃火腿
(3)super关键字和this关键字的区别
-
代表对象不同
this:本身调用者这个对象
super:代表父类的应用
-
提前
this:没有继承也可以使用
super:只能在继承条件下使用
-
构造方法
this(); 本类的构造
super(); 父类的构造
(4)super的注意事项
(1)super调用父类的构造方法,必须在构造方法的第一个
(2)super必须只能出现在子类的方法或者构造方法
(3)super和this不能同时调用构造方法(因为super和this两者都要出现在第一行)
6.Override(重写/覆盖)
(1)为什么要重写?
- 当父类提供的功能不满足子类具体的需求的时候,那么就需要对父类的方法进行重写
(2)定义
- 在继承关系中,子类会自动继承父类中的公共方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。
(3)用法及实例:
-
子类的方法和父类必须要一致,方法体要不同!
-
package com.juebie01; //定义Animal类 public class Animal { public void action(){ System.out.println("世间万物皆有灵性!"); } }
package com.juebie01; //Fish类继承Animal类 public class Fish extends Animal{ @Override//强制检测是否是重写 public void action(){ System.out.println("鱼戏莲叶间, 鱼戏莲叶东, 鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。"); } }
package com.juebie01; //定义一个测试类 public class Tset { public static void main(String[] args) { Fish fish = new Fish(); fish.action(); } }
运行结果:
鱼戏莲叶间, 鱼戏莲叶东, 鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。
(4)重写的注意事项
(1)必须是继承关系
(2)方法名必须相同
(3)参数列表必须相同
(4)重写父类成员时的修饰符:范围可以扩大(public > protected > defualt > private )
(5)抛出异常:范围可以被缩小,但不能扩大(Exception–>ClassNotFoundException)
7.类继承的好处和弊端
-
好处:
(1)提高了代码的复用性
(2)提高代码的维护性
-
弊端:
类和类之间的耦合性太强(程序设计中要追求的是:“高内聚,低耦合”。)