关于java继承和多态的文章已经很多了,如果你对java的继承和多态已经有很好的理解,请绕过本变文章,

如果你对java的继承和多态不是很理解,还在找寻这方面的东西,那这篇文章可能对你有所帮助。

首先声明:

java里面轮子已经很多了,我不想在发明轮子,

但是这里也不是对轮子的照搬描述,

这里是我个人对java继承和多态的理解,

强调:本文着重说明的是继承,多态可能会涉及一些,不过这些都是为了辅助继承的理解的。

罗嗦了那么多,现在开始:

java的三大特性,封装、继承、多态。这里介绍继承。

继承:

“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能[这段话来自互联网,如果有版权问题,请联系处理]

这里面有一个重要的表述:继承可以使得子类具有父类的各种属性和方法,

对很神奇的功能,继承可以实现代码的复用,也就是说,子烈可以直接使用父类的方法,【这里哪些方法能在子类中使用那些不能使用不作讨论】

多态:

多态是又一个重要的基本概念,继承是多态得以实现的基础。从字面上理解,多态就是一种类型表现出多种状态。比如说子类添加了一个方法或者属性之后,会成为一个新的类,这个类和其他子类不一眼,和父类也不一样,但是同属于一个父类型,都可以转化为父类型。而不同的子类就可以称为是多态

说了那么多,你的理解的? 恩 莫急先看一个问题:

这是前几天遇到的一个问题,具体原题目是什么记不太清楚,不过大致就是下面的样子:

package com.hung.test;

public class T {

public static void main(String[] args) {

A1 a1 = new A2();

String s = new String("");

Object s1 = "";

double s2 = 12.1;

a1.t1(s);

a1.t1(s1);

a1.t1(s2);

}

}

class A1 {

protected void t1(Object obj) {

System.out.println("A1");

}

public void t1(String obj) {

System.out.println("A1-str");

}

}

class A2 extends A1 {

public void t1(String obj) {

System.out.println("A2-str");

}

public void t1(Object obj) {

System.out.println("A2-obj");

}

public void t1(double obj) {

System.out.println("A2-double");

}

}

考一下你:执行结果会是什么?

好吧 看结果:

A2-str

A2-obj

A2-obj

是不是和你想的不一样? 如果一样那下面的内容你可以不看了。

那么再看下面一段代码 :

package com.hung.test;

public class T {

public static void main(String[] args) {

A1 a1 = new A2();

System.out.println(a1.getClass().getName());

String s = new String("");

Object s1 = "";

double s2 = 12.1;

a1.t1(s);

a1.t1(s1);

a1.t1(s2);

A2 a2 = new A2();

a2.t1(s);

a2.t1(s1);

a2.t1(s2);

}

}

class A1{

protected void t1(Object obj){

System.out.println("A1");

}

public void t1(String obj){

System.out.println("A1-str");

}

}

class A2 extends A1{

public void t1(String obj){

System.out.println("A2-str");

}

public void t1(Object obj){

System.out.println("A2-obj");

}

public void t1(double obj){

System.out.println("A2-double");

}

}

执行结果会是什么呢 ?

好吧,看下结果:

com.hung.test.A2

A2-str

A2-obj

A2-obj

A2-str

A2-obj

A2-double

好了,问题出来了?

为什么两次

A1 a1 = new A2();

a1.t1(s);

a1.t1(s1);

a1.t1(s2);

A2 a2 = new A2();

a2.t1(s);

a2.t1(s1);

a2.t1(s2);

的执行结果不一样:

看下代码已有一个地方不一样

就是变量声明的类型

也就是说

A1 a1 = new A2();

A2 a2 = new A2();

的问题。

他们俩不同,一个是父类,一个是子类。

我勒个去 都是

new A2();

对象,为什么执行出来就不一样呢,

下面会介绍执行结果为什么会这样。

引用另外一个概念:

绑定:

将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定,

前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。

后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。

好 现在解释上面的原因:

声明变量:

A1 a1 = new A2();

其实a1是一个A1对象的引用,只不过有点特殊的地方时,a1指向的是A2的对象,这会有什么影响呢?

