继承和多态
一、继承
1.什么是继承
继承,就是一个子类可以继承父类中的字段等,相当于儿子和父亲的关系,儿子可以继承父亲的财产。
例如:
一只猫和一只狗两个不同的类,它们有共同点也有不同之处,如果在编写代码时将他们的共同点分别写在两个类中就会造成代码重复度太高,十分不方便,因此可以将它们的共同点放在一个动物类中作为它们的父类,而他们俩就是两个子类。
2.继承的语法
修饰符 + class + 子类 + extends + 父类{
//......
}
例如:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.getName("大黄");
dog.bark();
dog.eat();
Cat cat = new Cat();
cat.getName("咪咪");
cat.bark();
cat.eat();
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.getName("大黄");
dog.bark();
dog.eat();
Cat cat = new Cat();
cat.getName("咪咪");
cat.bark();
cat.eat();
}
}
public class Cat extends Animal {
public void bark(){
System.out.println(super.name+" 喵喵叫");
}
}
public class Dog extends Animal {
public void bark(){
System.out.println(super.name + " 汪汪叫");
}
}
-
子类会将父类中的成员变量或者成员方法继承到子类中;
-
子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同;
-
子类又叫派生类、继承类、扩展类;
-
父类又叫基类、超类。
3.父类成员访问
父类和子类如果不存在同名的成员变量时优先访问父类的成员;若是存在同名变量,则会优先访问子类的成员;如果子类和父类中都没有这个成员变量或方法,则会报错。
一般要访问父类的成员可以使用super来指定父类,this也可以使用,不过this既可以指父类又可以指子类。
注:
只能在非静态方法中使用;
在子类方法中,访问父类的成员;
4.子类构造方法
在创建子类的对象时,编译器会先调用父类的构造方法,在调用子类的构造方法,要调用父类的构造方法必须在子类中调用,如果只利用父类创建了一个对象,那么在执行时不会涉及子类的构造。
public class Test {
public static void main(String[] args) {
Animal animal = new Animal("hello",18,"black");
animal.getName("hehe");
animal.getAge(5);
animal.getColor("blue");
System.out.println(animal.name+" "+animal.age+" "+animal.color);
}
}
public class Animal {
public String name;
public int age;
public String color;
public Animal(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
System.out.println(this.name+" "+this.age+" "+this.color);
System.out.println("动物");
}
public void eat(){
System.out.println(name+"正在吃饭");
}
public void getName(String name){
this.name=name;
}
public void getAge(int age){
this.age=age;
}
public void getColor(String color){
this.color=color;
}
}
public class Cat extends Animal {
public Cat() {
super("hello",18,"black");
System.out.println("猫");
}
public void bark(){
System.out.println(super.name+" 喵喵叫");
}
}
父类和子类代码的规律:
父类静态代码块优先于子类静态代码块执行,且是最早执行
父类实例代码块和父类构造方法紧接着执行
子类的实例代码块和子类构造方法紧接着再执行
第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行
super和this关键字满足以下关系:
因此,在编写代码过程中一般都是用super特指父类成员,this特指本对象成员。
-
super和this只能用一个,因为他们都必须在第一行
5.继承方式
5.1继承方式举例
Java支持的继承方式只有三种:
-
单继承,也就是B继承A这一种;
-
多层继承,比如C继承B,B再继承A;
-
不同类继承同一类,这个就和上面dog和cat继承animal一样
值得注意的是,Java不支持多继承,多继承就是C同时继承A和B。
5.2final关键字
我们在写程序的时候用到继承时一般最多有3层继承,此时我们就可以使用final来阻止一直继承下去。
//修饰字段或变量表示常量(即不能修改)
final int a = 10;
a = 20;//编译出错
这里的final与C语言中的const关键字很像。
//final修饰类,表示这个类不能被继承
final public class Animal {
protected String name;
protected int age;
protected String color;
public Animal(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
System.out.println(this.name+" "+this.age+" "+this.color);
System.out.println("动物");
}
public void eat(){
System.out.println(name+"正在吃饭");
}
public void getName(String name){
this.name=name;
}
public void getAge(int age){
this.age=age;
}
public void getColor(String color){
this.color=color;
}
}
如果final修饰方法,那么表示这个方法不能被重写,重写就是在子类中重新定义了父类中的某一个具有相同参数、返回值、方法名的一个子类方法。
final修饰数组,那么这个数组对象的指向不能修改,但是可以修改数组中的内容。