Java核心技术(四) —— 继承(2)

继前面我们对类和对象进行系统学习之后,我们来继续学习OOP的另一个基本概念:继承。利用继承,可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域,在此基础上,可以添加一些新的方法和域,以满足新的需求。

此外,我们也将介绍反射的概念。反射即在程序运行期间发现更多的类及其属性的能力,不过这个强大的特性更吸引开发软件工具人员的关注,编写应用程序的人员则不太关注,所以我们粗略介绍下。


3、泛型数组列表

ArrayList是一个采用类型参数的泛型类,使用起来有点像数组,但在添加或者删除元素时,具有自动调节数组容量的功能。为了指定数组列表保存的元素对象类型,需要用<>将类名括起来加在后面,如ArrayList< Employee >。

如我们声明并构造一个保存Employee对象的数组列表:

ArrayList<Employee> staff = new ArrayList<>();

(1)使用add方法可以将元素添加到数组列表中

staff.add(new Employee("Harry",···));

数组列表管理着对象引用的一个内部数组,如果调用add且内部数组已经满了,数组列表就将自动的创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。

(2)如果事先能估计出数组可能存储的元素数量,可以利用下述两种方式分配初始容量

staff.ensureCapacity(100);

或者

ArrayList<Employee> staff = new ArrayList<>(100);

(3)size方法可以返回数组列表中的实际元素数目

staff.size();

(4)一旦确认数组列表大小不再发生变化,就可以使用trimTosize方法将存储区域的大小调整为当前元素数量所需要的存储空间数目,从而方便垃圾回收器将多余的存储空间回收。这时,再添加新元素将需要花时间再次移动存储块。

(5)ArrayList类并不是Java程序设计语言的一部分,是由某些人编写且放到标准库中的一个实用类,因此在便利扩展容量同时也增加了访问元素的复杂度。

使用get和set方法实现访问或者改变数组元素的操作,而不是使用[]语法格式。

staff.set(i, harry);

(6)注意,下面这个技巧可以一举两得,即可以灵活扩展数组,又可以方便访问数组元素。

首先,创建一个数组,并添加所有元素

再使用toArray方法将数组元素拷贝到一个数组中

4、对象包装器与自动装箱

所有的基本类型都有一个与之对应的类,如基本类型int对应的类为Integer,通常,这些类称为包装器。

对象包装器类是不可变的,即一旦构造,就不允许更改包装在其中的值。同时对象包装器类还是final的,因此不允许定义它们的子类。

(1)因此,可以看到如果想定义一个整型数组列表,但前面介绍中<>中的类型参数并不允许是基本类型,这里就可以用到基本类型相对应的对象包装器类了,如

ArrayList<Integer> List = new ArrayList<>();

不过注意的是,由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远低于int[],因此,顶多适用于构造小型集合。

(2)为了更加便于添加或获得数组元素,下面调用

list.add(3);

将自动变换成

list.add(Integer.valueOf(3));

这种变化称之为自动装箱

(3)对应的,将一个Integer对象赋予给一个int值时,将会自动拆箱,即编译器将下列语句

int n = list.get(i);

翻译成

int n = list.get(i).intValue();

(4)==运算符也可以应用于对象包装器对象,只不过检测的是对象是否指向同一个存储区域

5、参数数量可变的方法

目前版本的Java都提供了可以用可变的参数数量调用的方法,也称为变参方法。

如printf方法:

用户也可以自己定义可变参数方法,并将参数指定为任意类型甚至是基本类型,如下例的功能式计算若干个数值的最大值

可以直接调用这个方法

double m = max(3.1, 44.4. -19);

6、枚举类

所有的枚举类型都是Enum类的子类,它们继承了这个类的许多方法。

如之前提到的例子:

实际上,这个声明定义的类型是一个类,恰好有四个实例。因此,在比较两个枚举类型的值时,不是调用equals而是直接使用==。

如果需要,可以在枚举类型中添加一些构造器、方法和域。当然,构造其只是在构造枚举常量的时候被调用。

(1)方法toString可以用来返回枚举常量名,如Size.SMALL.toString()将返回“SMALL”。

(2)方法valueOf是toString的逆方法,如

Size s = Enum.valueOf(Size.class, "SMALL ");

将s设置成Size.SMALL。

(3)每个枚举类型都有一个静态的values方法,用来返回一个包含全部枚举值的数组,如

