Java回炉学习(三)

1. 单例模式

  • 构造器私有化 -> 防止直接 new
  • 类的内部创建对象
  • 向外暴露一个静态的公共方法,返回单例对象
  • 一个类有且只有一个适用

2. 饿汉式和懒汉式的区别

  • 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
  • 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善一把)
  • 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
  • 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。

3. final关键字

  • 当不希望类被继承时,可以用final修饰.
  • 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字
  • 当不希望类的的某个属性的值被修改,可以用final修饰.
  • 当不希望某个局部变量被修改,可以使用final修饰
  • 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。final不能修饰构造方法(即构造器)
  • final和static 往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理。
  • 包装类(Integer, Double,Float, Boolean等都是final),String也是final类。

4. abstract关键字

​ 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类。

  • 抽象类不能被实例化
  • 抽象类不一定要包含abstract方法。 也就是说,抽象类可以没有abstract方法
  • 一旦类包含了abstract方法,则这个类必须声明为abstract
  • abstract只能修饰类和方法,不能修饰属性和其它的。
  • 抽象类可以有任意成员[抽象类本质还是类]
  • 抽象方法不能有主体,即不能实现
  • 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
  • 抽象方法不能使用private、final 和static来修饰,因为这些关键字都是和重写相违背的。

5. 模板设计模式

​ 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造但子类总体上会保留抽象类的行为方式。

6. 接口

​ 小结:接口是更加抽象的抽象的类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体jdk7.0 。接口体现了程序设计的多态和高内聚低偶合的设计思想。

  • 接口不能被实例化
  • 接口中所有的方法是public方法,接口中抽象方法,可以不用abstract修饰
  • 一个普通类实现接口,就必须将该接口的所有方法都实现
  • 抽象类实现接口,可以不用实现接口的方法
  • 一个类同时可以实现多个接口
  • 接口中的属性,只能是final的,而且是public static final修饰符。比如:int a=1;实际上是public static final int a= 1; (必须初始化)
  • 接口中属性的访问形式接口名.属性名
  • 接口不能继承其它的类,但是可以继承多个别的接口

7. 实现接口和继承类区别

  • 如果子类需要扩展功能,可以通过实现接口的方式扩展.
  • 可以理解实现接口 是 对 java 单继承机制的一种补充

8. 内部类

​ 个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员[思考:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类],内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系,注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类.内部类分为两类:

  1. 定义在外部类局部位置上:

    • 局部内部类(有类名)
    • 匿名内部类(没有类名
  2. 定义在外部类的成员位置上:
    • 成员内部类(没有static修饰)
    • 静态内部类(使用static修饰)

9. 局部内部类的使用

  1. 说明: 局部内部类是定义在外部类的局部位置, 比如方法中,并且有类名。
  2. 可以直接访问外部类的所有成员,包含私有的
  3. 不能添加访问修修饰符的。但是可以使用final修饰,因为局部变量也可以使用final饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
  4. 作用域 :仅仅在定义它的方法或代码块中
  5. 局部内部类—访问---->外部类的成员[访问方式:直接访问]
  6. 外部类—访向---->局部内部类的成员,访问方式:创建对象,再访问(注意:必须在作用域内)
  7. 外部其他类–不能访---->局部内部类**(因为局部内部类地位是一个局部变量)**
  8. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员) 去访问

10. 匿名内部类

  1. 本质还是类;内部类;该类没有名字;同时还是一个对象
  2. 说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名
  3. 匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。
  4. 可以直接访问外部类的所有成员,包含私有的
  5. 不能添加访问修饰符,因为它的地位就是一个局部变量。
  6. 作用域:仅仅在定义它的方法或代码块中
  7. 匿名内部类—访向---->外部类成员[访问方式:直接访问]
  8. 外部其他类—不能访向---->匿名内部类(因为匿名内部类地位是一个局部变量)
  9. 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员) 去访问

