java继承
本质:对某一批类的抽象
java中只有单继承,没有多继承
一个子类只能有一个父类,但是一个父类可以有多个子类
被final修饰的类无法继承 即final之后“断子绝孙”
继承使用extends关键字,子类(派生类)是父类(基类)的扩展
这里让Student类继承Person类
package com.yuanyu.Oop;
public class Student extends Person {
}
通过快捷键Ctrl+H可以查看继承关系
在java中,所有类都默认直接或间接继承Object类
java中类与类之间的关系还有依赖、组合、聚合等等...
子类继承父类的所有方法和属性,但是私有的属性方法无法继承
package com.yuanyu.Oop;
public class Person {
//public
public int money=100000;
//private
private int money1=100000;
public void say(){
System.out.println("I can speak.");
}
}
package com.yuanyu.Oop;
public class Student extends Person {
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.say(); //I can speak.
//public
System.out.println(student.money); //100000
//private
//System.out.println(student.money1); //无法调用
}
}
修饰符:
- public(继承)
- protected
- default
- private (无法继承)
子类调用父类使用super关键字
this表示当前类
子类可以继承父类protected类型的属性
package com.yuanyu.Oop;
public class Person {
protected String name="shangxian";
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.test("mixu");
}
}
package com.yuanyu.Oop;
public class Student extends Person {
private String name="yuanyu";
public void test(String name){
System.out.println(name); //mixu
System.out.println(this.name); //yuanyu
System.out.println(super.name); //shangxian
}
}
子类继承父类的方法
package com.yuanyu.Oop;
public class Person {
public void print(){
System.out.println("Person");
}
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.test();
}
}
package com.yuanyu.Oop;
public class Student extends Person {
public void print(){
System.out.println("Student");
}
public void test(){
print(); //Student
this.print(); //Student
super.print(); //Person
}
}
继承时构造器的执行
package com.yuanyu.Oop;
public class Person {
public Person() {
System.out.println("Person无参构造器");
}
}
package com.yuanyu.Oop;
public class Student extends Person {
public Student() {
//super(); //隐藏调用父类的无参构造器
System.out.println("Student无参构造器");
}
}
package com.yuanyu.Oop;
public class Application {
public static void main(String[] args) {
Student student=new Student();
}
}
通过观察运行结果会发现,父类的构造器先执行,子类的构造器后执行,即子类的构造方法中隐藏了调用父类无参构造的代码super();且super();必须放在第一行否则会报错。
父类没有无参构造,子类也不会有无参构造,重写了有参构造要把无参构造写上,若父类重写了有参构造而没有增加无参构造,子类调用父类的有参构造不会有错,但是子类调用的是父类的无参构造或没有调用时则会报错。
super注意点:
-
super调用父类的构造方法,必须在构造方法的第一行
-
super必须只能出现在子类的方法或构造方法中
-
super和this不能同时调用构造方法