Java继承概念
一、继承概念
继承是Java面向对象编程的一块基石,允许创建分等级层次的类。
继承就是子类对父类的特征和行为,使得子类对象或者实例具有父类实力域和方法,或者子类从父类继承方法,使得子类具有父类相同的行为。
生活中的继承
兔子和羊属于食草动物类,狮子和猎豹属于食肉动物类。
食草动物和食肉动物同属于动物类。
所以继承需要符合关系是:父类更通用,子类更加具体细节。
虽然食草动物或者食肉动物都是动物类,但是两者属性和行为有差别,所以子类还会具有父类的一般特性也会具有自身的特性。
类的继承格式
class father {
}
class Son extends father {
}
二、为什么需要继承
开发动物类,动物分别为企业和老鼠为例子,要求如下
- 企鹅:属性有姓名、id,方法有吃、睡觉、自我介绍。
- 老鼠:属性有姓名、id,方法有吃、睡觉、自我介绍。
//企鹅类
public class Penguin {
private String name;
private int id;
public Penguin(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
//老鼠类
public class Mouse {
private String name;
private int id;
public Mouse(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
这两段代码的问题就是,代码过于重复,不利于后期开发维护,把两部分的公共属性提取到一个动物父类中,如下:
//公共父类
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
这个animal就是一个父类,企鹅类和老鼠类继承这个父类,就可以拥有对应的属性和方法,并且减少了大量重复代码,维护性提高,代码更加简洁。
public class Penguin extends Animal {
public Penguin(String myName, int myid) {
super(myName, myid);
}
}
//老鼠类
public class Mouse extends Animal {
public Mouse(String myName, int myid) {
super(myName, myid);
}
}
继承类型:
需要注意的是,Java不支持多继承,可以支持多重继承,A继承B,B继承C,C继承D…
三、继承特征
- 子类拥有父类非private的属性和方法。
- 子类可以拥有自己的属性和方法,子类可以对父类进行拓展。
- 子类可以利用自己的方式实现父类的方法。
- Java的继承是单继承,但是可以多重继承,这有别于C++继承机制。C++继承机制概述
- 提高了代码的复用性、可维护性、让类和类之间产生联系,这是多态前提;缺点在于增加了类的耦合性,一个类的变化会影响到其他类、打破了封装性。
四、继承关键字extends&&super
可以利用extends和implement实现继承,而且所有类都是继承于java.lang.Object,若一个类没有继承两个关键字,则默认继承object。
extends关键字
Java中,继承是单一继承,也就是说一个类只能有一个一个父类,extends只可以实现继承一个类。
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
implement关键字
利用implement关键字可以变相的让Java具有多继承特征,使用范围是类继承接口的情况,可以同时继承多个接口,注意,接口和接口之间采用逗号,划分。
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
super和this关键字
- super关键字:可以利用super关键字实现对父类成员的访问,再来引用当前对象的父类。
- this关键字:指向自己的引用。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
final关键字
final可以用来修饰变量,包括属性、对象属性、局部变量和形参,方法包括类方法和对象方法以及类。
final含义是**“最终的”**。
使用final关键字声明类,就是把类定义为最终类,不能被继承,或者用于修饰方法,该方法不可以被子类重写:
- 声明类
final class 类名 { //类体 }
- 声明方法
修饰符 public private default protected final 返回值类型 方法名() { //方法体 }
注意:final定义的类,其中的属性和方法不是final。
五、构造器
子类不继承父类的构造器,只是调用(隐式或者显式),若父类构造器带有参数,则必须在子类构造器中显式通过super关键字调用父类构造器并搭配合适的参数列表。
若父类构造器无参,则子类构造器无需使用super调用父类构造器,系统会自动调用。
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
// SubClass 类继承
class SubClass extends SuperClass{
private int n;
SubClass(){ // 自动调用父类的无参数构造器
System.out.println("SubClass");
}
public SubClass(int n){
super(300); // 调用父类中带有参数的构造器
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
// SubClass2 类继承
class SubClass2 extends SuperClass{
private int n;
SubClass2(){
super(300); // 调用父类中带有参数的构造器
System.out.println("SubClass2");
}
public SubClass2(int n){ // 自动调用父类的无参数构造器
System.out.println("SubClass2(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
System.out.println("------SubClass 类继承------");
SubClass sc1 = new SubClass();
SubClass sc2 = new SubClass(100);
System.out.println("------SubClass2 类继承------");
SubClass2 sc3 = new SubClass2();
SubClass2 sc4 = new SubClass2(200);
}
}