继承
继承性是面向对象的第二大主要特征,而继承性要解决的就是代码重用的问题,利用继承性可以从已有的类继续派生出新的子类,也可以利用子类扩展出更多的操作功能。
继承的实现
继承的格式
class 子类 extends 父类 {}
子类实际上是将父类定义得更加具体化得一种手段
说明:
1.对于extends而言,应该翻译为扩充,但是为了理解方便,统一将其称为继承;
2.子类又称为派生类;
3.父类又被称为超类(Super Class)。
继承的实现:
class Person{
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
class Student extends Person{ //Student类继承了Person类
private String school; //子类扩充的属性
public void setSchool(String school){ //扩充的方法
this.school=school;
}
public String getSchool(){ //扩充的方法
return this.school;
}
}
public class Test1_1_3_3 {
public static void main(String args[]){
Student stu=new Student(); //实例化的是子类
stu.setName("小关"); //Person类定义
stu.setAge(19);
stu.setSchool("西安邮电大学"); //Student类扩充方法
System.out.println("姓名:"+stu.getName()+",年龄:"+stu.getAge()+",学校:"+stu.getSchool());
}
}
//结果:
//姓名:小关,年龄:19,学校:西安邮电大学
继承的限制
一.Java不允许多重继承,但是允许多层继承,Java存在单继承局限。
错误的继承:(多重继承)
class A{}
class B{}
class C extends A,B{} //一个子类继承两个父类
多层继承:
class A{}
class B extends A{} //B类继承A类
class C extends B{} //C类继承B类
二.子类在继承父类时,严格来讲会继承父类中的全部操作,但是对于所有的私有操作属于隐式继承,而所有的非私有操作属于显示继承。
class A{
private String msg;
public void setMsg(String msg){
this.msg=msg;
}
public String getMsg(){
return this.msg;
}
}
class B extends A{//继承自A类
}
public class Test1_1_3_4 {
public static void main(String args[]){
B b=new B();
b.setMsg("HelloWorld");
System.out.println(b.getMsg());
}
}
//结果:
//HelloWorld
由上可知在B类里面一定存在msg属性,并且此属性是通过父类继承而来的。
但是在B类里面不能针对msg属性进行直接访问,因为它在A类中属于私有声明,只能利用setter或getter方法间接地进行私有属性的访问。
三.在子类对象构造前一定会默认调用父类构造(默认使用无参结构),以保证父类的对象先实例化,子类对象后实例化。
1.父类提供无参的构造方法:
class A{
public A(){ //父类提供的无参构造方法
System.out.println("A类的构造方法");
}
}
class B extends A{//继承自A类
public B(){
System.out.println("B类的构造方法");
}
}
public class Test1_1_3_4 {
public static void main(String args[]){
new B();
}
}
//结果:
//A类的构造方法
//B类的构造方法
2.父类不提供无参构造方法:
class A{
public A(String title){ //父类提供的有参构造方法
System.out.println("A类的构造方法"+title);
}
}
class B extends A{//继承自A类
public B(String title){
super(title); //明确调用父类构造,否则将出现编译错误
System.out.println("B类的构造方法");
}
}
public class Test1_1_3_4 {
public static void main(String args[]){
new B("!!!"); //实例化子类对象
}
}
//结果:
//A类的构造方法!!!
//B类的构造方法