`
DBear
  • 浏览: 229058 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类

Java继承应用之小结

阅读更多

    本人瞬间记忆综合症实在过于严重,经常头一天看懂记住的东西第二天就忘记,忘记后又重复头一天的学习过程,着实浪费时间。比如Java子类父类这种简单的东西,我已经记住、忘记、记住、忘记的循环了不知几个轮回了,为了节省时间,我觉得还是总结一下,加以记录比较好,去掉那些混淆我记忆的汤汤水水,只留干货。

 

    继承的概念就不啰嗦了,直接说应用。

 

 

1、如果父类拥有自定义constructor,但并没有定义不带参constructor,那么子类也一定要自定义constructor,否则子类会报 Implicit super constructor SuperClass() is undefined for default constructor. Must define an explicit constructor(因为子类会自动调用父类的无参构造函数,但此函数又不存在,所以报错)。自定义构造函数的参数可与父类不同。

 

2、子类自定义构造函数的首行要显式的调用父类的某一构造函数进行初始化,如果不显式的调用,那么子类构造函数就会调用父类默认构造函数(即无参构造函数),此时如果父类没有无参构造函数,那么就会报 Implicit super constructor SuperClass() is undefined. Must explicitly invoke another constructor

 

3、子类不能直接使用和读取父类的private数据,要通过父类提供的public access方法,即getter和setter。

 

4、如果子类重写了父类的某个method,那么此时子类要调用父类的方法就需要用super.someMethod()的形式调用,否则系统会报运行时错误 java.lang.StackOverflowError(因为系统反复调用的都是子类的重写方法,造成死循环)。

 

5、重写的意思是:返回值类型,方法名,参数类型和个数都要相同(返回值类型在SE5.0时也可以不同)。

 

6、子类重写父类的方法,子类方法不可降低父类方法的作用域,如:父类某方法的作用域是protected,那复写方法不可以是friendly和private,只能是protected或public。

 

 

7、可以将子类对象赋给父类型变量,即 SuperClass e = new SubClass(), 反之不可; 但编译器仍只认为e属于SuperClass类型,因此不能调用SubClass的特有成员和方法(即新增的方法,而不是重写的方法),但可以调用被重写了的方法,并且由于动态绑定,e所调用的方法将按照子类中的方法逻辑执行。

 

8、子类无法覆写父类的private方法,虽然编译可通过,但实际上覆写并未成功,而只是产生了一个新方法而已。见下面的代码

class BaseClass {
   private void g() {
      System.out.println("BaseClass.g()");
   }
} 


class DeriveClass extends BaseClass {
   public void g() {
     System.out.println("DeriveClass.g()");
   }

}

public class Test {
    public static void main(String[] args) {
        BaseClass p = new DeriveClass();
        //p.g();   you can't call  the method, because g() is not overriden but new added method.

    }

}

 

9、如果想禁止某类被继承,那么可以将此类定义为final class,此时类中所有的方法都被自动置为final型;如果仅要禁止某方法被重写,可以只将方法定义为final。我们平时用到烂的String类就是final型的,所以为我们无法继承该类。 

 

 

10、Java编程中,某类型的对象可以转化为另一种类型,这个转化过程叫转型(Casting)。这种转型可以发生在primitive型数据中,也可发生在对象中,当发生在对象上时就有一定的要求了:首先,互相转型的对象应该要有继承关系。因此像如下这种转型在编译时就是错误的:

Employee e = new Employee(); // Employee与Date没有任何关系
Date c = (Date) e;

  

   转型有两种:向上转型和向下转型。

   向上转型(Upcasting):先看下面的代码

class Instrument {
  public void play() {}
  public static void tune(Instrument i) {
    i.play();
  }
}

class Wind extends Instrument {
  public static void main(String[] args) {
    Wind flute = new Wind();
    Instrument.tune(flute);  //upcasting
  }
}

    这段代码中,Instrument类中的tune方法本来接受一个Instrument类型的引用,但是Wind.main()函数调用tune时,传入的却是Wind类型引用,编译器依旧可以接受,这中间显然发生了一种转换,即“将子类引用转换为父类引用”的转换,这种转换就叫“向上转型”。因为当我们在做向上转型时,是将一种特殊型别转换为通用型别,对class接口产生的唯一效应是“减少”而不是“新增”方法,因此我们认为“向上转型”是安全的,无需特殊声明就可进行。举个例子,一个富豪想自愿变成一个普通人显然“安全”,但反之,一个普通人想一下子拥有富豪的特权,那没那么容易,要经过资格审核了……。

    上面那个需要审核的就是“向下转型”(downcasting),即父类到子类的转换。还是先看代码:

Instrument gitar = new Instrument(); 
Instrument flute = new Wind();

Instrument i = flute;  // compiling error, Type mismatch: cannot convert from SuperClass to SubClass
Instrument i = (Wind)flute;   // pass
Instrument i = (Wind)gitar ;  // runtime error, ClassCastException

    由上面这个例子,我们可以看出,Java编译器和虚拟机对于“向下转型”的审核还是很严格的,不光要增加"(SubClassName)"的标记,还要保证被转型的父类引用确实“有资格”转型。也就是说只有被指定指向了子类的父类引用才可以被转型成子类,像上例中的flute引用,而gitar引用显然不符合。也可以用"instanceof"来判断一个对象引用是否克被转型成目标类型。

我们在实际项目应用中,“向上转型”和“向下转型”应用都很广泛,以Collection到List的转型居多。

 

11、抽象类不能实例化,但可以用来定义一个变量,但是变量要指向继承它的一个非抽象子类实例。

 

分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    超详细Java入门到精通自学视频课程-10、继承:构造器特点、this、super小结.rar

    另外,Java还可以被用来编写容量很小的应用程序模块或者applet,做为网页的一部分使用。applet可使网页使用者和网页之间进行交互式操作。 Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口...

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    Java语言程序设计实验指导书

    本实验指导书基本上贯穿了整个Java语言的全部核心的内容,希望同学们通过本实验指导书的提示,作好预习,独立或合作进行实验,并在实验后完成实验报告和实验小结。 目 录 实验1:Java开发环境的熟悉 1 实验2: Java...

    Java测试新技术TestNG和高级概念.part1

    1.5 本章小结 第2章 测试设计模式 2.1 针对失败而测试 2.2 工厂 2.3 数据驱动测试 2.4 异步测试 2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 ...

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    Java语言程序设计

    1.5.2 数组的创建 1.5.3 数组元素的初始化 1.5.4 数组的引用 1.5.5 多维数组 1.6 本章小结 习题第2章 类与对象的基本概念 2.1 面向对象的程序设计方法概述 2.1.1 抽象 2.1.2 封装 2.1.3 继承 2.1.4 多态 ...

    Java测试新技术TestNG和高级概念.part2

    1.5 本章小结 第2章 测试设计模式 2.1 针对失败而测试 2.2 工厂 2.3 数据驱动测试 2.4 异步测试 2.5 测试多线程代码 2.6 性能测试 2.7 模拟和桩 2.8 依赖的测试 2.9 继承和annotation范围 2.10 测试分组 2.11 ...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    21天学通Java-由浅入深

    134 7.5.1 什么是静态变量 134 7.5.2 静态变量的访问 135 7.5.3 什么是静态常量 137 7.6 综合练习 139 7.7 小结 140 7.8 习题 140 第8章 继承(精彩视频:72分钟) 141 8.1 什么是继承 141 8.1.1 类的继承 142 8.1.2...

    Java典型模块

    1.4 小结 第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    Java 2平台安全技术-结构,API设计和实现

    2.4 签名应用小程序 15 2.5 关于安全错误及其修复的简要历史 16 第3章 JDK1.2安全结构 19 3.1 起源 19 3.2 为什么需要一个新型的安全结构 19 3.2.1 关于applet的沙盒模型的局限性 19 3.2.2 策略和实施分离的不彻底性...

Global site tag (gtag.js) - Google Analytics