JAVA整理

Java成长之路(十)

Posted by MiaoMiaoMiao on February 7, 2021

Java成长之路事

内部类

  • 一个定义在另一个类中的类,即为内部类;
  • 内部类是一种非常有用的特性,它允许你把一些逻辑相关的类组织在一起,并控制于内部的类的可见性;
  • 内部类的设计是为了语言的完备性设计的,但是你也许不需要它们,至少一开始不需要。
  • 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那必须像在main()方法中那样具体地指明这个对象的类型:(OuterClassName.InnerClassName)
  • 当生成一个内部类的对象时,此对象与制造它的外部对象(enclosing object)之间就有了一种联系,所以它能访问其外部对象的所有成员,而不需要任何特殊条件,内部类还拥有其外部类的所有元素的访问权;
  • 内部类自动拥有对其外部所有成员的访问权,而某个外部类的对象创建了一个内部类对象时,内部类对象会密码地捕获一个指向那个外部类对象的引用,在你访问此外部类成员时,就是用哪个引用选择外部类成员。

使用.this和.new

  • 如果你需要生成对外部类对象的引用,可以使用外部类的名字,后面紧跟圆点和this;
  • 有时你可能想要告知某些其他对象,去创建其某个内部类的对象,你必须在new表达式中提供对其他外部类对象的引用,这是需要使用.new方法;
  • 在拥有外部类之前是不可能创建内部类对象的,这是因为内部类对象会暗暗地连接创建它的外部类对象上。如果你创建的是嵌套类(静态内部类),那么它就不需要对外部类对象的引用;

内部类和向上转型

  • 当内部类向上转型为基类,尤其转型为一个接口的时候,内部类就有了用武之地,从实现了某个接口对象,得到对此接口的引用,与向上转型这为这个对象的基类,实质上效果是一样的;这是因为此内部类-某个接口的实现-能够完全不可见,并且不可用。所得到的只是指向基类或接口引用,所以很方便地隐藏其他细节;

内部类方法和作用域

在一个方法里面或者在任意的作用域中定义内部类的原因

  1. 实现了某类型的接口,于是可以创建并返回对其的引用。
  2. 你要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但有不希望这个类是公共可用的。

运用

  1. 一个定义在方法中的类;
  2. 一个定义在作用域内的类,此作用域在方法的内部;
  3. 一个实现了接口的匿名类;
  4. 一个匿名类,它扩展了没有默认构造器的类;
  5. 一个匿名类,它执行字段初始化;
  6. 一个匿名类,它通过实例初始化实现构造(匿名内部类不可能有构造器);

匿名内部类

  • 如果在定义一个匿名内部类时,它需要使用一个外部环境(在本匿名内部类之外定义)对象,那么编译器会要求其(该对象)参数引用是final或者“effectivelly final”(也就是说,该参数在初始化后不能别重新赋值,所以可以当做final)
  • 在匿名类中不可能有命名构造器(因为它根本没有名字),但可能通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果;
  • 对于匿名类而言,实例初始化的实际效果就是构造器,当然它受到了限制——你不能重载实例初始化方法,所以仅有一个这样的构造器。
  • 匿名内部类与正规的继承相比有些受限,因为匿名内部类要么继承类,要么实现接口,但两者不能兼备。而且如果是实现接口,也能实现一个接口。
  • 匿名内部类与正规的继承相比有些局限,因为匿名内部类要么继承类,要么继承接口,但两者不能兼备,而且如果是实现接口,也只能是实现一个接口。

嵌套类

  • 如果不需要内部类对象与其外部类对象之间有联系,那么将内部类声明为static,这称为嵌套类;
  • 普通内部类对象隐式地保存了一个引用,指向创建它的外部类对象;
  • 当内部类是static时,1.创建嵌套类的对象时,不需要外部类的对象;2.不能从嵌套类的对象中访问非静态的外部类对象;
  • 普通内部类和嵌套类还有个区别:普通内部类的字段与方法,只能放在类的外部层次中,所以普通内部类不能有static数据和static字段,也不能包含嵌套类,单嵌套类可以包含所有这些东西。
  • 嵌套类可作为接口的一部分,你放到接口中的任何类都是自动的public和static;
  • 可以使用嵌套类来放置测试代码;

continue…

bye