继承
继承性严格来讲就是指扩充一个类已有的功能。
语法:class 子类 extends 父类{}
功能:继承父类的属性、方法同时也可以扩充父类没有的属性、方法。
类的继承的限制:
一、Java中的类不允许多重继承,允许多层继承
错误的继承:
class A{}
class B{}
class C extends A,B{} //一个子类继承两个父类
多层继承:
class A{}
class B extends A{}
class C extends B{}
二、子类在继承父类时,对父类的私有操作是隐式继承,非私有操作是显式继承
如下程序所示,msg属性在A类中是私有声明,只能利用setter或getter方法进行私有属性访问。
class A{
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return this.msg;
}
}
class B extends A{
}
public class demo {
public static void main(String args[]) {
B b = new B();
b.setMsg("Nice to see you!");
System.out.println(b.getMsg());
}
}
三、父类对象先实例化,子类对象后实例化
当父类提供无参构造方法时,可以不编写“super()”。但是如果父类不提供无参构造方法时,必须明确使用super()调用父类指定参数的构造方法。
class A{
public A() {
System.out.println("父类无参构造被调用");
}
public A(String title) {
System.out.println("父类有参构造被调用 title="+title);
}
}
class B extends A{
public B(String title) {
//这一句可以不写也可以写,因为父类构造器中已有无参构造。
//但是若父类构造器没有无参构造则必须写super()
super();
// super(title);
System.out.println("Nice to see you!");
}
}
public class Temp {
public static void main(String args[]) {
new B("hahahaha");
}
}
输出结果:
父类无参构造被调用
Nice to see you!
package com.hdu.java;
class A{
public A() {
System.out.println("父类无参构造被调用");
}
public A(String title) {
System.out.println("父类有参构造被调用 title="+title);
}
}
class B extends A{
public B(String title) {
// super();
super(title);
System.out.println("Nice to see you!");
}
}
public class Temp {
public static void main(String args[]) {
new B("hahahaha");
}
}
输出结果:
父类有参构造被调用 title=hahahaha
Nice to see you!
覆写
定义:子类定义了和父类的方法名称、返回值类型、参数类型及个数完全相同的方法
结果:实例化子类对象时,将不再执行父类的方法,而是直接调用已经被子类覆写过的方法。
优势:当有多个字类时,父类的方法就会根据子类的覆写,有不同的实现效果。
权限问题:被子类覆写的方法不能有比父类更严格的访问控制权限。权限从宽到严的顺序是:public>default(默认,什么都不写)>private。
附:this 和 super的区别
区别 | this | super |
功能 | 调用本类构造、本类方法、本类属性 | 子类调用父类构造、方法、属性 |
形式 | 先查找本类中是否存在有指定的调用结构,如果有则 直接调用,如果没有则调用父类定义 |
不查找子类,直接调用父类操作 |
特殊 | 表示本类的当前对象 | —— |