复用类

P135 垃圾收集器可能永远也无法被调用,即使被调用,它也可能以任何他想要的顺序来回收对象。因此最好除了内存回收以外,不要依赖垃圾回收器做任何事情。如果需要清理(如关闭文件等),最好自己编写清理方法,且不要使用finalize()方法。

多态

多态的作用主要在于消除类型间的耦合关系

将一个方法调用和一个方法主体关联起来的过程谓之“绑定”

前期绑定:在程序执行以前就进行绑定,则是前期绑定,这一般由编译器和链接程序实现

后期绑定:在运行时根据对象的类型进行绑定,则是后期绑定,也称为动态绑定或运行时绑定

Java中除final方法(private方法也是某种意义上的final方法)和static方法外,其余方法均是后期绑定

注意:

“覆盖”私有方法:如果在子类中写一个与基类中的私有方法同名、同参且返回值相同(一模一样)的方法,那么编译器会认为这是子类的一个全新的方法,所以在将子类向上转型为基类,并调用该方法时,调用的将是基类中的方法

class Cycle extends Shape {

void f() {

OutUtil.print("I am the child class -- Cycle!");

}

}

public class Shape {

private void f() {

OutUtil.print("I am the base class -- Shape!");

}

public static void main(String[] args) {

Shape s = new Cycle();

s.f();

}

}

// Output:

I am the base class -- Shape!

域不具备多态性:当将一个子类型向上转型为基类型时,任何对域的访问操作都将由编译器解析,因此不是多态的。实际上,对于子类型,会为当前类和基类可访问(拥有访问权限)域分配不同的存储空间,当需要访问基类中的域时,需要使用关键词super.域名进行访问

静态方法不具备多态性:因为静态方法是与某一个类绑定的,而并非与类对象绑定的,而多态是针对对象而言的,所以静态方法也不具备多态性

class Super{

String ss = "String in Super";

static void staticf(){

OutUtil.print("staticf() in Super");

}

void commonf(){

OutUtil.print("commonf() in Super");

}

}

class Sub extends Super{

String ss = "String in Sub";

static void staticf(){

OutUtil.print("f() in Sub");

}

void commonf(){

OutUtil.print("commonf() in Sub");

}

}

public class MultiType {

// Thinking in Java P156 域和静态方法的多态性

public static void main(String[] args) {

Super sup = new Sub();

OutUtil.print(sup.ss);

sup.staticf();

sup.commonf();

}

}

//Output:

String in Super

staticf() in Super

commonf() in Sub

当需要对某些对象进行清理时,其清理顺序应该和初始化顺序相反。即对象的清理顺序应该和初始化顺序相反;字段则是与声明的顺序相反(因为字段的初始化顺序就是其声明顺序);而对于类的继承而言,则应该先清理子类,然后再对基类进行清理。因为子类可能需要使用到基类的某些方法,如果先清理基类,则会导致那些方法无效。

通过引用计数释放含有共享变量的类:如果存在一个成员变量被一个或多个对象共享的情况,那么就需要好好处理这些对象的清理问题。在这种情况下,可以使用引用计数来跟踪仍旧在访问共享变量的对象数量,只有当引用计数变为0时,才清理这个共享变量(这里的清理并不一定是内存的清理,也可以是文件的关闭、网络的断开等,因为内存清理可以由JVM自动完成,可以不用考虑)

public class ReferenceCounting {

public static void main(String[] args) {

Compose[] composes = new Compose[5];

Share s = new Share();

for (int i = 0; i < 5; ++i){

composes[i] = new Compose(s);

}

for (int i = 0; i < 5; ++i){

composes[i].dispose();

}

}

}

class Share {

private int refCount = 0; // 引用计数器

private static long counter = 0; // 利用counter和id记录当前创建的Share实例数

private final long id = counter++;

public Share() {

OutUtil.print(this.toString());

}

public void addRef() {

refCount++;

}

public void dispose() {

// 方法内部需要将引用计数减1

if (--refCount == 0) {

OutUtil.print("dispose " + this);

}

}

@Override

public String toString() {

return "Share " + id;

}

}

class Compose {

private Share share;

private static long counter = 0;

private final long id = counter++;

public Compose(Share share) {

this.share = share;

share.addRef(); // 创建一个新对象时,需要将共享变量的引用计数加1

OutUtil.print(this.toString());

}

public void dispose(){

OutUtil.print("dispose " + this);

share.dispose();

}

@Override

public String toString() {

return "Compose " + id;

}

}

