4-15类与类之间的继承与多态

继承

//继承概述:当一个类与另一个类之间是一种类似于包含的关系时,我们就可以将这种关系称为继承,如
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();
	}
}

猜你喜欢

转载自blog.csdn.net/ws1995_java/article/details/80010041