1.继承的定义与使用
继承:在已有的基础上继续扩充功能
定义两个类(人和学生)
package Testextends;
/**
* Author:weiwei
* description:继承
* Creat:2019/3/27
**/
class Person{
private String name;
private int age;
public String getName(){
return name;
}
public void setName(){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student{
private String name;
private int age;
private String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
观察代码,人和学生其实是存在共有属性,所以可以共享属性,如上,把两个类共有的属性依次重复实现,代码重复性高,灵活性低,这种情况下我们就可以用Java的第二大特性继承的优势,学生类可以继承人这个类重复的属性,减少代码的重复性,简化代码,灵活扩充功能
2.继承的实现
继承用关键字:extends实现
语法:class 子类 extends 父类
观察继承的实现
package Testextends;
/**
* Author:weiwei
* description:继承
* Creat:2019/3/27
**/
class Person{
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person{
}
public class Testextends1 {
public static void main(String[] args) {
Student student = new Student();
student.setName("Steven");
student.setAge(26);
System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge());
}
}
上述代码就是继承的过程,子类直接继承父类,实现了代码的重用,子类最低也维持与父类相同的功能,子类还可以进行扩充(扩充属性和方法)
观察子类进行功能的扩充
package Testextends;
/**
* Author:weiwei
* description:子类功能扩充
* Creat:2019/3/27
**/
class Person{
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person{//定义一个子类
private String school;//扩充新的属性
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class Testextends2 {
public static void main(String[] args) {
Student student = new Student();
student.setName("Merry");
student.setAge(18);
student.setSchool("第一中学");
System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge()+",学校:"
+student.getSchool());
}
}
继承的主要作用是对类进行扩充以及代码的重用
3.继承的限制
子类对象在进行实例化前一定会首先实例化父类对象。默认调用父类的构造方法后再调用子类构造方法
进行子类对象初始化。
观察子类对象创建
package Testextends;
/**
* Author:weiwei
* description:继承--子类对象创建
* Creat:201/3/27
**/
class Person{
public Person(){
System.out.println("Person类对象产生");
}
}
class Student extends Person{
public Student(){
super();//此语句在无参时写与不写一样
System.out.println("Student类对象产生");
}
}
public class Testextends3 {
public static void main(String[] args) {
new Student();
}
}
通过以上代码我们发现,没有任何一条语句调用父类构造方法。因此,子类对象实例化之前一定先实例化父类对象。
注意:实际上在子类的构造方法之中,相当于隐含了一个语句 super();
同时需要注意的是,如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造
方法。
Java只允许单继承,不允许多继承。
一个子类只能继承一个父类。
观察错误的多继承
class A {}
class B {}
class C extends A,B{}
Java 不允许多继承,但允许多层继承,但层数不要太多,建议最多三层
class A {}
class B extends A{}
class C extends B{}
在进行继承的时候,子类会继承父类所有结构,包括(属性,构造方法,普通方法),但是需要注意的是,所有非私有操作属于显式继承(可以直接调用),所有私有操作属于隐式继承(通过其他形式调用,比如setter,getter方法)
观察显式继承和隐式继承
package Testextends;
/**
* Author:weiwei
* description显式继承与隐式继承
* Creat:2019/3/27
**/
class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Person{
public void fun(){
System.out.println(getName());
}
}
public class Testextends4 {
public static void main(String[] args) {
Student student = new Student();
student.setName("Steven");
System.out.println(student.getName());
student.fun();
}
}
此时父类中的属性的确被子类所继承了,但是发现子类能够使用的是所有非private操作,而所有的private操作无
法被直接使用,所以称为隐式继承。
总结:
- 继承的语法以及继承的目的(扩充已有类的功能,使得代码重用)
- 子类对象的实例化流程:不管如何操作,一定要先实例化父类对象
- 不允许多重继承,只允许多层继承