(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~
(1)多态是一种运行期的行为,而不是编译期的行为。
(2)换句话说,java执行环境,只有到真正运行程序的时候,才知道这个Animail b = new Cat();b到底指向的是什么。
(3)在编译的时候,它只知道b是一个Animal类型的,但是它具体指向的是谁,它其实不知道。
(4)虽然在源程序里面我们知道它指向的是谁,但是java编译器是不知道它指向的是谁的。
多态可以实现晚绑定,由父类的引用指向子类的对象,这只是它的一个表面现象。
(1)示例代码:
public class PolyTest5{
public void run(){
}
}
class Car{
public void run(){
System.out.println("car is runing!");
}
}
class BMW extends Car{
public void run(){
System.out.println("BMW is running!");
}
}
class QQ extends Car{
public void run(){
System.out.println("QQ is running!");
}
}
(2)需求,PolyTest5中的run方法,既要处理BMW的run(),又要处理QQ的一个run()。那么按照通常的写法
public class PolyTest5{
public void run(BMW bmw){
bmw.run();
}
public void run(QQ qq){
qq.run();
}
}
public class PolyTest5{
public void run(BMW b){
b.run();
}
public void run(QQ qq){
qq.run();
}
public static void main(String[] args){
PolyTest5 test = new PolyTest5();
//要处理BMW的run(),那么先生成BMW的对象
BMW bmw = new BMW();
test.run();
QQ qq = new QQ();
qq.run();
}
}
class Car{
public void run(){
System.out.println("car is runing!");
}
}
class BMW extends Car{
public void run(){
System.out.println("BMW is running!");
}
}
class QQ extends Car{
public void run(){
System.out.println("QQ is running!");
}
}
public class PolyTest5{
public void run(BMW b){
b.run();
}
public void run(QQ qq){
qq.run();
}
public static void main(String[] args){
PolyTest5 test = new PolyTest5();
//要处理BMW的run(),那么先生成BMW的对象
BMW bmw = new BMW();
bmw.run();
QQ qq = new QQ();
qq.run();
}
}
class Car{
public void run(){
System.out.println("car is runing!");
}
}
class BMW extends Car{
public void run(){
System.out.println("BMW is running!");
}
}
class QQ extends Car{
public void run(){
System.out.println("QQ is running!");
}
}
(1)车不可能只有这两辆,如果新增加一些车辆,如奔驰。
(2)增加一个车就要增加一个子类,去继承Car。
(3)然后在PolyTest5类中要处理run方法,就需要增加新的车辆的run方法。
(4)不是说不行,增加一百个方法也可以,但是这显然不是一个好的办法。
(5)为什么不写一个方法,能处理所有的情况呢?来一个车,就搞定一个,再来一个车,就再搞定一个,一个方法能解决所有的车,这能体现出来多态的特点。
public class PolyTest5{
/*
public void run(BMW b){
b.run();
}
public void run(QQ qq){
qq.run();
}
*/
/**
一个方法搞定所有的变化
因为以上注释了的方法中所有方法签名参数的类,都继承了Car这个类,所以在方法签名中,只需要将参数换为这些类的父类即可,用它们父类的引用,去指向
具体的子类。即在方法运行期去决定使用哪一个具体的子类。 由new 出来的具体子类对象给下面的这个run方法签名中的参数父类引用car赋值,即用car去指向具体的子类对象。
*/
public void run(Car car){
car.run();
}
public static void main(String[] args){
/*
PolyTest5 test = new PolyTest5();
//要处理BMW的run(),那么先生成BMW的对象
BMW bmw = new BMW();
test.run();
QQ qq = new QQ();
qq.run();
*/
PolyTest5 test = new PolyTest5();
Car car = new BMW();
/*
因为run()方法接收的是一个Car类型的变量,相当于把Car赋值给了car
*/
test.run(car);
QQ qq = new QQ();
test.run(qq);
}
}
class Car{
public void run(){
System.out.println("car is runing!");
}
}
class BMW extends Car{
public void run(){
System.out.println("BMW is running!");
}
}
class QQ extends Car{
public void run(){
System.out.println("QQ is running!");
}
}
(1)增加一百辆车,类肯定是省不了的,增加一百种车就要增加一百个子类,但是1个方法可以搞定后面所有的车了。因为只要extends Car这个父类的话,我都可以作为这个参数传进去。
(2)根据多态,子类数据都可以传进去。所以一个方法就可以应付所有的车。所以不用增加100个方法。这是多态给我们带来的一个好处。它屏蔽掉了子类之间的差异性。
(3)我用一个公共的父类去标识着我的方法的参数,不管子类如何变化,增加多少子类,还是发生什么变化,只要增加的这些子类都继承了我的这个父类,你都可以作为参数传递到我的方法里面去。
但是1个方法可以搞定后面所有的车了。因为只要extends Car这个父类的话,我都可以作为这个参数传进去。
(2)根据多态,子类数据都可以传进去。所以一个方法就可以应付所有的车。所以不用增加100个方法。这是多态给我们带来的一个好处。它屏蔽掉了子类之间的差异性。
(3)我用一个公共的父类去标识着我的方法的参数,不管子类如何变化,增加多少子类,还是发生什么变化,只要增加的这些子类都继承了我的这个父类,你都可以作为参数传递到我的方法里面去。
(4)如果没有多态,传什么类型,就声明什么类型,代价太大,也是可以做出来的,但是这个动作太大了,得不偿失。所以对于这种情况,最好是声明一个父类型的引用作为一个引用的参数,然后将子类具体的对象,传过去就可以了。