外部类
外部类
外部类,即类外部的类。类中类。模式如下:
public class Outter{ // 外部类
class Inner{// 外部类}
}
1. 了解外部类的作用
- 外部类能够很好的实现暗藏
个别的非外部类,是不容许有 private 与 protected 权限的,但外部类能够
- 外部类领有外围类的所有元素的拜访权限
- 可是实现多重继承
- 匿名外部类优化接口
1)暗藏细节
平时咱们对类的拜访权限,都是通过类后面的拜访修饰符来限度的,个别的非外部类,是不容许有 private 与 protected 权限的,但外部类能够,所以咱们能通过外部类来暗藏咱们的信息。这看起来没什么作用,然而当外部类实现某个接口的时候,在进行向上转型,对外部来说,就齐全暗藏了接口的实现了。
2)能够无条件地拜访外围类的所有元素
外部类尽管和外部类写在同一个文件中,然而编译实现后,还是生成各自的 class 文件,外部类通过 this 拜访外部类的成员。
3)能够实现多重继承
这个特点十分重要,它是外部类存在的最大理由之一。正是因为他的存在使得 Java 的继承机制更加欠缺。大家都晓得 Java 只能继承一个类,它的多重继承在咱们没有学习外部类之前是用接口来实现的。但应用接口有时候有很多不不便的中央。比方咱们实现一个接口就必须实现它外面的所有办法。而有了外部类就不一样了。它能够使咱们的类继承多个具体类或抽象类。
4)通过匿名外部类来优化简略的接口实现
有了匿名外部类,能够不须要定义一个新的类,而间接通过匿名外部类创建对象。对那些只是用一次的类是十分不便的事件。
2. 外部类的分类
在 Java 中,能够将一个类定义在另一个类外面或者一个办法外面,这样的类称为外部类。宽泛意义上的外部类一般来说包含这四种: 成员外部类、部分外部类、匿名外部类和动态外部类 。
外部类的共性:
- 外部类依然是一个独立的类,在编译之后外部类会被编译成独立的.class 文件,然而后面冠以外部类的类名和 $ 符号。
- 外部类不能用一般的形式拜访。外部类是外部类的一个成员,因而外部类能够自在地拜访外部类的成员变量,无论是否是 private 的。
- 外部类申明成动态的,就不能轻易的拜访外部类的成员变量了,此时外部类只能拜访外部类的动态成员变量
1)成员外部类
成员外部类能够无条件拜访外部类的所有成员属性和成员办法(包含 private 成员和动态成员)。
[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传 (img-m9NbP9ja-1607410032140)(/ 图片 1.png)]
尽管成员外部类能够无条件地拜访外部类的成员,而外部类想拜访成员外部类的成员却不是这么得心应手了。在外部类中如果要拜访成员外部类的成员,必须先创立一个成员外部类的对象,再通过指向这个对象的援用来拜访:
a) 外部类的根本构造
外部类其实严重破坏了良好的代码构造,但为什么还要应用外部类呢?
因为外部类能够随便应用外部类的成员变量(包含 private)而不必生成外部类的对象,这也是外部类的惟一长处
b) 外部类中的变量拜访模式
外部类在没有同名成员变量和局部变量的状况下,外部类会间接拜访外部类的成员变量;若有同名状况时,间接拜访会导致外部类中的局部变量将外部类的成员变量笼罩,拜访外部类自身的成员变量可用 this. 属性名,拜访外部类的成员变量须要应用 Out.this. 属性名
c) 创立外部类实例
Out.Inner inner=new Out().new Inner();
// 或
Out out=new Out()
Out.Inner inner=out.new Inner()
d) 公有外部类
如果一个外部类只心愿被外部类中的办法操作,那么能够应用 private 申明外部类,此时咱们必须在 Out 类外面生成 In 类的对象进行操作,而无奈再应用 Out.In in = new Out().new In() 生成外部类的对象
也就是说,此时的外部类只有外部类可管制
如同是,我的心脏只能由我的身材管制,其他人无奈间接拜访它
2) 动态外部类
如果用 static 将外部类动态化,那么外部类就只能拜访外部类的动态成员变量,不能间接拜访外部类的实例变量、实例办法,只有通过对象援用能力拜访。
其次,因为外部类被动态化,因而 Out.In 能够当做一个整体看,能够间接 new 出外部类的对象(动态外部类不通过外部类实例进行创建对象)
3) 部分外部类
将外部类移到了外部类的办法中,而后在外部类的办法中再生成一个外部类对象去调用外部类办法。部分外部类和成员外部类的区别在于部分外部类的拜访仅限于办法内
如果此时咱们须要往外部类的办法中传入参数,那么外部类的办法形参必须应用 final 定义类
至于 final 在这里并没有非凡含意,只是一种示意模式而已
部分外部类:像局部变量一样,不能被 public, protected, private 和 static 润饰。jdk1.8 + 能够不加 final
4) 匿名外部类
匿名外部类:定义类的最终目标是创立一个类的实例,然而如果某个类的实例只是用一次,则能够将类的定义与类的创立,放到与一起实现,或者说在定义类的同时就创立一个类 , 以这种办法定义的没有名字的类成为匿名外部类。
[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传 (img-YEq1jHkj-1607410032150)(/ 图片 2.png)]
申明和结构匿名外部类的个别格局如下:
new ClassOrInterfaceName(){/* 类体 */}
①匿名外部类能够继承一个类或实现一个接口,这里的 ClassOrInterfaceName 是匿名外部类所继承的类名或实现的接口名。但匿名外部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是 Object 类的间接子类,匿名类继承一个类或实现一个接口,不须要 extends 和 implements 关键字。
②因为匿名外部类没有名称,所以类体中不能定义构造方法,因为不晓得类名也不能应用关键字来创立该类的实例。实际上匿名外部类的定义、结构、和第一次应用都产生在同样一个中央。此外,上式是一个表达式,返回的是一个对象的援用,所以能够间接应用或将其复制给一个对象变量, 如:
TypeName obj=new Name(){/* 此处为类体 */}
同样,也能够将结构的对象作为调用的参数。例:
someMethod(new Name(){/* 此处为类体 */});
部分外部类 :像局部变量一样,不能被 public, protected, private 和 static 润饰。Jdk1.7 中只能拜访办法中定义的 final 类型的局部变量。
枚举
java 枚举类能够简略地了解为一种非凡的 java 类。通过关键字 enum 实现,主动继承自 Enum 类(枚举类)
public enum Color{RED,GREEN, YELLOW;}
public class Test{public static void main(String[] args){System.out.println(Color.RED);
}
}
其中每一个数据,都是枚举类的实例
作为类型平安的常量
能够实现接口拓展性能
将枚举数据与它的常量关联起来
将枚举数据和它的行为关联起来 (特定于常量的办法实现)
in(String[] args){
System.out.println(Color.RED);
}
}
其中每一个数据,都是枚举类的实例
** 作为类型平安的常量 **
** 能够实现接口拓展性能 **
** 将枚举数据与它的常量关联起来 **
** 将枚举数据和它的行为关联起来 (特定于常量的办法实现)**