目录
继承
先说说继承的概念,学过语言的都能明白就是子类继承父类的特征和行为。那什么叫做特征和行为呢,说白了就是子类可以使用跟父类相同的实例域或者方法。
还不懂的可以打个例子:
说白了,父类更通用,子类更具体
类的继承格式
class 父类 {
}
class 子类 extends 父类 {
}
注:我们为什么要选择继承而不是一个一个具体声明?
这里我们打个例子:
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 Penguin {
private String name; //同一类声明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 Penguin extends Penguin {
public Penguin(String myName, int myid) {
super(myName, myid);
}
}
继承类型
需要注意的是 Java 不支持多继承,但支持多重继承。
继承的特性
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。
extends
单一性,只能让子类继承一个父类
//父类
public class test{
private string name;
private int age;
public test(string name,int age){
}
public void sellp(){
}
}
//继承父类
public class ad extends test{
}
implements
多样性,子类能够继承多个父类
//父类A
public interface A {
public void eat();
public void sleep();
}
//父类B
public interface B {
public void show();
}
//子类
public class C implements A,B {
}
super&&this
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 返回值类型 方法名(){//方法体}
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。