Size[] values = Size.values();

返回包含元素Size.SMALL,Size.MEDIUM,···,Size.EXTRA_LARGE的数组。

(4)ordinal方法但会enum声明中枚举常量的位置,位置从零开始计数,例如Size.MEDIUM.ordinal()返回1.

7、关于继承设计的技巧

(1)将公共操作和域放在超类

(2)不要使用受保护的域

这是因为,第一,子类集合是无限制的,任何一个人都能由某个类派生一个子类,并编写代码直接访问protected的实例域,从而破坏了封装性。第二,Java中,在同一个包中的所有类都可以访问protected域,而不管它是否为这个类的子类。

(3)使用集成实现“is-a”关系

(4)除非所有继承的方法都有意义,否则不要使用继承

(5)在覆盖方法时,不要改变预期的行为

(6)使用多态,而非类型信息

时间: 2024-09-17 11:47:37

Java核心技术(四) —— 继承(2)的相关文章

java核心技术:继承

继承是一种类之间的关系,他描述了类之间一种“is a”的关系,继承也是面向对象编程的三大特性之一. 为什么要有继承,他有什么好处?提高代码的复用性,在不改变现有类的基础上不仅能够使用现有类的属性和功能,还能对现有类进行扩展.从上往下看,子类继承父类是子类对父类功能,属性的一种扩展,从下往上看,父类是对子类的进一步抽象,抽象出各个类之间的共同的属性和行为. java继承 java中用extends关键字来实现一个类继承一个类. 举个栗子,有个学生类(Student)和老师类(Teacher): /

Java底层四个核心技术

今天早起失败,加上忙碌的一天加班工作,没按计划总结Java相关的技术,刚看到下面的文章总结的不错,转载一下. Java有哪四个核心技术?首先,我们要了解一下java核心技术的重要性,它可以帮助我们举一反三.触类旁通,有助于提升我们对整个Java平台的理解力. 第一:Java虚拟机 Java虚拟机的主要任务是装在class文件并且执行其中的字节码.Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件.Java API中只有程序执行时需要的那些类才会被装载.字节码由执行引擎来执行

Java基础-四要素之一《继承》

继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系.当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承.比如下面这段代码: class Person { public Person() { } } class Man extends Person { public Ma

Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开发和维护,所有Java中的类是只能单继承,通过接口来实现多继承:对于接口的话,是可以多继承的,例如:A接口可以同时继承接口B和接口C,但是有一点要注意,就是实现接口A的类必须要实现接口A.B.C中所有的抽象方法:接口之所以可以多继承,就是因为接口结构比较简单. 继承是通过extends关键字来实现,

“全栈2019”Java第四十四章:继承

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第四十四章:继承 下一章 "全栈2019"Java第四十五章:super关键字 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全栈工

Java核心技术第四章----对象与类重难点总结

一.类之间的关系 类和类之间的关系,耦合度从高到低: is -a.继承.实现 has-a.组合.聚合.关联 user-a.依赖. 要求是:高内聚.低耦合. 继承("is-a") 继承(Inheritance),即"is-a"关系,是一种用于表示特殊与一般关系的.表示类与类(或者接口与接口)之间的父子关系.一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能.在JAVA中,用关键字extends表示继承关系 实现(Implementatio

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

Java核心技术第三章----Java的基本程序设计结构重难点总结

最近在看Java核心技术这本书,这里对第三章个人认为的重难点做一个总结.方便以后回顾,个人能力有限,本人菜鸟,大神勿喷,请大家多多指教. 一.位运算符 指定 A = 66(0100 0010); B = 22 (0001 0110)(这里为了简化说明支取一个字节即8位来运算) 位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能.如果要开发高效率程序,位运算符是必不可少的.位运算符用来对二进制位进行操作,包括:按位与(&).按位或(|).按位异或(^).按位取反(~).按

java中四种访问修饰符区别及详解全过程

客户端程序员:即在其应用中使用数据类型的类消费者,他的目标是收集各种用来实现快速应用开发的类. 类创建者:即创建新数据类型的程序员,目标是构建类. 访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分  : b.允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员  java的四个关键字:public.protected.default.private(他们决定了紧跟其后被定义的东西可以被谁使用) 适用范围<访问权限范围越小,安全性越高>   访问权限   类  

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

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