编译器并没有那么聪明,在编译期间,会认为我要执行的是A1的t1()方法,当我们开始运行期执行方法的时候起初还是认为要执行A1的方法,但是执行方法的时候中间多了一个过程,见动态绑定,他会把要执行的方法和具体的所属对象进行关联,也就是是说,当运行期执行代码的时候,才会找到原来我执行的是A2的t1()方法,但是A2中有几个t1,他会找到哪个呢,我的理解是他会根据方法签名来确认到底执行哪个方法,【方法前面就是方法的名称,参数,参数类型,个数,修饰符,等。】

所以如果a1执行t1传递过来的参数是object的,那么会执行a2的参数为类型为object的t1方法,

同理,如果a1执行t1参数为String的,那么会执行a2的参数类型为String的t1方法。

解释完毕:

欢迎拍砖。

其中文件中引用了其他人博客的内容,地址如下:

多谢 、

Java继承个人的理解_我对java继承的理解相关推荐

  1. java工程师有什么要求_什么是java,java工程师应该具备哪些能力?

    这两年,虽然各种各样的新兴语言不断涌现,收获了一大批迷粉,但是java的地位,却始终难以撼动.作为一门成熟的,经久不衰的语言,java吸引了越来越多的人,想加入进来.但是,很多人在选择java前,或多 ...

  2. 对数据可视化的理解_使数据可视化更容易理解

    对数据可视化的理解 Data is weaving its way into almost all aspects of our lives since the past decade. Our ab ...

  3. java中注解的解析_全面解析Java中的注解与注释

    注解一.什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一个特 ...

  4. java程序如何解代数方程_如何用java编程来解决方程问题?

    展开全部 public class Fc { int a, b, c; public void gen() { double i; double j = 1.0; double k = 1.0; i  ...

  5. java和php区别吗_请说说Java和PHP的区别

    Java(计算机编程语言) Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.(推荐学习:P ...

  6. 计算机JAVA相关说课稿_面向对象程序设计-java说课稿

    面向对象程序设计-java说课稿 面向对象程序设计-JAVA说课稿,计算机系 毕景霞,目录,一.说教材 二.说教学目标 三.说重点难点 四.说教学方法 五.说教学内容 六.教学效果及总结,(一)教材的 ...

  7. java 面试题合集_撩课-Java面试题合辑1-50题

    1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...

  8. java怎么提升编程能力_怎样提升java编程能力

    1 怎样提升java编程能力 在互联网迅猛发展的时代,而我们如果对互联网一无所知,那就相当于文盲.所以很多人都想去了解它,去学习他.而作为互联网的产物--java,是一门非常不错的技术,学精通之后,你 ...

  9. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  10. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

最新文章

  1. Android 4.0的图形硬件加速及绘制技巧
  2. approxPolyDP函数
  3. php普通索引和唯一索引,MySQL中普通索引和唯一索引的区别详解
  4. linux 多源代码文件编译
  5. Hadoop Yarn容量调度器特点和分配算法介绍
  6. CSS3 2D 转换
  7. Netty writeAndFlush() 流程与异步
  8. linux 文件重命名_如何在 Linux 上重命名一组文件 | Linux 中国
  9. mysql 备份 一张表_mysql 备份表的一个方法
  10. CC2530通用I/O
  11. QT动态库和静态库使用
  12. 小米11真机现身:稳了!
  13. [转载][HASS.IO] 【HASSOS安装】成功安装HASSOS 1.9(避开了大部分坑版)
  14. 基于jsp+servlet的 新闻管理系统。
  15. zbbz加载成功用不了_cad加载应用程序不能加载
  16. 伺服位置模式参数设置
  17. dnf打团正在连接服务器进不去是吗鬼,DNF韩服大转移版本开启 上线送迷你女鬼剑宠物...
  18. 百度网盘突破下载限速
  19. Java美颜相机(1)图像处理
  20. 石乙己——孔乙己程序员版

热门文章

  1. 什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别
  2. 【算法系列之线索化二叉树,前序线索化、中序线索化、后序线索化以及遍历~】
  3. Struts2-拦截器原理
  4. Java重载容易引发的错误—返回类型
  5. Java实现doc或xls转PDF
  6. securecrt7.0.0合并多个窗口
  7. JAVA——prepareStatement中SQL语句中占位符(?)替换表名和字段名
  8. Middle of the Contest
  9. 记一个mysql分页查询优化试验
  10. Python实训-15天-博客汇总表