问题:

1、比如两个类父类:Person 子类 Student extends Person在使用时候,这样写:Person person=null; //声明对象person=new Student(); //创建对象这样看来 声明的时候,是父类,而在产生对象的时候,实际的对象是子类。怎么理解???

知识点:

Java的多态性

面向对象编程有三个特征,即封装、继承和多态。封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢?方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。

解释:

要理解多态性,首先要知道什么是“向上转型”。

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat();

实例化一个Cat的对象,这个不难理解。但当我这样定义时:

Animal a = new Cat();

这代表什么意思呢?

很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

看下面这段程序:

class Father{

public void func1(){

func2();

}

//这是父类中的func2()方法,因为下面的子类中重写了该方法所以在父类类型的引用中调用时,这个方法将不再有效

//取而代之的是将调用子类中重写的func2()方法

public void func2(){

System.out.println("AAA");

}

}

class Child extends Father{

//func1(int i)是对func1()方法的一个重载由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用

//所以在下面的main方法中child.func1(68)是不对的

public void func1(int i){

System.out.println("BBB");

}

//func2()重写了父类Father中的func2()方法如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法

public void func2(){

System.out.println("CCC");

}

}

public class PolymorphismTest {

public static void main(String[] args) {

Father child = new Child();

child.func1();//打印结果将会是什么?

}

}

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

那么该程序将会打印出什么样的结果呢?很显然,应该是“CCC”。

总结:

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

通俗理解:

父类类型的引用指向子类的对象。就你这个test3,你记住,它只能调用自己的方法,但是如果自己的方法被子类覆盖了,那么调用的就是子类的。你的gettest3这个方法是子类独有的,所以父类类型的引用test3用不了。 简单的说,就是自己用自己的,儿子有父亲一样的,就用儿子的。省点钱是点。儿子独有的,父亲不会用,所以不能用 。

标签:func2,调用,java,子类,方法,中父,父类,重写

来源: https://www.cnblogs.com/kakaisgood/p/14155626.html

java父类声明子类实现_java中父类声明子类实例化相关推荐

  1. java父类调用子类方法_Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  2. java 父类访问子类_java中父类访问子类变量

    我们都知道,子类的方法可以访问父类的实例变量,这是因为子类继承父类就会获得父类的成员变量和方法:但是父类的方法水能访问子类的实例变量,因为父类根本无法知道它将被哪个子类继承,它的子类将会增加怎样的成员 ...

  3. java子类引用指向父类对象_java 中父类引用指向子类对象时

    继承和方法重写已经很熟悉了,这次 主要验证一下,当一个父类的引用指向一个对象的时候,它会调用子类的方法,而不是父类的. 引用在栈内存中存在对象的内存地址.真正的对象(通过 new Student()创 ...

  4. java继承序列化_java中序列化之子类继承父类序列化

    当一个父类实现Serializable接口后,他的子类都将自动的实现序列化. 以下验证了这一点: package Serial; import java.io.Serializable; public ...

  5. java子类和父类实例_java中父类与子类之间的转换示例

    java中父类与子类之间的转换示例有以下三点: 示例一 父类强制转子类 pre class="brush:php;toolbar:false">Father f = new ...

  6. java中子类与父类强制转换_java中父类强制转换成子类的错觉

    引言:父类引用指向子类对象在java中十分常见,比如: Object object=new a();//a是一个类名 但是有时候我们看见子类引用指向了父类对象,就是上边的反过来,比如 图片中圈1标识的 ...

  7. java中父类和子类_java中父类和子类的关系

    子类继承父类,子类中就拥有父类的所有属性和方法.在创建子类的实例的时候,父类和子类到底是如何执行的呢?还有静态代码块和非静态代码块和构造方法的执行顺序? 1.先执行父类的静态代码块,然后再子类静态代码 ...

  8. java继承怎么老是出错_java中子类继承父类时总是出错怎么回?

    权限public > 包(package,默认,也就是什么权限修饰符都不加) > proteced > private 子类继承了父类的所有成员(这样说实际是不对的),但只能访问父类 ...

  9. java编译异常有哪些_java 中 哪些异常必须声明并捕获,否则产生编译错误

    RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类. 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws ...

最新文章

  1. C语言:在屏幕上打印杨辉三角形
  2. Open***+AD+Google authenticator 安装、配置
  3. 深度解析mysql登录原理
  4. WINDOWS 蓝屏错误代码说明一览表
  5. hdfs yarn hbase pid文件被删除解决办法:修改hadoop-daemon.sh yarn-daemon.sh hbase-daemon.sh中PID_DIR存储路径
  6. PendingFileRenameOperations键值!
  7. 【bzoj2555】Substring【后缀平衡树入门】
  8. NPOI读取Excel生成DataTable转为Json后利用LitJons读取
  9. Kube-Proxy IPVS模式源码分析
  10. 模拟——魔法少女小Scarlet(洛谷 P4924)
  11. python2 和 python3 在print时的细微差别 (sep等操作)
  12. js判断url是否有效
  13. live555源码编译(win7+vs2010)
  14. 阿里云华为云对比分析
  15. spring Clound EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEW
  16. CKfinder3版本冲突
  17. Ant 编译 JRE version less than 1.8 is not supported.
  18. python工作技巧_能让你工作事半功倍的python小技巧大合集
  19. unity中Animator controller无法给动作添加motion的问题
  20. 如何查看网站的收录与排名

热门文章

  1. webqq登录协议分析
  2. 新加坡管理大学何盛烽招收计算机视觉、图像生成方向全奖博士
  3. react 调用摄像头
  4. 软件Beta测试悄悄变味
  5. 用户生命周期价值模型LTV
  6. 【python基础-04】python 面向对象编程—飞机实例化例子
  7. ios10怎么设置电池颜色_iOS10省电设置技巧 iOS10怎么最省电
  8. 境外聚合支付中,微信和支付宝的不同理念
  9. LWN:针对透明巨页的shrinker!
  10. 【译文】利用Palette为android应用着色