java中一个子类继承自父类,子类得到父类所有 非private 的属性的方法
关键词 extends 一般格式为
class ChildClass extends ParentClass{
};
子类可以重写父类中非private的方法 ,重写父类函数时要在子类函数申明前加上
@Override
重写的函数 返回值,函数名,参数都必须要与父类中的函数相同。
并且重写的方法不能缩小权限 ,即父类的
protected方法可以被子类重写为 protected 和public方法,
public 方法则只能被重写为public方法 (不能缩小权限)
private方法不能被重写 即使在子类中定义一个一模一样的方法,也和父类中的方法是两个不同的方法,相当于新增的方法。
class person {//父类 public void person() { }; public person(String name) { super(); this.name = name; } private String name; protected void eat() { System.out.println("eat"); } private void papapa() { System.out.println("papapa"); } } class student extends person {// 子类 public student(String name) { super(name);// 父类没有无参默认构造函数,需要显式调用 // TODO 自动生成的构造函数存根 } @Override public void eat() { // super.eat(); //可以调用用父类的eat()方法 System.out.println("eat much");// 重写 父类person的方法eat } private void papapa() { //super.papapa(); 错误 papapa()为private 调不动 System.out.println("好好学习!"); } }
在构建子类对象时 系统先会调用父类构造函数生成父类对象,然后在调用子类构造函数生成子类中的成员,当子类构造函数中没有父类的构造函数时,
系统自动调用父类的无参构造函数,如果父类没有,则会报错。这种情况下需要在子类构造函数的第一行调用父类的构造函数为其初始化
super 和 this:
super指代父类 子类可以使用super调用父类的public 和protected的方法 属性,但是不能调用private的(private的一切属性 方法都只能类和类内方法可以使用,即使是子类用super.也不能调用)
this 指当前对象
abstract 抽象类
/*
* 抽象方法 :只有方法的声明没有方法实现,即没有方法体
* 抽象类 :含有于抽象方法的类称为抽象类 / 没有抽象函数 但申明为abstract的类也是抽象类不能实例化
* 抽象类的子类如果要想成为一个新的可以实例化的对象 必须要实现抽象父类的所有的方法 如果不能实例化所有的父类抽象函数 必须要申明也为抽象类
*/
abstract class animal {//抽象类 abstract void move(); abstract void eat(); } class cat extends animal { @Override public void move() { System.out.println("moving"); } @Override public void eat() { System.out.println("eat"); } }
interface 接口类
/*
* 接口类 interface 接口类定义 时 不需要申明 class ,即直接 interface name{}; 接口类可以多继承 ,弥补了单继承的不足
* 接口类的方法 全部都是抽象方法 即只有 定义没有实现, 接口类的子类 可以是接口类 可以是抽象类 可以是普通可以实例化的类 如果要定义为普通类
* 必须要实现继承的所有抽象方法,否则只能定义为抽象类
*/
接口类使用 implements关键词继承 可以一次性继承多个接口类
接口类继承接口类时 使用extends关键词继承
interface fly { abstract void fly(); } interface fight { abstract void fight(); } class bird implements fly { public bird() { } @Override public void fly() { System.out.println("bird.fly()"); } } interface dragon extends fly, fight { }// 接口类继承接口类 class Superman implements fly, fight { //可以继承多个接口类 public Superman() { // TODO 自动生成的构造函数存根 } @Override public void fly() { System.out.print("fly"); } @Override public void fight() { System.out.println("fight"); } }