------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:继承(掌握)
(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,为什么呢? 因为子类继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化。
注意:子类每一个构造方法中第一条语句都会被系统默认为:super(),不论你写与不写,我都会占据子类构造方法第一句。
b:父类中如果没有无参构造方法,怎么办?A:Override和Overload的区别?
方法重写:子类中出现了和父类中一模一样的方法声明。又称方法覆盖,方法复写
方法重载:本类中出现了方法名一样,参数列表不同的方法,与返回值无关。
class X{ Y b=new Y();//Y X(){ System.out.println("X");//X } } class Y{ Y(){ System.out.println("Y"); } } public class Z extends X{ Y y=new Y();//Y Z(){ System.out.println("Z");//Z } public static void main(String[]args){ new Z(); } }输出结果:先初始化父类:Y X,再初始化子类:Y Z. 结果是YXYZ
class Person{ private String name; private int age; public Person(){} public Person(String name,int age){ this.name=name; this.age=age; } 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; } } class Student extends Person{ public Student(){} public Student(String name,int age){ super(name,age); } } class Test3{ public static void main(String[]args){ Student s=new Student(); s.setName("小石头1"); s.setAge(22); System.out.println(s.getName()+"-----"+s.getAge()); Student s2=new Student("小石头2",22); System.out.println(s2.getName()+"-----"+s2.getAge()); } }
二::多态(掌握)
(1)同一个对象在不同时刻体现出来的不同状态。如:猫 m=new 猫(); 动物 d=new 猫();(猫可以是猫,也可以是动物) 水(液体 固体 气态)
(2)多态的前提:
A:有继承或者实现关系。
B:有方法重写。(通过方法重写来体现不同状态,没有重写也可以,但是如果没有重写,多态就没有意义了)
C:有父类或者父接口引用指向子类对象。Fu f=new Zi();
多态的成员访问特点:
A:成员变量
编译看左边,运行看左边。(因为变量不能被重写)
B:静态方法
编译看左边,运行看左边。(因为静态方法只和类相关,算不上重写,所以访问的还是左边)
C:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
D:成员方法
编译看左边,运行看右边。
代码体现:
class Test1{
public static void main(String[]args){
Fu f=new Zi();//访问父类构造方法,访问子类构造方法
System.out.println(f.num);//10访问父类的变量
f.show();//访问父类静态方法
f.method();//访问子类成员方法
}
}
多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
为什么?
因为成员方法有重写。
(4)多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
(5)多态的弊端:
父不能使用子的特有功能。
现象:
子可以当作父使用,父不能当作子使用。
解决办法:
A:创建子类对象的调用方法即可,(这种方式可以,但是很多时候不合理,而且创建对象过多太占内存)
B:把父类的引用强制转换为子类的引用(向下转型)
(6)多态中的转型
A:向上转型
从子到父 Fu f=new Zi(); 父类引用指向子类对象。
B:向下转型
从父到子 父类引用转为子类对象。 Zi z=(Zi)f //要求该f必须是能够转换为Zi的。
(7)孔子装爹的案例帮助大家理解多态
(8)多态的练习
A:猫狗案例
B:老师和学生案例
黑马程序员----java基础----继承与多态,附相关面试题
原文地址:http://blog.csdn.net/qiushi_1990/article/details/46436873