Java_Day14(继承)
继承
继承的实现
继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
-
继承的格式:
- 格式:public class 子类名 extend 父类名{ }
- 范例:public class Zi extends Fu { }
- Fu是父类,也称为基类,超类
- Zi是子类,也称为派生类
-
继承中子类的特点:
- 子类可以有父类的内容
- 子类可以有自己的内容
- 子类继承了父类,就继承了父类的方法和属性
- 子类不是父类的子集,而是父类的扩展
- 子类不能访问父类私有的(private)成员变量和方法
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Student extends Person{
public void study(){
System.out.println("努力学习");
}
}
public class Teacher extends Person {
public void teach(){
System.out.println("教书育人");
}
}
public class ExtendsTest {
public static void main(String[] args) {
Person person = new Person();
// Student对象
Student student = new Student();
// Teacher
Teacher teacher = new Teacher();
//给以上对象赋予属性值
person.setName("黄帝");
person.setAge(100);
student.setName("张三");
student.setAge(20);
teacher.setName("老张");
teacher.setAge(50);
// 获取对象的属性
System.out.println(person.getName() +"---"+person.getAge());
System.out.println(student.getName()+"----"+student.getAge());
System.out.println(teacher.getName()+"----"+teacher.getAge());
}
}
如上,通过extend使得Student,Teacher和Person产生了关系,这种关系就是继承
继承的优缺点
优点:
- 提高了代码的复用性
- 提高了代码的维护性,当父类修改了之后,子类也会产生相应的变化
缺点:
- 使得类与类之间产生了联系,增强了耦合性,使得子类的独立性减弱。
继承关系点的体现: is a
当子类是父类的一种,真实存在is a的关系时才使用继承,否则不能滥用继承
继承中变量的访问
特点:
-
子类局部范围查找
-
子类成员范围查找
-
父类成员范围查找
-
都没找到报错
public class Fu {
public int num= 10;
public void show(){
System.out.println("父类的show方法");
System.out.println(num);
}
}
public class Zi extends Fu{
//public int num = 20;
public void show(){
System.out.println("子类的show方法");
System.out.println(num);
}
}
public class ExtendsVarTest {
public static void main(String[] args) {
Fu f = new Fu();
Zi z = new Zi();
f.show();//10
z.show();//20
}
}
super
Super和this的意思基本相同:
this代表本类的当前对象,通过this可以调用本类的成员变量
super代表的是当前对象的父类,通过super可以调用父类的成员变量和方法
public void show(){
System.out.println("子类的show方法");
System.out.println(super.num);
super.show();
}
此时使用super主动调用父类的成员变量和方法
当我们去创建子类的 对象的时候,首先会调用父类的构造方法来创建一个隐含的父类对象。
创建父类隐含对象的意义就在于我们有可能会在子类中去调用父类的成员
在创建子类对象时,会默认调用父类的无参构造创建一个隐含的父类对象
public Zi(int num){
super(num);//通过 super调用父类的构造方法
System.out.println("子类的 构造方法被调用********");
}
通过super去显式的 调用父类 的构造方法 必须出现在子类构造方法的第一行
子类在创建 对象的构造方法 默认会 调用父类的同型的构造方法
public Zi(){
super();// 在子类的构造方法中 隐含这这样的调用语句
}
在子类中调用构造方法的时候 this和super不能同时出现.
因此在定义一个类的时候 ,如果要编写构造方法,一定要将类的默认无参构造手动的 写出来
super的内存
对象在堆内存中,会单独存在一块super区域,用来存放父类的数据
成员方法的访问
成员方法的访问规则和成员变量相同
在使用子类对象去访问成员变量和方法的时候都遵循先在子类中查找,如果子类中有,则访问子类的成员,如果子类中没有,则访问父类,父类中还是没有则报错。
当在子类中定义了和父类同名的成员变量时,则使用子类对象只能访问到自己的成员变量
当在子类中定义了和父类同名的成员方法时,则使用子类对象访问的也是自己的成员方法
子类中定义的同名的成员就屏蔽了父类的同名成员,但是,我们又可以通过super关键字来主动的调用父类的成员 ,此时就将父类的成员称为虚拟成员(虚拟变量和虚拟方法)
方法的重写
重写指的是在存在继承关系的类中,子类重写父类的方法
重写父类的方法指的就是虽然方法的声明形式相同,但是方法的实现不同。
注意事项:
- 重写时 方法的声明(返回值类型 参数列表 方法名称)必须一致
- 重写的时候 不能重写父类的 私有方法
- 子类在重写父类 的方法时 不能采用比父类更加严格的访问修饰符,只能采用比父类的访问 权限相同的或者给大的访问权限
public class Zi extends Fu{
public int num = 20;
//重写 注解 标注解释 该方法是重写父类 的方法 但是重写必须满足重写要求 否则该注解会报错
@Override
public void show(){
}
// 编译报错 子类重写不能采用比父类更严格的访问权限
// @Override
// void method1(){
//
// }
//通过
@Override
public void method(){
}
}
继承的注意事项
- Java中的继承是单重继承 ,一个子类只能继承一个父类
public class Zi extends Fu,Grand{// 这种写法是错误的
- Java中的继承可以是多层继承
public class Grand {
int num = 100;
public void show(){
System.out.println(num);
}
}
public class Fu extends Grand{
}
public class Zi extends Fu{// 这种写法是错误的
}
测试:
public class ExtendsVarTest {
public static void main(String[] args) {
Zi z = new Zi();
System.out.println(z.num);
z.show();
}
}