一、继承
1. 含义
继承是子类获得父类的非私有属性(变量)和行为(方法)的方式,使其可以表现出父类的一些特征。
class Fu {
}
class Zi extends Fu {
}
2. 特点
- 继承后子类拥有父类非私有的属性和行为(包括类方法以及类变量)
- 子类可以重写或重载父类的方法
class People{
private String name;
private int age;
public People(){
}
public People(String name, int age) {
setName(name);
setAge(age);
}
public void print(){
System.out.println("父类的print");
}
class Teacher extends People{
private String skill;
public void print(String a){
System.out.println("子类的print" + a); // 方法重载
}
@Override
public void print(){
System.out.println("子类的print"); // 方法重写
}
- 不支持多继承但可以多重继承,不断累加所有的属性和行为
3. 优点
减少代码冗余,增强代码的复用性,同时代码可读性更好
4. 访问
- 当子类与父类方法名冲突时,子类会优先使用自身所处环境(如局部、类)的方法
- 当名字冲突时候,可以用super.变量名/方法名调用父类变量和方法,没有的话其变量方法相当于直接并入子类只需要用方法名调用
public class People {
public static void print1(){
System.out.println("hello");
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Teacher extends People {
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public void printInfo(){
print1(); // 类方法不需要写类名或者super
System.out.println(getName() + "具备的技能:" + skill); // getname()也是
}
}
5. 子类构造器
5.1 特点
- 子类构造器默认要调用父类构造器
- 如果父类没有无参构造器(默认第一行调用 super())或想调用有参构造器,则在第一行调用
class People{
private String name;
private int age;
public People(){
System.out.println("===父类构造器执行了===");
}
public People(String name, int age){
System.out.println("===父类有参构造器执行了===");
}
}
class Teacher extends People{
private String name;
private int age;
private String skill;
public Teacher(){
// super(); 默认存在
System.out.println("===子类Z的构造器执行了===");
}
public Teacher(String name, int age, String skill){
super(name, age); // 使用父类有参构造器
this.skill = skill;
System.out.println("===子类Z的有参构造器执行了===");
}
}
public class Test {
public static void main(String[] args) {
Teacher t1 = new Teacher();
Teacher t2 = new Z("jinker", 20, "sleeping");
}
}
output:
===父类构造器执行了===
===子类Z的构造器执行了===
===父类有参构造器执行了===
===子类Z的有参构造器执行了===
-
子类构造器里还可以用this()调用自己的另外一个构造器,代替调用父类构造器在第一行
这是因为调用的子类构造器本身就已经调用了父类构造器在第一行,this()和super()不能同时出现在第一行
public class Test {
public static void main(String[] args) {
Student s1 = new Student("张三", 20);
s1.printinfo();
Student s2 = new Student("李四", 19, "清华大学");
s2.printinfo();
}
}
class Student {
private String name;
private int age;
private String schoolName;
public Student() {
}
public Student(String name, int age) {
this(name, age, "浙江大学"); // 可用于设置默认值
// super() this和super不能重复 因为this已经用了super()构造器了
}
public Student(String name, int age, String schoolName) {
// super();
this.name = name;
this.age = age;
this.schoolName = schoolName;
}
public String getName() {
return name;
}
public void printinfo() {
System.out.println(name);
System.out.println(age);
System.out.println(schoolName);
}
}
二、总结
- 继承是子类获得父类非私有属性和行为的方式,通过继承,子类可以省去书写很多重复代码,增强了代码的复用性也使代码更加清晰可读
- 继承虽然不能多继承,但是能多层继承,可以子类可以累加获得这些非私有属性和行为,可以通过自身需求去重写或重载方法来更加满足自己的需要
- 当变量方法冲突的时候,可以使用super和this关键字区分,当子类继承父类属性和方法后,调用父类的属性和方法不需要类名
- 子类可以通过调用父类构造器减少构建子类构造器重复的代码,因为所有子类构造器都要调用父类构造器,所以this()和super()不能重复