重温java基础之面向对象

六、面向对象

6.1 java8增加包装类

1、源码

6.2 处理对象

1、“hello”直接量和new String("hello")有什么区别?

 6.3 类成员

1、理解类成员

  当类初始化完成后,类变量也被初始化完成。

  类变量既可以通过类来访问,也可以通过类的实例来访问。可以这样理解:当通过对象来访问变量时,系统会在底层转换为通过该类来访问类变量。因此即使某个实例为null,它也可以访问它所属的类成员。

  静态初始化块也是类成员的一种,在类的初始化阶段,系统会调用该类的静态初始化块来对类进行初始化。一旦该类初始化结束后,静态初始化块将永远不会获得执行的机会。

 2、单例类

6.4 final修饰符

1、final成员变量

  与普通成员变量不同的是,final成员变量(包括实例变量和类变量)必须有程序员显式初始化,系统不会对final成员进行隐式初始化。

2、final方法

  final修饰的方法不可被重写。如Object类的getClass()方法。

  使用final修饰一个private访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名、相同形参列表、相同返回值类型的方法。

3、final类

  final类不可以有子类。

6.5 抽象类

1、抽象方法和抽象类

  有抽象方法的类智能被定义成抽象类,抽象类里可以没有抽象方法。

   final和abstract永远不能同时使用。

  当时用static修饰一个方法时,表名这个方法属于类本身,但如果该方法被定义成抽象方法,会导致通过该类来调用该方法时出现错误(抽象方法没有方法体)。因此static和abstract不能同时修饰某个方法。注:static和abstract并不绝对互斥,它们可以同时修饰内部类。

  private和abstract不能同时修饰方法。

6.6 Java8改进的接口

1、接口的定义

  接口里不能包含构造器和初始化块。接口中的成员变量只能是静态常量,接口里的方法只能是抽象方法、类方法或默认方法。接口中定义变量,系统会自动为这些成员变量增加static和final两个修饰符。接口定义的普通方法,系统会自动为其增加public abstract修饰。

  接口定义的所有成员默认为public访问权限,如果指定访问控制权限,只能使用public。

2、接口的继承

  接口完全支持多继承,一个接口可以有多个直接父接口。子接口会获得父接口里所有抽象方法、常量。

3、面向接口编程

(1)简单工厂模式

(2)命令模式

6.7 内部类

  内部类分为静态内部类和非静态内部类。(也可以分为成员内部类和局部内部类)

1、非静态内部类

内存示意图

   非静态内部类的成员可以访问外部类的private成员,但反过来就不成立。外部类不能直接使用非静态内部类的成员,如果需要访问,则必须显式创建非静态内部类对象来调用访问其实例成员。代码如下:

   外部类的静态成员中不能直接使用非静态内部类。Java不允许在非静态内部类里定义静态成员。

2、静态内部类

  静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。

 3、使用内部类

(1)在外部类内部使用内部类

(2)在外部类以外使用非静态内部类

(3)在外部类以外使用静态内部类

4、匿名内部类

  创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。

  匿名内部类必须继承一个父类(最多一个),或实现一个接口(最多一个)。

  通过实现接口来创建匿名内部类,匿名类内部不能显式创建构造器,只有一个隐式的无参数构造器。如下:

   通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器(相似指拥有相同的形参列表)。

6.8 java8新增的Lambda表达式

 1、Lambda表达式与函数式接口

标准写法:

简化写法:

   函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

  可以用Lambda表达式赋值:

   Lambda表达式有两个限制:

  (1)Lambda表达式的目标类型必须是明确的函数式接口;

  (2)Lambda表达式只能为函数式接口创建对象。

  可将Lambda表达式进行强制类型转换成函数式接口对象。

2、方法引用与构造器引用

(1)引用类方法

接口

Lambda表达式:

 测试:

 Lambda表达式可转换写法:

 (2)引用特定对象的实例方法

Lambda表达式:

 测试:

 Lambda表达式可转换写法:

 (3)引用某类对象的实例方法

接口:

 Lambda表达式:

 测试:

 Lambda表达式可转换写法:

 (4)引用构造器

接口:

 Lambda表达式;

 测试:

 Lambda表达式可转换成:

 6.9 枚举类

1、枚举类入门

(1)枚举类默认继承java.lang.Enum类,而不是java.lang.Object类。因此枚举类不能显式继承其他父类,但可以实现一个或多个接口;

(2)使用enum定义、非抽象的枚举类默认使用final修饰;

(3)枚举类默认使用private修饰,如果强制指定访问控制符,则只能是private;

(4)枚举类所有的实例必须在枚举类第一行显式列出,否则这个枚举永远不能产生实例,这些实例默认自动添加public static final修饰。

 2、枚举类的成员变量、方法和构造器

better:

 best:

猜你喜欢

转载自www.cnblogs.com/BernieX/p/11838909.html