内部类初识
Posted woshi123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类初识相关的知识,希望对你有一定的参考价值。
内部类初识
用内部类的原因有以下几种:
- 内部类提供了更好的封装,如果内部类声明成private访问权限的话,那就只有外部类能够调用它了,同一个包的其他类都不能访问。
- 比如说Cow类和CowLeg类,CowLeg类如果离开了Cow将毫无意义,就可以把CowLeg类定义成Cow类的内部类
- 内部类可访问外部类的所有成员变量,外部类不一定能访问到内部类的成员(如果内部类的访问权限是private的话)
- 匿名内部类适合用于创建那些仅需要一次使用的类。
内部类与外部类的区别:
- 内部类比外部类可以多使用3个修饰符:private、protected、static——外部类不可以使用这3个修饰符
非静态内部类
非静态内部类不能拥有静态成员
public class OutClass {
private String val = "000";
private class InClass{
private String val = "123";
public void showval(){
System.out.println("外部类的val:"+OutClass.this.val); //因为非静态内部类寄生在外部类的实例中,所以会持有外部类实例的引用this
System.out.println("内部类的val:"+this.val); //或者直接val
}
}
public void showvalByInClass(){
InClass inClass = new InClass(); //外部类如果像访问内部类的成员,则必须要创建内部类对象
inClass.showval(); //换而言之,如果有一个内部类存在,则一定有一个它所寄生的外部类存在(无法脱离外部类而存在(在private修饰情况下))
}
}
class TestInClass{
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.showvalByInClass();
}
}
而且根据静态成员不能访问非静态成员的规则,外部类的静态方法、静态代码块不能访问非静态内部类。
静态内部类(类内部类)
如果使用static来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个实例。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(静态成员)。
public class OutClass {
private static String val = "000";
private static class InClass{
private static String sval = "456";
private String val = "123";//即使用pirvate修饰,外部类还是可以通过创建内部类的实例来直接访问,然而不是外部类就不行了
public void showOutval(){
System.out.println("外部类的val:"+OutClass.val);//静态内部类不必再依赖于外部类的实例而生,所以不会再持有其所寄生的外部类实例的引用
}
}
public void InClassval(){
System.out.println(InClass.sval);
System.out.println(new InClass().val);
new InClass().showOutval();
}
}
class TestInClass{
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.InClassval();
}
}
接口中的内部类
Java允许在接口中定义内部类,接口里定义的内部类默认使用(也只能使用)public static修饰,也就是说,接口中只能定义静态内部类。
以上是关于内部类初识的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段