Java语言基础-类的继承 Java语言的三大特性之一 继承的特点 通过继承,在已有类型基础之上进行扩充或改造,得到新的数据类型。 已有的数据类型称为父类或者超类。 得到的新数据类型,称为子类或派生类。 类的继承提高了程序代码的重用性和可扩充性,缩短了软件的开发周期。 继承的分类 单继承--------子类只能有一个直接父类 多重继承-----子类可以有多个直接父类 ![]() 继承的写法格式: [Java] 纯文本查看 复制代码 父类{
父类的内容
}
子类 extends 父类{
子类的内容
}
例: [Java] 纯文本查看 复制代码 package NewBolg;
class inherit {
private String blogger = "小刀";
public String getBlogger() {
return blogger;
}
public void setBlogger(String blogger) {
this.blogger = blogger;
}
public static void main(String[] agrs){
Subclass subclass = new Subclass();
System.out.println("平台:" + subclass.getBlog() + ",博主是:" + subclass.getBlogger());
}
}
class Subclass extends inherit{
private String Blog = "黑马社区";
public String getBlog() {
return Blog;
}
public void setBlog(String blog) {
Blog = blog;
}
}
运行结果为: [AppleScript] 纯文本查看 复制代码 平台:黑马社区,博主是:小刀
注意: 父类里定义的成员变量都被子类继承过来了,但是private权限的不能直接访问,其他的都可以直接访问,父类里定义的成员方法也被子类继承过来。 覆盖(重写)子类的方法跟父类继承过来的方法完全一样(方法名一样,参数一样,返回值类型一样)。 访问控制权限高于等于父类的方法的访问控制权限,子类该方法抛出的异常类型低于父类的。 重写规则:“三同一小一大”规则 “三同”:即方法名相同,形参列表相同,返回类型相同; “一小”指的是子类方法声明抛出的异常类应该比父类方法声明抛出的异常类更小或者相等; “一大”指的子类方法的访问权限应该比父类的方法更大或者相等; 覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。 方法重写和方法重载的区别 覆盖是子类和父类直接的关系;而重载是同一类内部多个方法之间的关系。 覆盖一般是两个方法间的,而重载看你是多个重载的方法。 覆盖的方法有相同的方法名和形参表;而重载的方法只能有相同的方法名,不能有相同的形参表。 覆盖时根据调用它的对象来区分方法;而重载是根据形参标来决定调用的是哪个方法。 注意: super是Java提供的一个关键字,它是直接父类对象的默认引用。 正如this不能出现在static修饰的方法中一样,super也不能出现在static的方法中。 如果子类定义了和父类同名的数学,也会发生子类属性覆盖父类属性的情形。子类的方法直接访问该属性时,都会访问到覆盖属性,无法访问被覆盖属性–通过super来访问父类被覆盖的属性。 例: 如果我们在某个方法中访问名为a的属性,但是没有显示指定调用者,系统查找a的顺序为: 查找该方法中是否有名为a的局部变量。 查找当前类是否包含名为a的属性。 查找a的直接父类中是否包含a的属性,依次上溯a的父类,知道java.lang.Object类,如果最终不能找到名为a的属性,则系统出现编译报错。 子类构造方法调用父类构造方法分如下几种情况: 子类构造方法执行体的第一行代码使用super显示调用父类构造方法,系统将根据super调用里传入的实参列表调用父类对应的构造方法。 子类构造方法执行体中的第一行代码使用this显示调用本类中冲裁的构造方法,系统将根据this调用里传入的实参列表调用本类的另一个构造方法。执行本类中另一个构造方法时会调用父类的构造方法。 子类构造方法执行体中既没有super调用,也没有this调用,系统将会执行子类构造方法之前,隐式调用父类无参数的构造方法。 [Java] 纯文本查看 复制代码 public class AA {
public static void main(String[] args){
//输出A
//分析:AA为父类,则无影响
AA aa = new AA();
//输出A,B
//分析:BB为子类,调用无参BB,super无参父类,输出A,然后输出无参BB输出语句
BB bb = new BB();
//输出A,AA,BB
//分析:BB为子类,调用含参BB,super带参父类,带参父类中含有this(),先执行不带参父类,然后执行带参父类的输出语句,最后执行带参子类的输出语句
BB bb = new BB(1);
}
AA(){
System.out.println("A");
}
AA(int i){
this();
System.out.println("AA");
}
}
class BB extends AA{
BB(){
super();
System.out.println("B");
}
BB(int i){
super(i);
System.out.println("BB");
}
}
|