Java回炉学习(三)相关推荐

  1. Java回炉学习(一)

    Java回炉学习(一) 参考至:韩顺平_循序渐进学java 1. JDK.JRE基本介绍 JDK全称(Java Development Kit,Java开发工具包) JDK=JRE+Java开发工具( ...

  2. Java回炉学习(七)

    Java回炉学习(七) 1. 泛型 泛型的好处:1. 编译时,检查添加元素的类型,提高了安全性 2. 减少了类型转换的次数,提高效率 //泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型 ...

  3. Java并发学习三:银行转账的死锁问题解决及示例

    Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 从03 | 互斥锁(上):解决原子性问题到06 | 用"等待-通知&quo ...

  4. Java多线程学习三十八:你知道什么是 CAS 吗

    CAS 简介 CAS 其实是我们面试中的常客,因为它是原子类的底层原理,同时也是乐观锁的原理,所以当你去面试的时候,经常会遇到这样的问题"你知道哪些类型的锁"?你可能会回答&quo ...

  5. java泛型学习三:受限制的通配符以及泛型方法

     一.受限制的通配符    package generic; import generic.windcard.Circle; import generic.windcard.Shape; import ...

  6. Java多线程学习三十七:volatile 的作用是什么?与 synchronized 有什么异同

    volatile 是什么 首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制.当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的 ...

  7. Java多线程学习三十三:Future 的主要功能是什么?

    Future 类 Future 的作用 Future 最主要的作用是,比如当做一定运算的时候,运算过程可能比较耗时,有时会去查数据库,或是繁重的计算,比如压缩.加密等,在这种情况下,如果我们一直在原地 ...

  8. java多线程学习三

    本章主要学习线程的静态方法 1.先忙先看一段代码: public class MyThread3 implements Runnable {static {System.out.println(&qu ...

  9. Java多线程学习三十九:CAS 有什么缺点?

    CAS 有哪几个主要的缺点. 首先,CAS 最大的缺点就是 ABA 问题. 决定 CAS 是否进行 swap 的判断标准是"当前的值和预期的值是否一致",如果一致,就认为在此期间这 ...

最新文章

  1. CSS3动画过渡的jquery动态弹出框插件
  2. 学python用什么系统好-Python用什么系统环境好?老男孩Python
  3. 单因素方差分析_基于R语言开展方差分析(一)——单因素方差分析
  4. 【转】Qtcreator中常用快捷键和小技巧
  5. Anaconda是什么?Anconda下载安装教程 - Python零基础入门教程
  6. vim 高亮显示php代码
  7. HTTP协议方法及状态码(HTTP协议入门必备)
  8. 一加Nord或在国内上市:骁龙765G+90Hz双孔OLED屏
  9. LeetCode_database刷题记录(182. 查找重复的电子邮箱)
  10. VBA实战技巧精粹014:关于Range总结
  11. as400 编程语言c,AS400_RPG入门
  12. python爬取南京市房价_屌丝想买房,爬取南京20000多套二手房|上篇
  13. MATLAB 绘图笔记——绘制两端尖角colorbar
  14. android二维码图片生成模糊的问题
  15. 天干、地支纪年 月 日
  16. C/C++中生成随机序列——随机函数的选择和自我实现
  17. 【SQL管理】-Flyway数据库版本管理利器从入门到入味
  18. 实验七 函数程序设计 张玉生《C语言程序设计实训教程》双色版 配套实验书答案 (纯手打, 仅供参考)
  19. 爱是什么~~~~~~
  20. zha男/女的三种境界

热门文章

  1. 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
  2. Android判断是模拟器还是真机
  3. CocosCreator高斯模糊深度优化版
  4. windows10修改用户名解决CDK闪退问题
  5. 黑白液晶COG与COB的区别
  6. Python3---站在大佬肩膀写爬虫-爬取网易云音乐热歌榜歌曲热评(精彩评论)
  7. Eclipse设置护眼背景色以及字体颜色
  8. 怎么样去做一个每天都精力充沛的人?
  9. 我们无法创建新分区。【错误:0x80042468】
  10. layui操作完成后刷新页面