`

我对java继承的理解

 
阅读更多

 

关于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();

 

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

 

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

 

引用另外一个概念:

 

绑定:

 

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

 

  1. 前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。
  2. 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。
好 现在解释上面的原因:

声明变量:

 

 

 

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方法。

 

 

 

解释完毕:

欢迎拍砖。

 

 

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

http://zangweiren.blog.51cto.com/412366/94387

多谢 、

 

0
0
分享到:
评论

相关推荐

    Java 实现继承实例代码

    这个例子展示了Java继承的核心概念,包括: 1. 使用`extends`关键字创建子类。 2. 访问和覆盖父类的方法。 3. 添加子类特有的方法。 4. 多态性的应用。 通过学习这个实例,开发者能够更好地理解和运用Java的继承...

    经典java继承例子

    在这个经典的Java继承例子中,我们将深入理解这一机制。 首先,我们要明确的是,继承的主要目的是减少代码冗余,提高代码的可维护性和可扩展性。在Java中,我们使用`extends`关键字来表示一个类继承自另一个类。...

    Java面向对象之继承练习题.doc

    【Java面向对象之继承练习...通过上述练习,可以深入理解Java中的继承机制,如何定义类和方法,以及如何通过继承扩展功能。同时,练习涵盖了构造方法、属性和方法的重写、多态以及类之间的关系等核心面向对象编程概念。

    JAVA继承的相关知识点

    下面我们将深入探讨JAVA继承的相关知识点。 1. **继承的概念**: - 继承体现了类之间的层次结构,子类继承父类,表示子类是父类的一个特例,具备父类的所有特性但可能有所扩展。 - Java中声明继承使用`extends`...

    Java继承实例源代码

    在这个"Java继承实例源代码"的压缩包中,包含的文件可能提供了关于Java继承和多态性的实际应用示例。 首先,我们来看“继承”这一概念。在Java中,通过使用关键字`extends`,一个类可以声明其为另一个类的子类。...

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    java 类的继承 基础理解

    Java 类的继承基础理解 Java 语言中的继承机制允许一个类继承另一个类的属性和行为,实现代码的重用和继承关系建模。在 Java 中,继承是通过使用 `extends` 关键字来实现的,格式为 `public 子类 extends 父类{}`。...

    java关于继承的思维导图(Xmind)

    这个思维导图详细描绘了Java继承的关键概念和实践,对初学者理解继承机制,以及在实际项目中如何有效利用继承进行代码设计非常有帮助。通过学习和实践这些知识点,开发者可以更好地设计出符合面向对象原则的软件系统...

    java 继承泛型类示例

    了解这些概念后,我们可以看到`GenericClass.java`文件可能包含了关于如何创建和使用继承泛型类的实际代码示例。而`Java.jpg`可能是用于辅助解释的图像,比如类结构图或代码截图。在实际学习过程中,结合代码和图像...

    关于JAVA继承的讲解

    Java 继承是面向对象编程中的一个重要概念,它允许一个类(子类)从另一个类(父类)中继承属性和方法,从而实现代码的复用和类的层次结构。这种方式使得子类能够继承父类的特性,同时可以添加自己的特性和功能,而...

    java中继承的使用案例

    继承的使用 ...重新定义toString()方法,能打印该学生的基本信息,该方法中试对private类型属性姓名、protected类型变量性别、默认访问类型变量年龄直接访问,理解子类对父类不同类型的属性的访问权限;

    Java父类继承代码示例

    在Java编程语言中,继承是面向对象编程的一个关键特性,它允许一个类(子类...在提供的压缩包文件中,你可以找到更多关于Java父类继承的具体代码实例,这些示例将帮助你深化对这一主题的理解,并将其应用到实际开发中。

    JAVA接口与继承实验

    JAVA接口与继承实验 本实验报告主要涉及到JAVA的接口和继承两个重要概念。通过三个实验,逐步介绍了接口的定义和使用...通过阅读本报告,读者能够更好地理解JAVA中的接口和继承关系,并且能够将其应用于实际的编程中。

    继承树.java

    对java中继承的练习,一个简单的例子,通过描述大树的性质来进行理解。

    java继承、多态的简单程序.zip

    这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承(Inheritance) 在Java中,继承允许一个类(子类)...

    java_中关于_继承_的一个小例子.

    下面是一个简单的Java继承示例: ```java // 父类 public class Animal { protected String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + ...

    java基础学习(继承与接口的区别及产生原因)

    通过限制单继承,并引入接口作为替代方案,Java成功地在保持语言简洁性的同时,提供了足够的灵活性和强大的功能,满足了实际开发中对多继承特性的需求。 综上所述,Java中的继承与接口各有其独特的应用场景和设计...

    使用java理解程序逻辑

    初学者可以尝试自己编写简单的Java程序,如计算器、猜数字游戏等,从而加深对程序逻辑的理解。同时,利用IDE(集成开发环境)如Eclipse或IntelliJ IDEA进行编写和调试,可以提高学习效率。 总的来说,"使用Java理解...

    Java--类的继承

    在Java编程语言中,类的继承是面向对象编程的一个核心概念,它允许我们创建新的类(子类)基于...通过实践,尝试创建自己的类层次结构,使用继承、接口和抽象类来解决问题,这将加深对这些概念的理解,并提高编程技能。

Global site tag (gtag.js) - Google Analytics