面向对象04
继承
- 作用:代码复用
- 通过extends来实现继承
public class Student extends Person {}
-
超类(父类):共同的属性和行为
public class Person { int name; int age; void eat(){} }
派生类(子类):特有的属性和行为
public class Student extends Person { int studentId; String teacherName; void study(){} }
-
派生类既可以访问派生类的,也可以访问超类的,但超类不可以访问派生类的
Person person = new Person(); Student student = new Student(); person.age = 18; person.name = 110; person.eat(); //父类特有的属性和行为自己可以访问 student.age = 11; student.name = 12; student.studentId = 11; student.teacherName = "lloadb"; student.eat(); student.study(); //子类既可以访问自身,也可以访问父类
-
一个超类可以有多个派生类,但一个派生类只能继承一个超类(单一继承)
-
继承具有传递性
子类继承父类,父类又继承另一个类,子类就同时拥有两个类的属性和方法
-
Java规定:构造派生类之前必须先构造超类
-
构造方法Alt+Insert快捷键
-
在派生类的构造方法中若没有调用超类构造方法,则默认super()调用超类的构造方法
-
在派生类的构造方法中若自己调用了超类构造方法,则不再默认提供
若父类的构造方法是有参,则子类需要自己调用,不再默认提供
注意:super()调用超类构造方法,必须位于派生类构造方法的第一行
*this()也必须在第一行,所以不能和super()同时出现
-
super:指代当前对象的超类对象
-
super.成员变量名
//调用父类的成员变量 public class Test01 extends TempClass{ public void test() { super.a =5; } } class TempClass { int a; }
-
super.方法名
//调用父类的成员方法 public class Test01 extends TempClass{ public void test() { super.a =5; super.say(); } } class TempClass { int a; void say(){ } }
-
super()
//调用父类的构造方法 public class Test01 extends TempClass{ public Test01() { super(5); } //若父类的构造方法无参,子类默认调用无参构造 //若父类为有参构造,则必须手动调用 public void test() { super.a =5; super.say(); } } class TempClass { public TempClass(int a) { this.a = a; } int a; void say(){ } }
向上造型(多态)
-
超类型的引用指向派生类的对象
//有两种解释,1、父类类型指向子类对象2、子类对象造型为父类数据类型。规定,只允许向上造型,反之不行 public class Test01 { int a; private int b; } class TempClass extends Test01{ public static void main(String[] args) { Test01 test01 = new TempClass(); } }
-
能访问的东西看引用的类型
public class Test01 {
int a;
void say(){}
}
class TempClass extends Test01{
int b;
void eat(){}
public static void main(String[] args) {
Test01 test01 = new Test01();
TempClass temp = new TempClass();
Test01 test02 = new TempClass();
test01.a = 1;
test01.say();
/*test01.b; 父类对象只能访问父类的属性和方法
test01.eat();*/
temp.a = 1;
temp.b = 1;
temp.say();
temp.eat();//子类对象既能访问父类,又能访问子类
test02.a = 1;
test02.say();
/*test02.b; 能点出来什么,只看数据类型
test02.eat();*/
TempClass b01 = (TempClass) test02;
b01.b = 1;
b01.eat();//但可以强制转型来调用
}
}
补充:
- 继承要符合is a(是)的关系
- 超类的意义:
- 封装共同的属性和行为(代码复用)
- 为所有派生类提供了一个统一的类型(向上造型),可以集中调用(引用类型数组)