【学习笔记】继承
继承的本质是对某一批类的抽象,从而实现对世界更好的建模
就像动物又分为哺乳动物、爬行动物等。
extends 的意思是“扩展”,子类是父类的扩展,我们通过extends来实现子类对父类的继承
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合
继承关系的两个类,一个为子类(派生类),一个为父类(基类)子类继承父类,使用extends关键字
子类和父类之间,从意义上将应该具有“is a”的关系
子类继承了父类,就拥有了他的所有的公共的属性和方法
父类:
package com.oop.demo04;
public class Person {
private int money = 10_0000;
public void sayHello(){
System.out.println("Hello");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
子类:
package com.oop.demo04;
public class Student extends Person{
}
应用类:
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.getMoney());
student.sayHello();
}
}
快捷键 :ctrl + H 打开类的树形结构
当我们打开这个结构时,可以看到子类在父类下面,即子类继承了父类,但是,需要注意的是父类Person在Object的下面,说明Person继承了Object类。
由此我们知道,
在Java中所有的类,都默认直接或间接继承Object类
在Java中类只有单继承没有多继承,也就是子类只能继承一个父类
Super关键字
我们通过super关键字在子类中调用父类的属性和方法,下面来和this关键字区分一下
父类:
package com.oop.demo04;
public class Person {
protected String name = "张三";
}
子类:
package com.oop.demo04;
public class Student extends Person{
public String name = "李四";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
测试类:
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("王五");
}
}
从输出结果我们可以看出,
this.name 是子类中的属性name
super.name 是父类中的属性name
方法的调用与属性相同
需要注意的是:私有的属性和方法不能被继承,用super关键字也不能调用
在new一个子类时,在子类的构造方法中,会先执行 super() 这一语句,也就是先执行父类的构造方法
子类:
package com.oop.demo04;
public class Student extends Person{
public Student(){
//隐藏代码
//super();
System.out.println("我是李四");
}
public String name = "李四";
}
父类:
package com.oop.demo04;
public class Person {
public Person(){
System.out.println("我是张三");
}
protected String name = "张三";
}
测试类:
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
如果我们自己把super()写出来,它必须放在子类构造器的第一行
如果我们在父类中没有写无参构造,那么在子类中就不能调用父类的无参构造,即使是隐藏的也会报错
super注意点:
1. super调用父类的构造方法,必须在构造方法的第一行
2.super必须只能出现在子类的方法或构造方法中
3.super和this不能同时调用构造方法
VS this:
代表的对象不同:
this: 本身调用者这个对象
super:代表父类对象的引用
前提:
this: 没有继承也可以使用
super:只能在继承条件下使用
构造方法:
this(): 本类的构造
super():父类的构造
重写
重写都是方法的重写,和属性无关
重写之和非静态方法有关,与静态方法无关
静态方法:
package com.oop.demo04;
public class A extends B{
public static void test(){
System.out.println("A=>test()");
}
}
package com.oop.demo04;
public class B {
public static void test(){
System.out.println("B=>test()");
}
}
package com.oop;
import com.oop.demo04.A;
import com.oop.demo04.B;
public class Application {
public static void main(String[] args) {
A a = new A();
a.test();
//B 的引用指向子类
B b = new A();
b.test();
}
}
如果是静态方法,不存在重写这一概念,方法的调用之和左边定义的数据类型有关,这也就解释了 B b = new A(); 结果是B的方法。
下面我们来看非静态方法
去掉static后,我们看到这两个类旁边多了两个小图标,这就是重写的意思
除此之外,我们还可以自动生成重写代码 快捷键alt + insert
我们再来运行一下代码,结果是:
B b = new A();
b.test()//结果是A=>test() 这就是子类重写了父类的方法
并且,重写的方法的权限不能是private
总结
重写的前提:需要有继承关系,子类重写父类的方法。
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大 : public>protect>default>private
4.抛出的一场: 范围,可以被缩小,但不能扩大:Excepton---->ClassNotFoundExcepton
重写,子类方法和父类必须一致,方法体不同
为什么需要重写?