继承
//继承概述:当一个类与另一个类之间是一种类似于包含的关系时,我们就可以将这种关系称为继承,如
class Person{
public String name;
public int age;
}
class Student{
public String name;
public int age;
public int num;
}
class Student2 extends Person{ //(Student2继承了Person,它与Student的功能一样)
public int num;
}
继承的好处与特点
/**
* 继承的好处:
* 提供了代码的重复性,解决了代码的臃肿
* 是多态的前提
* 继承的特点:子类继承了父类所有的东西,包括私有,但是子类不能直接访问这些私有的东西,需要通过父类公共方法去访问
* 继承只支持单继承,不支持多继承,但是支持多层继承
* */
继承中的注意事项
/**
* 继承中的注意事项:
*1. 构造方法不能被继承,我们需要在子类中通过super()关键字去访问
* 当父类没有提供无参构造时:
* 我们需要去在父类中创建一个无参构造
* 通过super()关键字去访问父类的有参构造
* 还可以在子类中通过this(),访问本类中的有参构造,间接的去访问父类带参构造
*2.子类继承父类是都会默认去访问父类的无参构造,所以在创建一个子类对象是应该先让父类进行初始化,然后是子类进行初始化
*3.子类与父类的变量问题
* 当子类与父类中变量名称不相同时,分别输出;
* 当子类与父类中的变量名称相同时,
* 先在子类局部位置找,找到就输出,
* 找不到就在子类成员位置找,找到就输出;
* 找不到就在父类成员为找,找到就输出;
* 找不到就是该变量没有定义
*4.子类与父类的成员方法问题
* 成员方法名不相同时分别调用;
* 成员方法名相同时,
* 先在子类成员位置找,找到就调用;
* 找不到就在父类成员位置找,找到就调用;
* 找不到就是该方法没有被定义;
* */
分层初始化例题
class A{
A(){
System.out.println("A");
}
}
class B extends A{
B(){
System.out.println("B");
}
}
class C extends B{
C(){
System.out.println("C");
}
}
public class Text1 {
public static void main(String[] args) {
new C();
}
}//输出A B C (竖列)
多态
/**
* 多态存在的前提:
* 继承关系;
* 方法重写;
* 父类引用指向子类对象;
* 多态中成员访问特点:
* 成员变量:编译看左.运行看左;
* 成员方法(非静态):编译看左,运行看右;
* 静态成员方法:编译看左,运行看左;(静态与类有关,算不上初始化)
* 构造方法:无论子类还是父类,都是对对象进行初始化
* 多态的坏处:
* 父类引用指向子类对象;
* 父类不能使用子类的特有功能;(如果需要使用子类的特有功能需要向下转型)
*/
class Person{
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person{
public void eat() {
System.out.println("学生吃饭");
}
public void study() {
System.out.println("学生学习");
}
}
public class Text2 {
public static void main(String[] args) {
Person p = new Student();//向上转型
p.eat();
// p.study(); //不能调用子类特有功能
Student s = (Student)p;//向下转型
s.study();
}
}