Java核心技术学习笔记-继承

继承按照我们中文通俗的理解是不需要付出努力,就获得别人的能力或资产,比如继承父辈的家产,继承父辈的表达能力,继承父辈的外貌等等。在类里面的继承,可以理解不需要重新开发代码,就能复用父类的方法和域。

在继承关系里面,可以分为父类和子类,子类继承父类,那子类就有了跟父类一样对外的方法和属性,但是子类也可以拥有自己对外的方法和属性,就好比你继承了父辈的全部家产,但是还可以拥有属于自己的资产一样。所有继承是一个is-a的关系。java类继承用extends来表述继承关系。例如:

class Manager extends Emloyee{}

子类除了可以继承父类方法以外,也可以覆盖父类方法,把这个覆盖父类方法的行为称之为override.值得注意的是,在覆盖方法时,允许子类覆盖方法的返回类型定义为原类型的子类型。例如:

public class Employee{ public Employee getBuddy(){……} }//父类Employee

public class Manager extends Employee {
    public Manager getBuddy(){……} 
    //子类override getBuddy方法,返回类型为原类型的子类型
}

--那么继承是如何实现,内部实现原理是怎么样的?

1、每个对象在调用方法的时候,实际上方法存在一个隐式参数,例如:

Manager mg=new Manager();
mg.getBuddy(); //getBuddy实际上存在一个隐式参数,当前对象的引用,执行是会将对象引用传
进去,变成mg.getBuddy(mg);

2、每个类,虚拟机都会为每个类预先创建一个方法表(method table),用来记录所有方法所对应的内存地址。在调用方法的时候,直接去找方法对应的内存地址进行执行,如果是单纯的继承,相当于默认给子类创建一个跟父类类似的method table。

例如:

Employee:
getName->Employee:getName()
getBuddy->Employee:getBuddy()

Manager:
getName->Employee:getName()
getBuddy->Manager:getBuddy()

因此,对于不同的子类对象调用子类方法时,会从子类方法表中,查询该方法的地址,如果子类覆盖父类方法,那么对应的方法的地址也被修改了,进而实现多态。

--如何阻止继承:

final,如果将类定义为final,那么该类就不能被其他类继承,值得注意的是,如果类被定义成final,其方法也自动被定义为final,但是属性域并没有被自动定义成final.

时间: 2024-11-03 21:57:20

Java核心技术学习笔记-继承的相关文章

java核心技术学习笔记之一程序设计概述

Java 核心技术之一程序设计概述 一.   Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向对象的语言: 网络技能:Socket,FTP,Http,URL编程简单: 健壮性:避免指针错误使用: 安全性:构建防病毒防篡改系统: 体系结构中立:字节码: 可移植性: 解释性:可以解释任何移植了的字节码: 高性能: 多线程 动态性: 二.   Internet 和 Java Applet 在网页中

【学习笔记】java核心技术学习笔记整理

<java核心技术>  花了半天到一天又认真读了一下java核心技术中的类部分,感觉最近编程时候好多迷迷糊糊,“这样对不对呢,试一试.怎么不对呢”这类的迷糊问题原来都早有定义.  main函数必须在主类中  一个class就是一个机器,要使用其中的方法,需要构建这个类的实例. 一个class中如果定义构造器,构造器的类型是public 类名,类名就是原类名   一个类可以有多个构造器,构造器没有返回值.  变量标记为private,代表只有该类的方法才能使用这些变量,别的类的不可以  方法标记

java基础学习笔记-继承

继承是复用程序代码的有力手段,当多个类(Sub1,Sub2,...Sub100)之间存在相同的属性和方法时,可从这些类中抽象出父类Base.在父类Base中定义这些相同的属性和方法,所有的Sub类无须重新定义这些属性和方法,而只需要通过extends语句来声明继承Base类: public class Sub extends Base {...} Sub 类就会自动拥有在Base类中定义的属性和方法. 6.1 继承的基本语法 在JAVA语言中,用extends 关键字来表示一个类继承了另一个类,

java核心技术学习笔记之一程序设计环境

一术语 JDK:Java Delelpment Jit JRE:Java Runtime Environment 二.安装jdk1.8.0_25 设置环境变量(建议直接安装在C盘下),使用:隔开 C: \Java\jre1.8.0_25\bin; 三.解压源码文件方法 进入C: \Java\jre1.8.0_25 建立src子目录 mkdir src cdsrc 解压文件 Jar xvf ..\src.zip 一.   使用命令行工具 Java HelloWorld.java   带java结尾

java核心技术学习笔记之三程序设计结构

一 基本数据结构 必须包括在类中 必须具备 public static main方法 大小写敏感 二.数据类型 四种整数类型: Int 4字节 short 2字节 long8字节 byte1字节 二种浮点型 float 4字节 douleble 8字节 char类型:boolean类型 常量使用final定义 类常量使用static final定义 三.操作符号 X!=0 &&1/x>x+y   //如果X=0,不进行&&后面的计算避免x=0的1/x操作 数学操作符号

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 2.下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:     步骤: • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下): • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出

java排序学习笔记

前面写了js的排序实现,总得玩玩java的哈. 同样,冒泡.选择.快速(这三个之前实现过也写过文章).堆排序,然后做比较. 主要遇到的难点: - -||想轻松点写个封装计时的逻辑,不想每调用一个排序就要写一个计时代码.想想,还是javascript写起来方便: java的话,我想到的方法是写一个抽象类:抽象出排序方法,实现一个排序计时方法(该方法调用了抽象排序,但在先后排序时加入计时代码[感觉像是aop操作]): 接着所有排序类都继承这个抽象类,并实现排序方法,调用的时候直接调用继承的排序计时方

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i