更更更!!!!!!!!
1.向上造型………………………………代码复用
(用父类声明一个变量,接受的是子类的对象)
public class UploadDemo {
public static void main(String[] args) {
Aoo o1 = new Aoo();
o1.a = 1;
o1.show();
//o1.b = 2; //编译错误
//o1.test(); //编译错误,超类不能访问派生类的
Boo o2 = new Boo();
o2.b = 1;
o2.test();
o2.a = 2; //正确
o2.show(); //正确,派生类可以访问超类的
Aoo o3 = new Boo(); //向上造型
o3.a = 1;
o3.show();
//o3.b = 2; //编译错误
//o3.test(); //编译错误,能点出来什么,看引用的类型
}
}
class Aoo{
int a;
void show(){
}
}
class Boo extends Aoo{
int b;
void test(){
}
}
超类型的引用指向派生类的对象;
上面Aoo o3 = new Boo();就是用超类Aoo声明o3然后指向派生类Boo创建的对象
能点出来什么,看引用的类型;
能点出来就是说能使用的属性和方法,他能点出来的东西都是所创建的对象本身拥有的东西,Aoo o3 = new Boo();中O3所点出来的东西,都是Boo类中的对象所拥有的。
多种角色都干一样的事情的时候,可以用多种角色的统一造型到超类数组中,实现代码复用。然后通过这个超类创建不同派生类的对象。是为了封装相同的属性和方法而创建了超类。
个人总结思维:首先思考的是对象,我们需要什么东西,然后这个东西有什么属性,方法(行为),然后把属性和方法组合在一起封装在一个类中。然后把很多对象比较,把相同的属性和方法提取出来,封装在另一个类中,这个类就成了这些对象的类的超类(父类)。所以思维上是先有对象,再有类,再有类的超类。
eg:学生/老师/医生都是输出名字+问号……干的事情都一样,就可以将学生/老师/医生统一造型到Person数组中,这样一个for即可……代码复用(具体实例看潜艇日记)
2.方法的重写(override/overriding)重新写、覆盖
发生在父子类中,方法名相同,参数列表相同
重写方法被调用时,看对象的类型
class 餐馆{
void 做餐(){ 做中餐 }
}
//1)我还是想做中餐-----------------不需要重写
class Aoo extends 餐馆{
}
//2)我想改做西餐-------------------需要重写
class Boo extends 餐馆{
void 做餐(){ 做西餐 }
}
//3)我想在中餐基础之上加入西餐--------需要重写(先super中餐,再加入西餐)
class Coo extends 餐馆{
void 做餐(){
super.做餐();
做西餐
}
}
在超类中已经存在的方法,但是在派生类中需要使用时,可以使用重写,重写的可以更改以前的方法,也可以在以前的东西上增加功能。也可以不重写。
重写遵循“两同两小一大”原则:
两同:
方法名相同
参数列表相同
两小:
派生类方法的返回值类型小于等于超类的方法的
void和基本类型时,必须相等
引用类型时,小于或等于(超类大,派生类小)
class Coo{
void show(){}
double test(){ return 0.0; }
Student say(){ return null; }
Person sayHi(){ return null; }
}
class Doo extends Coo{
//int show(){ return 1; } //编译错误,void时必须相等
//int test(){ return 0; } //编译错误,基本类型时必须相等
//Person say(){ return null; } //编译错误,引用类型时必须小于或等于
Student sayHi(){ return null; } //正确,Student小于Person
}
派生类方法抛出的异常小于或等于超类方法的(不知道原因)
一大:
派生类方法的访问权限大于或等于超类的方法的(访问权限以后具体说)