JAVA——继承和方法重写

继承

继承的定义

类和类之间具有关系,这种关系被称为关联。如:一个百货公司类和销售员类就是一个关联,学生类和教师类也是一个关联。两个类之间的关系有很多(依赖,组合等),继承只是其中的一种。

  • 继承的本质是对某一类的抽象,从而实现对现实世界更好的建模。

  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类、超类)。子类继承父类,使用关键字extends来表示
    extends的意思是“扩展”,子类是父类的扩展

父类就是(所有子类)共性抽取

public class Zi extends Fu{
    
    
    //内容
}

继承的注意

  1. 类与类之间只有单继承,没有多继承!!!

一个子类只能“直接”继承一个父类,就像人只有一个亲生父亲
而父类可以有多个子类,就像一个父亲可以有多个孩子

  1. 父类中的属性和方法可以被子类继承,而子类同时可以有自己专属的内容
  2. 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
    a. 直接通过子类对象访问成员变量:
    等号左边是谁,就优先用谁,没有则向上找。
    b. 间接(在方法中)通过成员方法访问成员变量:
    方法属于谁,就优先用谁,没有则向上找。
  3. 在父子类的继承关系当中,创建子类对象和父类重名时,谁的就是谁的,子类没有时会向上找父类,永远不会向下找子类

super关键字

子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。

super的使用

  1. 访问父类当中的属性
public class Fu {
    
    
    String name="xxx";
}
public class Zi extends Fu{
    
    
    String name ="yyy";
    public void showname()
    {
    
    
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}
  1. 访问父类当中的方法
public class Fu {
    
    
    public void show()
    {
    
    
        System.out.println("唱唱歌");
    }
}
public class Zi extends Fu{
    
    
    public void show()
    {
    
    
        System.out.println("跳跳舞");
    }
    public void show_together()
    {
    
    
        show();
        this.show();
        super.show();
    }
}
  1. 调用父类当中的构造
public class Fu {
    
     
}
public class Zi extends Fu{
    
    
    //编译通过,编译器会赠送一个无参构造
    //super();
    public Zi(){
    
    
    }
}
//一定是先调用父类构造,后执行子类构造

注意事项

  1. 用super调用父类构造方法,必须是构造方法中的第一个语句。
  2. super只能出现在子类的方法或者构造方法中。
  3. super 和 this 不能够同时调用构造方法。(因为this也是在构造方法的第一个语句)

super和this的区别

  1. 代表事物不一样

this:代表所属方法的调用者对象
super:代表父类对象的应用空间

  1. 使用前提不一样

this:在非继承前提下也可以使用
super:只能在继承的条件下才能使用

  1. 调用构造方法

this:调用本类的构造方法
super:调用父类的构造方法

方法重写

重写(override)

为什么要重写?

子类继承父类,继承父类当中的方法,但是父类中的方法并不一定能满足子类中的功能需要,所以子类中需要把方法重写。

  1. 在继承关系中,方法名称一样,参数列表也一样。也叫:覆盖,覆写
  2. 方法重写只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被重写.
  3. 静态方法不能重写
    a. 父类的静态方法不能被子类重写为非静态方法,编译会出错
    b. 父类的非静态方法不能被子类重写为静态方法,编译会出错
    c. 子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖
    私有方法不能被子类重写,子类继承父类后,是不能直接访问父类中的私有方法的,那么就更谈不上重写了。
//编译通过
//只是两个类自己的私有方法
public class Fu {
    
    
    private void show() {
    
    
    }
}
public class Zi extends Fu{
    
    
	private void show() {
    
    
    }
}

重写的语法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 访问控制修饰符可以被扩大,但是不能被缩小

public > protected > default > private
范围:
public----哪里都可以
protect----同包/子类(子类可以是不同包下的)
default—同包
private-----同类

注:一般情况下,重写的方法会和父类中的方法的声明完全保持一致,只有方法的实现不同。(也就是大括号中代码不一样)

  1. @Override:写在覆写代码前面,用来检测是不是有效的正确覆盖重写 。
  2. 抛出异常类型的范围可以被缩小,但是不能被扩大。
    ClassNotFoundException --> Exception
  3. 返回类型可以相同,也可以不同,如果不同的话,子类重写后的方法返回类型必须是父类方法返回类型的子类型
    例如:父类方法的返回类型是Person,子类重写后的返回类可以是Person也可以是Person的子类型。

猜你喜欢

转载自blog.csdn.net/The_onion/article/details/125031193