继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extends 的意思是 “扩展” ,子类是父类的扩展
-
java中的类只有单继承,没有多继承!
继承类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
代码理解
//Person 人 : 父类
public class Person {
}
//学生 is 人 : 子类
public class Student extends Person{
}
//老师 is 人 : 子类
public class Teacher extends Person{
}
-
继承关系的两个类,一个为子类 (又称 派生类),一个为**父类 **(又称 基类),一般情况下称为“父子”关系就好,
子类继承父类,使用 extends 关键字来表示
-
子类和父类之间,从意义上来讲应具有“is a” 的关系
代码理解
public class Student extends Person{
}
public class Person {
public int money = 10_0000_0000;
public void say() {
System.out.println("说了一句话");
}
}
public static void main(String[] args) {
Student student = new Student();
student.say();
System.out.println(student.money);
}
//运行结果为
说了一句话
1000000000
- public 公共的 protected 受保护的 default 默认的 private 私有的
- 如果 int 前面没有任何修饰符 那么就会是 default,
- 如果要子类继承父类 一般使用 public,
- 一般 属性 才是 private
object类
在一个类中 按住 Ctrl + H 就会展现 继承关系的列表
-
我们可以看见最上方 存在一个**Object **类
在 Java 中所有的类,都默认继承 Object
super this
注意点:
- 调用父类的构造方法,必须在构造方法的第一个
- 必须出现在子类的方法中或者构造方法中!
- super 和 this 不能同时调用构造方法!
代码理解
//父类
public class Person {
protected String name = "meimei";
}
//子类
public class Student extends Person {
private String name = "玫玫";
public void test(String name) {
System.out.println(name);
System.out.println(this.name);//此类
System.out.println(super.name);//父类
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("玫瑰");
}
}
//输出结果为:
玫瑰
玫玫
meimei
🌟在子类的内部中调用父类的方法和属性是通过super来实现的!!!
super VS this :
-
代表的对象不同:
- this:本身调用者这个对象
- super:代表父类对象的应用
-
前提:
- this 没有继承也可以使用
- super 只能在继承的条件下才能使用
-
调用构造方法的不同
- this ( ); 调用 本类的构造
- super ( ); 调用 父类的构造
再看代码
//父类
public class Person {
public void print(){
System.out.println("Person");
}
}
//子类
public class Student extends Person {
public void print() {
System.out.println("Student");
}
public void test1 () {
print();
this.print();
super.print();
}
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test1();
}
}
//输出结果为:
Student
Student
Person
代码跟着敲敲,思路全都知晓
方法重写
🌟重写 都是方法的重写,与属性无关
重写:需要有继承关系,子类重写父类的方法!
-
方法名必须相同
-
参数列表列表必须相同
-
修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
-
抛出的异常:范围,可以被缩小,但不能扩大;ClassNotFoundException–>Exception(大)
重写,子类的方法和父类必要一致;方法体不同!
代码理解
//父类
public class B {
public static void test() {
System.out.println("B>=test()");
}
}
//子类
public class A extends B {
public static void test() {
System.out.println("A>=test()");
}
}
public class Application {
public static void main(String[] args) {
//方法的调用只和左边,定义的数据类型有关
A a = new A();
a.test();
//父类的引用指向了子类
B b =new A();
b.test();
/* 用B类新建了A类的对象,把A赋值给了B,这时候B是A,A又继承了B类。
向上转型,所以调用B类方法的时候,也就是B=>test */
}
}
//输出结果为:
A>=test()
B>=test()
把这两个方法中的 static 去掉,左侧显示行数的地方会出现 一个蓝色的小标志(这个就代表重写)
快捷键:alt + insert 然后点击 Override Methods(重写方法):
重写之后,默认调用了父类的 test :
我们可以在里面重写自己的方法:
输出的结果发生了变化:
即b是A new出来的对象,因此调用了A的方法
因为静态方法是类的方法,而非静态是对象的方法
有static时,b调用了B类的方法,因为b是用b类定义的
没有static时,b调用的是对象的方法,而b是用A类new的
静态方法和非静态方法是有很大区别的
静态方法:方法的调用只和左边,定义的数据类型有关
- 重写 和 静态方法没有任何关系,非静态的才叫 重写
为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足!
Alt + Insert :override