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)。是我们类的第五大成员[思考:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类],内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系,注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类.内部类分为两类:
- 定义在外部类局部位置上:
- 局部内部类(有类名)
- 匿名内部类(没有类名)
- 定义在外部类的成员位置上:
- 成员内部类(没有static修饰)
- 静态内部类(使用static修饰)
9. 局部内部类的使用
- 说明: 局部内部类是定义在外部类的局部位置, 比如方法中,并且有类名。
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修修饰符的。但是可以使用final修饰,因为局部变量也可以使用final饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
- 作用域 :仅仅在定义它的方法或代码块中。
- 局部内部类—访问---->外部类的成员[访问方式:直接访问]
- 外部类—访向---->局部内部类的成员,访问方式:创建对象,再访问(注意:必须在作用域内)
- 外部其他类–不能访---->局部内部类**(因为局部内部类地位是一个局部变量)**
- 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员) 去访问
10. 匿名内部类
- 本质还是类;内部类;该类没有名字;同时还是一个对象
- 说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名
- 匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修饰符,因为它的地位就是一个局部变量。
- 作用域:仅仅在定义它的方法或代码块中。
- 匿名内部类—访向---->外部类成员[访问方式:直接访问]
- 外部其他类—不能访向---->匿名内部类(因为匿名内部类地位是一个局部变量)
- 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员) 去访问