//Output:

Share 0

Compose 0

Compose 1

Compose 2

Compose 3

Compose 4

dispose Compose 0

dispose Compose 1

dispose Compose 2

dispose Compose 3

dispose Compose 4

dispose Share 0

构造器:应该使用尽可能简单的方法使对象进入正常状态,如果可以的话,应该尽可能避免调用其他方法。在构造器内唯一能够安全调用的方法是基类中的final方法。

协变返回类型:Java SE5允许协变返回类型,所谓协变返回类型是指子类覆盖基类的方法时,可以返回该基类返回类型的子类型,即更具体化

Java运行时多态性:

继承实现多态:即将子类对象的引用赋值给基类对象引用,从而实现多态;

接口实现多态:一个接口,多种实现,将接口实现类的对象引用赋值给接口对象的引用,以实现多态;

java收集碎片_Thinking in Java 笔记碎片相关推荐

  1. 碎片化学习Java(六)-- Java预测子女身高

    本文参考 嗨客网 Java 实战 关键词: Java变量运算 Java预测子女身高案例 Java预测子女身高 题目 答案 原文 若要查看详细 解题思路.解题步骤.运行结果 原文链接:https://h ...

  2. 碎片化学习Java(十一)Java if买手机问题

    本文参考 嗨客网 Java 实战 Java if条件判断 Java if买手机问题 Java if条件判断 题目 答案 原文 若要查看详细 解题思路.解题步骤.运行结果 原文链接:链接 后续 其他章节 ...

  3. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  4. Java虚拟机(JVM)学习笔记(不定时更新)

    Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot.     其中Hotspot虚拟机沿用至今,并已 ...

  5. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  6. 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  7. JAVA WEB整合开发王者归来 -- 读书笔记 by CZF 完整版

    JAVA WEB整合开发王者归来 -- 读书笔记  目录 第1章 概述. 1 第2章 搭建web开发环境. 1 第3章 Servlet技术. 1 第4章 深入JSP技术. 7 第5章 会话跟踪. 12 ...

  8. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  9. 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?

    杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https:// ...

最新文章

  1. getAttribute与getParameter的区别
  2. CTF训练计划—[CISCN2019]Easyweb
  3. SAP CRM Fiori 应用和 SAP Commerce Cloud (电商云) UI 如何通过调整 CSS 来改变UI显示风格
  4. Magento报错“No Input File Specified”的解决方法
  5. 设备上专用计算机管理办法,计算机设备管理办法
  6. java-高级编程课-实验题集标答整理
  7. 在本地视频播放中硬解与软解的能耗比体现
  8. SolidWorks的发展历史(1994~2007)
  9. 关于腾讯云搭建Socks5多IP代理服务器实现游戏单窗口单IP完美搭建教程附带工具
  10. 【笔记】用python计算BS模型、隐波的笔记
  11. SEO人员,三思而后行,要规避为哪些行业做SEO?
  12. IoT开发——WIFI模块ESP8266 RTOS SDK V3.0.0环境搭建
  13. Win10显卡跑不满?是时候给系统洗洗澡了,换系统提高GPU利用率
  14. 数字藏品以虚强实,赋能实体经济发展
  15. 学习笔记_1 Matplotlib绘制散点图
  16. 软件开发项目指标_重要的软件开发指标
  17. Editplus如何设置中文页面
  18. 基于Django的在线学习资源分享与推荐系统(mysql)-python.VUE【数据库设计、论文、源码、开题报告】
  19. Android自动化测试
  20. 人脸图像质量评价 SER

热门文章

  1. 解决 mac ssh空闲 连接断开问题
  2. 解决setInterval计时器不准的问题
  3. Property ‘id‘ not found on type java.lang.String问题解决
  4. 在Git中更改文件名的大小写
  5. win11双系统设置如何选择默认系统 Windows11双系统设置默认系统的步骤方法
  6. win11系统联想电脑怎么安装 Windows11系统联想电脑安装步骤
  7. 非模态对话框的创建于销毁
  8. STM32:RS485通信和Modbus通信协议汇总
  9. linux c++ utf8 gbk,Linux C++ gbk转为utf-8
  10. java multiple_Java Math multipleExact()使用方法和实例