标签:部类 Java 内部 对象 学堂 嵌套 匿名 西安 public
内部类的分类
笔者认为内部类之所以很难理解,正是因为语法覆盖了大量难以理解的技术(如果都像基础内部类那样,就没有多少意思了)。内部类可以分为四种:成员内部类,局部内部类,嵌套类,匿名内部类。
静态内部类的应用场景是:只可以访问外部类的静态成员变量和静态成员方法。
成员内部类的应用场景是:它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
局部内部类:像局部变量一样,不能被public, protected,
private和static修饰。只能访问方法中定义的final类型的局部变量。
匿名内部类:匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements,没有构造方法。匿名内部类隐式地继承了一个父类或者实现了一个接口。匿名内部类使用得比较多,通常是作为一个方法参数。
成员内部类
成员内部类拥有对外部类所有元素的访问权。
在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
而需要创建内部类对象,可以使用outer.inner obj = outer.new inner();
(注意,在拥有外部类对象之前是不可能创建内部类对象的,除非你创建的是嵌套类)
局部内部类
当你要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但又不希望这个类是公共可用的时,可以通过以下方式实现:
一个定义在方法中的类
一个定义在作用域内的类
一个实现了接口的匿名类
一个扩展了非默认构造器的匿名类
执行字段初始化的匿名类
PDestination类是destination()方法的一部分,在之外不能被访问。注意return语句中的向上转型,返回的是Destination的引用,它是PDestination的基类。
匿名内部类
一个匿名内部类的例子如下,匿名类是内部类比较常用的方式,简化了代码,更加灵活:
package c10;
//注释后,编译报错:Contents cannot be resolved to a type
//interface Contents { }
public class Parcel7 {
public Contents contents() {
return new Contents() {
private int i = 11;
public int value(){ return i; }
};
}
public static void main(String[] args) {
Parcel7 p = new Parcel7();
Contents c = p.contents();
}
}
需要注意:
-
new匿名类前,这个类需要定义,否则编译报错;
- 当所在的方法的形参需要被内部类里面使用时,该形参必须为final,否则编译报错。
嵌套类
如果不需要内部类对象与其外部类对象之间有联系,那么可以将内部类声明为static。嵌套类意味着:
-
要创建嵌套类的对象,并不需要先创建外部类的对象
-
不能从嵌套类的对象中访问非静态的外部类对象
- 嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。
标签:部类,Java,内部,对象,学堂,嵌套,匿名,西安,public 来源: https://blog.51cto.com/14512197/2439719
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。