继承:
package cn.hncu.program.extends_;
import org.junit.Test;
/**
* 项目名:继承类
* 时间 :2017-9-12 上午10:35:04
*
* 1.测试子类调用父类的构造方法来为父类初始化成员变量。
*
*/
public class Extends {
@Test
public void t1(){
//Person p = new Person();
Student s = new Student("Jack", 22, 50.1, "Java", 1.0);
System.out.println(s);
//System.out.println(p);
}
@Test
public void t2(){
Student s = new Student();
}
}
class Person{//默认继承Object类,因此可以在任何类中默认使用Object类的方法。
private String name = "Jack";
private int age;
private double weight;
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 double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
/*
* 1.空参构造方法,如果写了空参构造方法,系统不会给我们再加默认空参构造方法,
* 如果没有写空参构造方法及其有参构造方法,系统会自动帮我们加上默认空参构造方法。
*/
public Person() {
/*
* 2.【super】的意思是:当前的类调用其父类的构造方法。此时调用父类Object类
* 3.子类构造方法中,如果我们不显式用super(...)调用父类构造方式,Java会帮我们加.
* 4.这一句可以省略,这是构造一个Object对象,即使不写系统会帮我们自动加上的。
* 5.super();是调用父类空参方法,super带参数是表示调用父类带参数构造方法。
* 6.不能在静态方法中使用super。
*
*/
super();
}
public Person(String name, int age, double weight) {
super();
this.name = name;
this.age = age;
this.weight = weight;
}
/*【覆盖方法】:
* 1.覆盖:子类中和父类相同的方法(相同的方法名和参数列表)。
* 2.非静态的方法不能覆盖父类的静态方法。
* 3.覆盖方法:方法名和参数列表必须和父类的一致,返回类型也必须和父类的一致。
* 4.子类覆盖方法的约束: 前不能小,后不能大。
* 子类方法的权限不能低于父类的;
* 子类方法抛出的异常不能比父类大;
*
* 【子类覆盖父类的成员方法】:
* 1.子类覆盖父类方法,既可以完全重写,也可以扩展父类方法的功能。
* 2.覆盖父类方法时,子类方法的访问权限不能小于父类方法的访问权限。
* 3.覆盖表现为父类与子类之间方法的多态性。
* 程序运行时,究竟执行覆盖同名方法中的哪一个,取决于调用与该方法的对象所属的类是父类还是子类。
* 4.即父类调用父类的成员方法,子类对象调用子类的成员方法。
*
* 【子类重载父类成员方法】:
* 1.子类重定义了父类成员方法,如果参数列表不同,,则子类重载了继承来的该成员方法。
* 2.当子类成员方法仅重载而没有覆盖父类同名成员方法时,重载的多个同名成员方法之间能够
* 通过调用时的实际参数而相互区别,不需要使用super引用。
*/
public String toString(){
return name+","+age+","+weight;
}
}
/*
* 【extends的特性】:
* 1.子类可以继承父类的非private类型的成员变量和普通成员方法。
*
*/
class Student extends Person{
private String speciality;
/*
* 【隐藏父类成员变量】:
* 1.子类中的成员变量和父类中的成员变量完全相同的时候,此时隐藏了父类的成员变量。
*/
private String name="Rose";
public String getSpeciality() {
return speciality;
}
public void setSpeciality(String speciality) {
this.speciality = speciality;
}
/*
* 【注意】:
* 1.this和super不能同时存在。
* 2.super是可以调用父类的构造方法,this是可以调用子类的构造方法。
* 3.因此调用this会屏蔽掉super调用父类构造方法。
*/
public Student() {
this("Jack", 2, 20.1, "1", 1.1);
//super();
}
/*
* 【用子类的构造方法为父类成员变量初始化值】:
* version为构造方法的版本号
*/
//方式一:调用父类的setter方法进行设置值:
public Student(String name,int age,double weight,String speciality,int version){
/*【子类中的this、super】:
* 1.对于子类中的this.成员变量/成员方法:先到子类中找,若没有就到父类中找,找到即调用。
* 2.对于子类中的super.成员变量/成员方法:直接到指定的父类中调用。----super.setWeight(weight)
* 3.访问父类的成员:super.成员变量名 或super.成员方法名(....)
* 4.访问父类的构造方法:super(....)
*
*/
this.setName(name);
this.setAge(age);
//this.setWeight(weight);
super.setWeight(weight);
this.setSpeciality(speciality);
}
//方式二:直接用super调用父类的构造方法:
public Student(String name,int age,double weight,String speciality,double version){
//super();
super(name, age, weight);
this.setSpeciality(speciality);
}
}