继承:
继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、 基类);得到继承信息的类被称为子类(派生类)。
作用:
1、 继承的出现减少了代码冗余,提高了代码的复用性。
2、继承的出现,更有利于功能的扩展。
3 、继承的出现让类与类之间产生了关系,提供了多态的前提。
类继承语法规则:
class 子类 extends 父类{ }
体现:一旦子类继承父类以后,子类中就获取了父类中声明的所有的属性和方法。
特别的:父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。
只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展。子类和父类的关系,不同于子集和集合的关系。
Java中关于继承性的规定:
1.一个类可以被多个子类继承。
2.Java中类的单继承性:一个类只能有一个父类
3.子父类是相对的概念。
4.子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
5.子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
特殊的:
1. 如果我们没有显式的声明一个类的父类的话,则此类继承于java.lang.Object类
2. 所有的java类(除java.lang.Object类之外)都直接或间接的继承于java.lang.Object类
3. 意味着,所有的java类具有java.lang.Object类声明的功能。
方法的重写(override/overwrite):
在子类中可以根据需要对从父类中继承来的方法进行改造,也称 为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
重写的规定:
语法:
方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{
方法体//跟父类方法体不一样
}
约定俗成:子类中的叫重写的方法,父类中的叫被重写的方法
1、 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
2、 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
>特殊情况:子类不能重写父类中声明为private权限的方法
3、 返回值类型:
>父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
>父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
>父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)
4、子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
例子:
父类
package com.hao.zhi.lv.extendTest;
//父类
public class Minkind {
private int sex;
private int salary;
public Minkind(){
}
public void manOrWoman(){
if (this.sex==1){
System.out.println("man");
}else if(this.sex==0) {
System.out.print("woman");
}
}
public void employeed(){
if (this.salary==0){
System.out.println("not job");
}else if(this.salary!=0) {
System.out.println("job");
}
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
子类:
package com.hao.zhi.lv.extendTest;
public class Kids extends Minkind {
private int yearsOld;
public Kids(){
}
public Kids(int yearsOld){
this.yearsOld=yearsOld;
}
public void printAge(){
System.out.println(yearsOld);
}
public int getYearsOld(){
return yearsOld;
}
public void setYearsOld(int yearsOld){
this.yearsOld=yearsOld;
}
//重新的方法
public void employeed() {
System.out.println("Kids should study and no job.");
}
}
子类可以调用父类的属性和方法(private修饰的方法除外):
package com.hao.zhi.lv.extendTest;
public class KidsTest {
public static void main(String args[]){
Kids someKid=new Kids(12);
someKid.printAge();
someKid.getYearsOld();
someKid.setSalary(1);
someKid.setSex(1);
someKid.employeed();
someKid.manOrWoman();
}
}
super关键字:
super关键字的使用
1.super理解为:父类的
2.super可以用来调用:属性、方法、构造器
3.super的使用:调用属性和方法
3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用
父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."
3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的
使用"super.属性"的方式,表明调用的是父类中声明的属性。
3.3 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的
使用"super.方法"的方式,表明调用的是父类中被重写的方法。
4.super调用构造器
4.1 我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器
4.2 "super(形参列表)"的使用,必须声明在子类构造器的首行!
4.3 我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二选一,不能同时出现
4.4 在构造器的首行,没有显式的声明"this(形参列表)"或"super(形参列表)",则默认调用的是父类中空参的构造器:super()
4.5 在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器
例子:
package com.hao.zhi.lv.extendTest1;
public class Person {
int age;
String name;
int id=100;
public Person(int age,String name){
this.age=age;
this.name=name;
}
public void eat(){
System.out.print("作为一个人要吃饭");
}
}
package com.hao.zhi.lv.extendTest1;
public class Student extends Person {
int score;
int id=999;
public Student(){
//调用父类的构造器
super(22,"名字未知");
}
public void eat() {
System.out.print("学生要吃有营养的东西");
}
public void study() {
System.out.println("学生:学习知识");
//调用父类的方法
super.eat();
}
//调用父类的属性
public void show() {
System.out.println("调用父类的属性id:" + super.id);
}
}
package com.hao.zhi.lv.extendTest1;
public class SuperTest {
public static void main(String args[]) {
Student s1=new Student();
System.out.println("年龄:"+s1.age+"名字:"+s1.name);
s1.show();
s1.study();
}
}
输出结果如下:
参考来自尚硅谷