【JAVA】继承

1、 如何继承一个类?

关键字:extends

修饰符 SubClass extends SuperClass{
    //类定义部分
}
     继承(inheritance)通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类、基类或超类。修饰符如果是public,则该类在整个项目中可见,若无public修饰符,则该类只在当前可见,不可以使用private和protected。

2、使用继承有什么优点?

继承是面向对象的三大特征之一,是java中实现代码重用的重要手段之一。
java中只支持单继承,即每个类只能有一个直接父类。
在java中,所有的java类都直接或间接地继承了java.lang.Object类。Object类是所有java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。
例如:public class MyObject{},表明MyObject类的直接父类是Object类。

3、子类继承父类时的权限

  1. 继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
  2. 继承默认权限修饰符(friendly)修饰的属性和方法,但子类和父类必须在同一个包里。
  3. 无法继承private修饰的属性个方法。
  4. 无法继承父类的构造方法。

4、方法的重写

  1. 重写方法和被重写方法必须具有相同的方法名。
  2. 重写方法和被重写方法必须具有相同的参数列表。
  3. 重写方法的返回值类型和被重写方法的返回值类型相同或是其子类。
  4. 重写方法不能缩小被重写方法的权限。

5、重载(overloading)和重写(overriding)有什么区别和联系?

 重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。
 重写涉及的是子类和父类的同名方法,要求方法名相同、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类。

6、super关键字

**super代表对当前对象的直接父类对象的默认引用。**在子类中可以通过super关键字来访问父类的成员。
  1. super必须出现在子类(子类的方法和构造函数)中,而不是其他位置。
  2. 可以访问父类成员,如父类的属性、方法、构造方法。
  3. 注意访问权限的限制,无法通过super访问private成员。

7、继承条件下构造方法的调用规则

  1. 如果子类的构造方法没有通过super显示调用父类的有参构造函数,也没有通过this显示调用自身的其他构造函数,则系统会默认调用父类的无参构造函数。
  2. 如果子类的构造方法中通过super显示调用父类的有参构造函数,则将执行父类相应的构造发方法,而不执行无参构造方法。
  3. 如果子类的构造方法中通过this显示调用自身的其他构造方法,则在相应的构造方法中应用以上两条规则。
  4. 特别注意的是,如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直执行到顶级父类Object类的无参构造方法为止。

资料:

  1. 在构造方法中如果有this语句或super语句出现,则只能是第一条语句。
  2. 在同一个构造方法中不允许同时出现this和super语句调用构造方法(否则就有两条第一条语句)
  3. 在类方法中不允许出现this和super关键字。
  4. 在实例方法中,this和super语句不要求是第一条语句,可以共存。

8、抽象类和抽象方法的特点是什么?

  1. 抽象类和抽象方法都通过abstract关键字来修饰。
  2. 抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
  3. 抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。
    抽象方法示例:
    public abstract void print();
    //没有大括号

    问题:抽象类中可以有构造方法吗?
    答:抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是有private修饰,也可以被本类的子类中的构造方法调用。

9、final修饰符 (不可变的)

用final修饰的类,不能在被继承。例:

final class Penguin{
}

class SubPenguin extends Penguin{//此行出现错误
}

用final修饰的方法不能被子类重写。例:

class Penguin{
    public final void pring(){}
}

class SubPenguin extends Penguin{
    public void print(){}//此行出现错误
}

用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次,例:

public class Penguin{
    final String home = "南极";
    public void setHome(String home){
        this.home = home;  //错误,home不可以再次赋值
    }
}

注意:

  1. abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。
  2. final可以用来修饰类、属性和方法,不能用来修饰构造函数。
  3. 使用final修饰引用型变量,变量不可在指向另外的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值