JAVA笔记(五)---再学习

嵌套类(Nested Class)

什么是嵌套类?
定义在另一个类中的类,被称为嵌套类

	public class OuterClass {
		//静态嵌套类
		static class StaticNestedClass {
			
		}
		//非静态嵌套类(也称为:内部类)
		class InnerClass {
			
		}
	}

在嵌套类外层的类,称为:外部类(Outer Class)

最外层的外部类,称为:顶级类(Top-level Class)

内部类(Inner Class)

内部类:没有被static修饰的嵌套类,非静态嵌套类

  • 跟实例变量、实例方法一样,内部类与外部类的实例相关联
  • 必须先创建外部类实例,然后再用外部类实例创建内部类实例
		Person person = new Person();
		Hand hand = person.new Hand();
		System.out.print(hand.count);
  • 内部类不能定义除编译时常量以外的任何static成员
    也就是,static final int age = 10;可以
    除了这个之外,不能出现static成员

  • 内部类可以直接访问外部类中的所有成员(即使被声明为private)

  • 外部类可以直接访问内部类实例的成员变量、方法(即使被声明为private)

静态嵌套类(Static Nested Class)

  • 静态嵌套类:被static修饰的嵌套类
  • 静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中
  • 对比一般的顶级类,静态嵌套类多了一些特殊权限
    可以直接访问外部类中除实例变量、实例方法外的其他成员(即使被声明为private)

什么情况使用嵌套类?

如果类A只用在类C内部,则可以考虑将类A嵌套到类C中。这样的好处:

  • 封装性更好
  • 程序包更加简化
  • 增强可读性、维护性

如果类A需要经常访问类C的非公共成员,可以考虑将类A嵌套到类C中
另外,也可以根据需要将类A隐藏起来,不对外暴露

如果需要经常访问非公共的实例成员,设计成内部类(非静态嵌套类),否则设计成静态嵌套类;

能静态嵌套类则静态嵌套类


局部类(Local Class)

局部类:定义在代码块中的类(可以定义在方法中、for循环中、if语句中等)

  • 局部类不能定义除编译时常量以外的任何static成员
  • 局部类只能访问final或者有效final局部变量
什么是有效final?

从Java8开始,如果局部变量没有被第二次赋值,就认定为是有效final
举例:int age = 10;之后age不再被赋值,被称为有效final

  • 局部类可以直接访问外部类中所有成员(即使被声明为private)
    局部类只有定义在实例相关的代码块中,才能直接访问外部类中的实例成员(实例变量、实例方法)

抽象类

抽象方法(Abstract Method)

抽象方法:被abstract修饰的方法
抽象方法:

  • 只有方法声明,没有方法实现(参数列表后面没有大括号,而是分号)
  • 不能是private权限(因为定义抽象方法的目的是让子类去实现)
  • 只能是实例方法,不能是类方法
  • 只能定义在抽象类、接口

抽象类(Abstract Class)

抽象类:被abstract修饰的类

  • 可以定义抽象方法
  • 不能实例化,但可以自定义构造方法
  • 子类必须实现抽象父类中的所有抽象方法(除非子类也是一个抽象类)
  • 可以像非抽象类一样,定义成员变量、常量、嵌套类型、初始化块、非抽象方法等

抽象类就是在普通类的基础上,增加了:可以定义抽象类

常见使用场景:
抽取子类的公共实现到抽象父类中,要求子类必须要单独实现的定义成抽象方法


接口(Interface)

  • API(Application Programming Interface)应用编程接口
    提供给开发者调用的一组功能(无须提供源码)

  • Java中的接口
    一系列方法声明的集合
    用来定义规范、标准

接口中可以定义的内容

  • 抽象方法、常量、嵌套类型,从Java8开始可以定义:默认方法、静态方法
    上述可以定义的内容都是隐式public的,因此可以省略public
    从Java9开始可以定义private方法

  • 常量可以省略static、final

  • 抽象方法可以省略abstract

  • 不能自定义构造方法、不能定义(静态)初始化块、不能实例化

接口的细节

接口名称可以在任何使用类型的地方使用

一个类可以通过implements关键字实现一个或多个接口

  • 实现接口的类必须实现接口中定义的所有抽象方法,除非它是个抽象类
  • 如果一个类实现的多个接口中有相同的抽象方法,只需要实现此方法一次
  • extends和implements可以一起使用,implements必须写在extends的后面
  • 当父类、接口中的方法签名一样时,那么返回值类型也必须一样

一个接口可以通过extends关键字继承一个或者多个接口

  • 当多个父接口中的方法签名一样时,那么返回值类型也必须一样

抽象类与接口对比

抽象类和接口的用途有点类似,该如何选择?

何时选择抽象类?

  • 在紧密相关的类之间共享代码
  • 需要除public之外的访问权限
  • 需要定义实例变量、非final的静态变量

何时选择接口?

  • 不相关的类实现相同的方法
  • 只是定义行为,不关心具体是谁实现了行为
  • 想实现类型的多重继承

多态(Polymorphism)

什么是多态?

  • 具有多种形态
  • 同一操作作用于不同的对象,产生不同的执行结果

多态的体现

  • 父类(接口)类型指向子类对象
  • 调用子类重写的方法

JVM会根据引用变量指向的具体对象来调用对应的方法

  • 这个行为叫做:虚方法调用
  • 类似于C++中的虚函数调用

匿名类(Anonymous Class)

当接口、抽象类的实现类,在整个项目中只用过一次,可以考虑使用匿名类

  • 匿名类不能定义 除 编译时常量 以外的任何static成员

  • 匿名类智能访问final或者 有效final的局部变量

  • 匿名类可以直接访问外部类中所有成员(即使被声明为private)


枚举(Enum)

  • 如果一个变量的取值只可能是固定的几个值,可以考虑使用枚举类型
  • 枚举由一组预定义的常量构成
  • 枚举的本质是类,所有枚举类型最终都隐式继承自java.lang.Enum

你可能感兴趣的:(JAVA笔记,java,笔记,学习)