★内部类(inner class)
内部类又称嵌套类,是指定义在一个类内部的类,内部类所在的类为外部类。内部类可以分为四种:静态内部类、普通内部类、局部内部类和匿名内部类。
对于内部类的引用:
如果是非静态的内部类,在外部类的外面引用的语法为Outer.Inner in = new Outer().new Inner()
或者是Outer ounterObject = new Outer();Outer.Inner in = outerObject.new Inner();在外部类的内部引用的语法为:Inner in = new Inner();
如果是静态内部类,语法为:Outer.Inner in = new Outer.Inner();
内部类的文件名:OuterClass$InnerClass.class;匿名内部类比较特殊,其文件名为OuterClass$数字。
在JAVA中,对内部类的继承没有任何限制,满足单继承即可。也可以实现接口。
在JAVA中,对内部类的嵌套层次没有限制。
对于内部类,其如同类的其他成员一样,对整个类具有访问权限,可以访问所在类的所有属性、包括私有属性。即使是定义在一个方法中的内部类,也可以访问这些类的成员属性。
一个内部类附属于外部类的。
★静态内部类(static inner class):只能访问所属外部类中静态的成员变量。静态内部类实际上是外部类的静态成员。
★非静态的内部类:其类中声明的属性不能为静态的。对于其中属性或方法的访问,必须通过内部类的实例来调用。
★普通内部类:定义在类内部、方法和语句块的外部。可以被任何访问控制修饰符修饰。可以声明为final或abstract的,但二者不能同时使用。
★局部内部类(method-local inner class):其不能被任何访问修饰符修饰(包括static和transient),因为其和方法内的局部变量一样,完全属于方法,
其可以被final和abstract修饰。其只能访问方法中声明为final的局部变量。局部内部类只能在其声明的方法内实例化(即声明之后马上实例化)。
注意:为什么不能访问方法的局部变量呢(无final修饰)?
因为方法中的局部变量存在与stack中,如果使用完了,则其会从stack中移除,但是局部内部类的实例产生在heap中,当stack中的局部变量已经消失的时候,
heap中的内部类实例很可能还引用着这个变量,会造成其找不到这个变量,引起编译错误。
★匿名内部类(anonymous inner class):匿名内部类的类型必须是一个命名类型的子类或是命名接口的实现类。其永远是作为一条语句创建的,其本质就是把一个类的定义和实例化一步完成。语法:new X(){......}。
匿名内部类可以实现一个接口或继承其他的类,但不能既实现接口又继承其他类。匿名内部类不能有显式的构造器,不能被abstract和static修饰符修饰,其默认是final的。
匿名内部类有两种形式:
第一种:正常类型(normal)
public class Popcorn{
public void pop(){System.out.println("popcorn");}
}
public class Food{
private Popcorn popcorn = new Popcorn(){
public void pop(){--->方法重写
System.out.println("popcorn anonymous");
}
};--->这里实际上是Popcorn的子类
}
第二种:局部变量类型(argument-local)
interface Foo{void foo();}
class Bar{void doStuff(Foo foo){};}
public class MyAnonymous {
public void go(){
Bar bar = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("do something");
}
});
}
}
注意,内部类不能声明main方法。
★内部类对于外部类当前对象引用的语法:
对内部类当前对象的引用--->this
对外部类当前对象的引用--->外部类名.this
public class MyOuter{
private int x = 0;
class MyInner{
public void seeOuter(){
System.out.println("outer x is " + x);//对内部类当前对象的引用
System.out.println("inner class refer is " + this);//对外部类当前对象的易用
System.out.println("outer class refer is " + MyOuter.this);
}
}
}
分享到:
相关推荐
良葛格Java学习笔记,html版本,内容还可以,希望初学者可以有用。
Java学习资料 java se JAVA基础学习笔记和演示案例代码项目
《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新。并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,...
收集的java李兴华老师的课件笔记。感觉还不错,适合回顾和新手补习。
mldn 李兴华老师的笔记 2009年java核心讲解
NULL 博文链接:https://hwhanwan.iteye.com/blog/1717997
《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新。并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,...
《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...
java学习笔记大全:java内容介绍 java编程可以分成三个方向: 1、java se (j2se)桌面开发 java中的基础中的基础 2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java...
张龙 java se课程笔记 java学习者的经典必看笔记
java jdk 学习笔记java jdk 学习笔记java jdk 学习笔记
该资源为个人学习笔记,(包含学习中个人觉得易混淆的,难理解的,某些便于理解的内存直观图,知识点的对比等),有部分没整理出来 。 本人菜鸟 。该资源仅供se初学者,高手莫笑 。
公司几位高手一起总结的一份JAVA SE的笔记.总结的很精练,新手可当学习向导查阅,达人可当工具手册使用.真是练习JAVA,杀人必备的好文档!
●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念、操作、应用等问题及解决方案, ●针对Java SE 8新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新, ●...
传智播客Java_SE基础毕向东老师全程笔记.pdf
java学习笔记,主要是基础部分
从java历程开始到javaSE出道,涉猎到了javaSE所有的知识点,里面不仅有知识点笔记还有练习源码例子以及相关资料和PPT等。非常实用值得你拥有
《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新。并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,...
1、JAVA SE 2、MySQL + JDBC 3、JAVA WEB 4、Mybatis 5、SSM 6、大前端 7、Vue 8、SpringBoot 9、Spring Security 10、Shiro 11、Spring Cloud 12、JVM 13、JUC 14、Git 15、Linux 16、Redis 17、ElasticSearch 18、...
1.Java_SE基础全程学习笔记.pdf 2.Java开发工作经验高级特性总结.pdf 3.Java数据结构笔记.pdf 4.Java学员总结笔记.pdf