面向对象三大特性-继承
package com.oop;
import com.oop.demo05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say();
System.out.println(student.getMoney());
}
}
package com.oop.demo05;
//在Java中,所有的类,都默认直接或间接继承Object
//Person 人: 父类
public class Person /*extends Object*/{
//public
//protected
//default
//private
private int money = 10_0000_0000;
public void say(){
System.out.println("说了一句话");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package com.oop.demo05;
//学生 is 人 :派生类,子类
//子类继承了父类,就会拥有父类的全部方法!
public class Student extends Person {
//Ctrl + H 查看继承关系
}
package com.oop.demo05;
public class Teacher extends Person{
}
Super详解
注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中!
- super和 this 不能同时调用构造方法!
Vs this:
- 代表的对象不同:
this:本身调用这个对象
super:代表父类对象的引用
- 前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
- 构造方法:
this(); 本类的构造
super();父类的构造!
package com.oop;
import com.oop.demo05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("秦疆");
student.test1();
}
}
package com.oop.demo05;
//在Java中,所有的类,都默认直接或间接继承Object
//Person 人: 父类
public class Person /*extends Object*/{
//一个类最好要写上无参构造,如果不写无参构造,子类就调不了父类的无参构造
public Person(){
System.out.println("Person无参执行了");
}
protected String name = "kuangshen";
public void print(){
System.out.println("Person");
}
//私有的东西可以被继承,但只能被本类访问
private void print2(){
System.out.println("Person");
}
}
package com.oop.demo05;
//学生 is 人 :派生类,子类
//子类继承了父类,就会拥有父类的全部方法!
public class Student extends Person {
public Student() {
//隐藏代码:调用了父类的无参构造
super();//调用父类的构造器,必须要在子类构造器的第一行,不写默认写了
System.out.println("Student无参执行了");
}
private String name = "qinjiang";
public void print(){
System.out.println("Student");
}
public void test1(){
print();//Student
this.print();//Student
super.print();//Person
}
public void test(String name){
System.out.println(name);//秦疆
System.out.println(this.name);//qinjiang
System.out.println(super.name);//kuangshen
}
}
方法重写(重点)
package com.oop;
import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
//静态方法和非静态的方法区别很大!
//静态方法://方法的调用只和左边,定义的数据类型有关
//非静态:重写(且要是public,不能是private私有)
public static void main(String[] args) {
A a = new A();
a.test();//输出A
//父类引用指向子类对象
B b = new A();//子类重写了父类的方法
b.test();//之前都加Static时输出B,都去掉static输出A
/*(弹幕)
b是A new出来的对象,因此调用了A的方法。因为静态方法是类的方法,而非静态是对象的方法
刚开始没有重写A继承B的,所以B=>test();后来A重写了方法,就变成了A=>test()
*/
/*
重载是参数列表不同,本类的
重写是子父类才有的,子类重写父类的方法
*/
}
}
package com.oop.demo05;
//重写都是方法的重写,和属性无关
public class B {
public static void test2() {
System.out.println("A=>test()");
}
public void test() {
System.out.println("B=>test()");
}
}
package com.oop.demo05;
//继承B
public class A extends B{
public static void test2() {
System.out.println("A=>test()");
}
//Override 重写
@Override //注解:有功能的注释!
public void test() {
//super.test();//默认调用父类,我们可以重写自己的方法
System.out.println("A=>test()");
}
}
去掉static后,父类和子类的左边分别出现了o向上箭头和o向下箭头,这里的o代表重载
alt+insert键中选择Override Method重写方法
注意点
重写:需要有继承关系,子类重写父类的方法!
- 方法名必须相同
- 参数列表必须相同(负责变重载了)
- 修饰符:范围可以扩大但不能缩小:public > protected > default > private
- 抛出的异常:范围,可以被缩小但不能扩大;ClassNotFoundException类找不到异常---->Exception(大)
重写,子类的方法和父类必须要一致,方法体不同!
为什么需要重写:
- 父类的功能,子类不一定需要,或者不一定满足!
快捷键:
Alt+insert选中override