Java继承(什么是继承)

继承

  • 背景
  • 基本语法
    • 继承改进
  • Proteced 关键字

背景

代码中创建的类, 主要是为了抽象现实中的一些事物(包含属性和方法).
有的时候客观事物之间就存在一些关联关系, 那么在表示成类和对象的时候也会存在一定的关联.
例如, 设计一个类表示动物
注意, 我们可以给每个类创建一个单独的 java 文件. 类名必须和 .java 文件名匹配(大小写敏感)
Java继承(什么是继承)_第1张图片

// Animal.java
public class Animal {
     
	public String name;
	public Animal(String name) {
     
		this.name = name;
	}
	public void eat() {
     
		System.out.println(this.name + "正在吃");
	}
}

//Dog,java
class Dog {
     
	public String name;
	public Dog (String name) {
     
		this.name = name;
	}
	public void eat() {
     
		System.out.println(this.name + "正在吃");
	}
	public void bark() {
     
		System.out.println(this.name + "正在汪汪汪");
	}
}

// Cat.java
class Cat {
     
	public String name;
	public Cat(String name) {
     
		this.name = name;
	}
	public void eat() {
     
		System.out.println(this.name + "正在吃");
	}
}

// Bird.java
class Bird {
     
	public String name;
	public Bird(String name) {
     
		this.name = name;
	}
	public void eat() {
     
		System.out.println(this.name + "正在吃");
	}
	public void fly() {
     
		System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
	}
}

这个代码我们发现其中存在了大量的冗余代码。
这三个类都具备一个相同的 eat 方法, 而且行为是完全一样的.
这三个类都具备一个相同的 name 属性, 而且意义是完全一样的
从逻辑上讲, Cat , Bird,Dog 都是一种 Animal (is - a 语义)

此时我们就可以让 Cat , Bird,Dog 分别继承 Animal 类, 来达到代码重用的效果.
此时, Animal 这样被继承的类, 我们称为 父类 , 基类 或 超类, 对于像 Cat , Bird,Dog 这样的类, 我们称为 子类, 派生类和现实中的儿子继承父亲的财产类似, 子类也会继承父类的字段和方法, 以达到代码重用的效果




基本语法

class 子类 extends 父类 {
     
}

使用 extends 指定父类.
Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承).
子类会继承父类的所有== public 字段方法==.
对于父类的== private 的字段和方法, 子类中是无法访问的.
子类的
实例==中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的 引用

继承改进

如果在继承的时候出现报错,那是因为子类继承父类的时候,父类具有构造方法,所以子类也需要构造方法。
在这里插入图片描述
Java继承(什么是继承)_第2张图片
Java继承(什么是继承)_第3张图片

class Animal {
     
	public String name;
	public Animal(String name) {
     
		this.name = name;
	}
	public void eat() {
     
		System.out.println(this.name + "正在吃");
	}
}

class Dog extends Animal {
     
	public Cat(String name) {
     
		// 使用 super 调用父类的构造方法.
		super(name);
	}
	public void bark() {
     
		System.out.println(this.name + "正在汪汪汪");
	}
}

class Cat extends Animal {
     
	public Cat(String name) {
     
		// 使用 super 调用父类的构造方法.
		super(name);
	}
}

class Bird extends Animal {
     
	public Bird(String name) {
     
		super(name);
	}
	public void fly() {
     
		System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
	}
}

public class Main {
     
    public static void main(String[] args) {
     
        Animal animal = new Animal("animal");
        Dog dog = new Dog("dog");
        Cat cat = new Cat("cat");
        Bird bird = new Bird("bird");
        animal.eat();
        dog.eat();
        dog.bark();//bark是dog独有的方法,所以不是所有的animal都会bark
        cat.eat();
        bird.eat();
        bird.fly();//fly也是bird的独有方法
    }
}
/*
	此时就少了很多冗余的代码,共同的属性只要写在父类里边就行啦
	而且父类的公共的(public)修饰的属性跟方法不能使用私有的private修饰
*/
//执行结果
animal正在吃
dog正在吃
dog正在汪汪汪
cat正在吃
bird正在吃
bird正在飞 ︿( ̄︶ ̄)︿

Proteced 关键字

刚才我们发现, 如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 “封装” 的初衷.
两全其美的办法就是 protected 关键字.
对于类的调用者来说, protected 修饰的字段和方法是不能访问的
对于类的 子类和 同一个包 的其他类 来说, protected 修饰的字段和方法是可以访问的
就像下图这样,子类是可以调用父类中用protected修饰的属性跟方法(同一个包内

Java继承(什么是继承)_第4张图片
Java继承(什么是继承)_第5张图片

你可能感兴趣的:(初学者,Java,idea,继承,面向对象编程)