------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. 结果是YXYZclass 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