继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
注意
- 子类拥有父类的特征,而父类没有,父类更通用,子类更具体(特征包括属性和方法,自身的特性,拥有父类没有的)
- 使用extends继承父类,语句格式:class 子类名 extends 父类名{}
- 父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)
- 子类中通过super关键字来调用父构造方法,
子类默认调用父类无参构造方法
- 在子类中可以继承父类的哪些东西,哪些不可以继承:
父类中
public
、protected
修饰的属性和方法可以继承,private
修饰的属性和方法不能被继承
- 规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象
- 可以在子类中显示调用父类的有参构造方法
- 如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用
- 继承只能单继承
方法重写
- 在子类当中重写父类当中的方法,要求
参数类型
、顺序
、个数
都要相同。 - 可以继父类方法重写自己独有的方式的方法,注意:
父类的构造不允许被继承、不允许重写
super
- 如果想要在子类调用父类被重写的方法,使用
super.方法名()
调用 super()
必须放在子类的构造的第一行
引用方法
- 访问父类成员方法
super.方法名()
- 访问父类属性
super.属性名
- 访问父类构造方法
super()
实例
父类
package com.jachie.animal;
/**
* 动物类
* @author 哒哒哒
*
*/
public class Animal {
protected int age = 3;
public Animal() {
System.out.println("父类的构造方法");
}
public Animal(String info) {
System.out.println("父类的构造方法" + info);
}
public void eat(String food) {
System.out.println(this.getName() + "吃" + food);
}
}
子类
package com.jachie.animal;
/**
* 猫类
* @author 哒哒哒
*
*/
public class Cat extends Animal{
public Cat() {
super("子类调用"); // 子类调用父类带参构造方法
System.out.println("子类的构造方法");
System.out.println(super.age); // 子类调用父类的属性
}
public void eat(String food) {
super.eat("粑粑"); // 子类调用父类eat方法
System.out.println(this.getName() + "舔" + food);
}
}
this与super的使用
this
- 访问当前类的成员方法
- 访问当前类的成员属性
- 访问当前类的构造方法
- 不能在静态方法中使用
super
- 访问父类的成员方法
- 访问父类的成员属性
- 访问父类的构造方法
- 不能在静态方法中使用
构造方法调用时,super与this不能同时出现
方法重写与方法重载区别
方法重载
- 在同一个类中
- 方法名相同,参数列表不同(参数顺序、个数、类型)
- 方法返回值、访问修饰符任意
- 与方法的参数名无关
方法重写
- 有继承关系的子类中进行方法重写
- 方法名相同,参数列表相同(参数顺序、个数、类型)
- 访问返回需要大于等于父类的访问范围,
不可小于其范围
- 与方法的参数名无关
实例
父类Animal
package com.jachie.animal;
/**
* 动物类
* @author 哒哒哒
*
*/
public class Animal {
private String name;
public Animal() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(this.getName() + "吃" + food);
}
}
子类Cat
package com.jachie.animal;
/**
* 猫类
* @author 哒哒哒
*
*/
public class Cat extends Animal{
private double weight;
public Cat() {}
/**
* 初始化
* @param name
* @param month
* @param type
*/
public Cat(String name, double weight) {
this.setName(name);
this.setWeight(weight);
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
// 重写父类的eat方法
public void eat(String food) {
System.out.println(this.getName() + "舔" + food);
}
public void info() {
System.out.println(this.getName() + "是一只" + this.getType() + "的猫");
}
}
子类Dog
package com.jachie.animal;
public class Dog extends Animal {
private String sex;
public Dog() {}
public Dog(String name, int month, String type, String sex) {
this.setName(name);
this.setSex(sex);
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void eat(String food) {
System.out.println(this.getName() + "啃" + food);
}
public void info() {
// 调用父类的eat方法
super.eat("屎");
System.out.println(this.getName() + "是一只" + this.getType() + "的狗");
}
}
继承后的初始化顺序
父类静态成员
>>>子类静态成员
>>>父类对象构造
>>>子类对象构造