一、Super详解
Person.java
protected String name = "人类";
Student.java
private String name = "学生";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
Test.java
public static void main(String[] args) {
Student student = new Student();
student.test("HF");
}
- 输出:
- HF
学生
人类
注:
- 用super也可以调用父类的方法
- 实例化子类时会自动调用
super()
对父类进行实例化,如果手写,必须在第一行。 - Super和This不能同时调用构造方法。
二、方法重写和多态
Static:Static是类的方法;没有Static,方法是实例化了的对象的方法!!!
Test1:
B.java
public class B{
public static void test(){
System.out.println("B=>Test()")
}
}
A.java
public class A extends B{
public static void test(){
System.out.println("A=>Test()")
}
}
Application.java
public class Application() {
public static void main(String[] args) {
A a = new A();
a.test();
B b = new A();
b.test();
}
}
此时输出为:
A=>test()
B=>test()
Test2:
B.java
public class B {
public void test(){
System.out.println("B=>test()");
}
}
A.java
public class A extends B{
@Override
public void test() {
System.out.println("A=>test()");
}
}
Application.java
public static void main(String[] args) {
A a = new A();
a.test();
B b = new A();
b.test();
}
此时输出为:
A=>test()
A=>test()
总结:
- 多态
b属于B类,但是是用A new的对象,所以当test()都为static时,b.test()
调用的是类的对象,所以结果为B=>test() ;当test()被重写之后,调用的是对象的方法,因为是A new出来的对象,所以结果为A=>test() 。 - 方法重写
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小: Public>Protected>Default>Private
- 抛出的异常:范围,可以被缩小,但不能被扩大:ClassNotFoundException --> Exception(大)
为什么需要重写?
- 父类功能,子类不一定需要,或者不一定满足!