外部类
外部类
外部类,即类外部的类。类中类。模式如下:
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);}
}
其中每一个数据,都是枚举类的实例**作为类型平安的常量** **能够实现接口拓展性能** **将枚举数据与它的常量关联起来** **将枚举数据和它的行为关联起来(特定于常量的办法实现)**