一、继承为题的提出
----------------------------------------------------
我们知道面向对象的三大特性是:封装、继承和多态,可以知道继承在java应用中有多么的重要了。
下面我们先看一段代码:
Person代码:
package com.it18zhang; /** * Created by stone on 2018/9/10. */ public 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; } }
Student代码:
package com.it18zhang; /** * Created by stone on 2018/9/10. */ public class Student { private String name ; private int age ; private String school; public String getSchool() { return school; } public void setSchool(String school) { this.school = 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; } }
从上面的代码可以看出,代码中存在大量的重复,而按照之前学习的,重复是不可能进行消除的
二、继承的概念:继承是面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能够吸收已有类的属性和行为,并能狗扩展新的能力,在java类中,如果要实现继承,可以使用如下的语法。
class 子类 extends 子类 {}
子类被称为派生类;父类称为超类;
观察继承的基本实现
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类 } public class TestDemo { public static void main(String args[]) { Student stu = new Student(); // 实例化的是子类 stu.setName("张三"); // Person类定义 stu.setAge(20); // Person类定义 System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge()); } }
可以发现:子类并没有定义任何的操作,而主类中用的全部的操作都是由Person类进行定义的,这说明:子类即使不扩充父类,也能维持对父类的操作
1.多个类中存在相同的属性和行为的时候,将这些内容抽取到单独的一个类中,那么多个类无需再定义这些类和行为,只需要继承那个类就可以了;多个类可以成为子类,单独的这个类可以成为父类或者超类;子类可以访问父类中的非私有属性和行为;通过extends关键字让类与类之间产生继承关系。
2.继承的出现提高了代码的复用性,继承的出现让类与类之间产生了关系,提供了多态的前提。
3.继承的特点:java只支持单继承,不支持多继承
一个类只能继承一个父类,不可以有多个父类
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2......//error
java支持多层继承
class A{}
class B extends A{}
class C extends B{}
4.定义继承需要注意:
不要为了获取其他类的某个功能而去继承
类与类之间要有所属关系,xx1是xx2的一种关系
4.1super关键字
super和this的用法很像 ;this是本类对象的引用;super代表父类内存空间的标志;当字符类出现同名的成员的时候,可以用super进行区分。当子类调用父类构造函数的时候,可以使用super方法进行调用
4.2函数的覆盖:子类找那个出现父类中一模一样的方法时候,会出现覆盖操作,也称为重写或者复写
4.3父类中的私有方法不可以被覆盖;在子类覆盖的方法中,继续使用被覆盖的方法可以通过super.函数名进行获取
覆盖方法注意事项:覆盖的时候,子类方法权限一定要大于父类方法的权限;静态方法只能覆盖静态方法
4.5子类的实例化过程:子类中所有的构造函数默认都会访问父类的孔灿构造函数;因为每一个构造函数的第一行都有默认语句super();
4.6子类会具备父类的数据,所以先要确定父类是如何对这些数据进行初始化的。当父类中没有空参构造函数的时候,子类的构造函数必须通过this或者super语句指定要进行访问的构造函数