继承
1.继承的作用:
- 基本作用:子类继承父类
- 主要(重要)作用:因为有了继承,才有了方法覆盖和多态
2.继承的特性:
- java只支持多继承,但是支持间接继承
- 子类继承父类,除构造方法不能继承之外,剩下都可以继承,但是私有的属性无法在子类中直接访问,可以通过间接的手段访问
- 这种继承:子类继承父类的方法,是将父类继承过来的方法归为自己所有,那么子类调用时不是父类的方法,而是它自己的方法。
- 如果一个类没有显示的继承任何类,则默认继承Object类(Java继承树的根)
3.什么时候继承?
- 凡是采用“is a”能描述的,都可以继承
- 在考虑两个类继承之前,先考虑两个类组合的效果
- 例如: cat is Animal Dog is Animal
4.继承的缺点:
耦合度高,父类修改,子类受牵连
例如:
//如下将Student,Teacher泛化为Person类:
public class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
//置取方法
public void setName(String name){
this.name = name;
}
public String getName(void){
return this.name;
}
public void display(){
System.out.println("姓名:" + name);
}
}
Student类:
public class Student extends Person{
private double grade;
public Student(String name, int age, double grade){
super(name, age);
this.grade = grade;
}
public void display(){
System.out.println("成绩: " + this.grade);
}
}
public class ExtendsTest01{
public static void main(String[] args){
Student s = new Student("Li Si", 23, 100);
//getName()是子类从父类继承过来的方法
System.out.println("姓名:" + s.getName())
}
}
分析Java源码中的继承
/**
* Object.java中
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
public class ExtendsTest02{
public static void main(String[] args){
//创建一个对象
ExtendsTest02 ts = new ExtendsTest02();
String retValue = ts.toString();
System.out.println(retValue);
//如果直接输出"引用"?
System.out.println(ts);
}
}
分析:
- ExtendsTest02类默认继承Object类,所以是子类对象调用父类的实例方法。
- 输出结果"等同"看作调用对象在堆内存中的地址,是实际地址经过“哈希算法”计算出的十六进制地址
- 如果直接输出"引用"
- println方法会先自动调用“引用.toString()”
- 然后输出toString()方法的结果
System.out.println
public class Test{
//静态变量
static Student s = new Student();
//入口
public static void main(String[] args){
//System.out.println("Hello");
//一样的结构
Test.s.exam();
}
}
class Student{
//实例方法
public void exam(void){
System.out.println("考试....");
}
}