Javase 基础入门 —— 04 继承
本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。
01 什么是继承?
Java
中提供了一个关键字extends
,用这个关键字,可以让一个类和另一个类建立起父子关系。
注:① 子类只能继承父类的非私有成员
② 子类的对象是由子类、父类共同完成的
People.java
人类
package company;//父类
public class People {private String name;private char gender;public String getName() {return name;}public void setName(String name) {this.name = name;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}
}
Teacher.java
教师类
package company;//子类
public class Teacher extends People{private String skill;public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}
Test.java
测试
package company;public class Test {public static void main(String[] args) {Teacher t = new Teacher();t.setName("Celeste");t.setGender('女');t.setSkill("C++、Java、Python");System.out.println(t.getName());System.out.println(t.getGender());System.out.println(t.getSkill());}
}
02 权限修饰符
权限修饰符是用来限制类中成员(成员变量、成员方法、构造器)能够被访问的范围。
package family;public class Father {//1.private 本类中访问private void privateMethod(){System.out.println("privateMethod");}//2.缺省 本类中、同一个包下其他类中访问void Method(){System.out.println("Method");}//3.protected 本类中、同一个包下其他类中、子类中访问protected void protectedMethod(){System.out.println("protectedMethod");}//4.public 任意类中访问public void publicMethod(){System.out.println("publicMethod");}public static void main(String[] args) {Father f = new Father();f.privateMethod();f.Method();f.protectedMethod();f.publicMethod();}
}
03 继承的特点
为什么不支持多继承?
为什么Object
是祖宗类?
package family;public class Test {public static void main(String[] args) {Zi z = new Zi();z.show();}
}class Fu{String name = "Fu的name";public void run(){System.out.println("Fu的run方法");}
}class Zi extends Fu{String name = "Zi的name";public void show(){String name = "show的name";System.out.println(name); //show的nameSystem.out.println(this.name); //Zi的nameSystem.out.println(super.name); //Fu的namerun(); //Zi的run方法super.run(); //Fu的run方法}public void run(){System.out.println("Zi的run方法");}
}
04 方法重写
当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
“声明不变,重写实现”
package family;public class Test2 {public static void main(String[] args) {cat c = new cat();c.cry();}
}class animal{public void cry(){System.out.println("动物会叫~");}
}class cat extends animal{@Override //更安全,更优雅public void cry(){System.out.println("喵喵喵~");}
}
@Override
为方法重写的校验注释,其要求方法名称和形参列表必须与被重写方法一致,否则报错!更安全、更可读、更优雅!
注:① 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public
>protec ted
> 缺省)
② 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
③ 私有方法、静态方法不能被重写,如果重写会报错的
package family;public class Test3 {public static void main(String[] args) {Student s = new Student("张三", '男', 40);System.out.println(s.toString()); //family.Student@3ac3fd8bSystem.out.println(s); //Student{name张三gender=男age=40}}
}class Student{private String name;private char gender;private int age;@Overridepublic String toString(){return "Student{name" + name + "gender=" + gender + "age=" + age + "}";}public Student() {}public Student(String name, char gender, int age) {this.name = name;this.gender = gender;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
05 子类构造器的特点
子类的全部构造器,都会先调用父类的构造器,再调用自己的构造器。
注:super();
为寻找父亲构造器,默认写在子类构造器第一行。
06 this() 调用兄弟构造器
//this调用兄弟构造器
public Student(String name, char sex, int age){this(name, sex, age, "黑马程序员");
}public Student(String name, char sex, int age, String school){this.name = name;this.sex = sex;this.age = age;this.school = school;
}
注:super(...)
和this(...)
必须写在构造器的第一行,且二者不能同时出现。