内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用美元符号$分隔外部类名与内部类名的常规类文件,而虚拟机对此一无所知。编译器为了引用外部类,生成了一个附加的实例域this$0
为什么要用内部类?
- 内部类可以访问所在类域中的数据(包括私有);
- 内部类可以在同一包中被隐藏;
- 匿名内部类在实现回调时非常方便;
特殊语法
- OuterClass.this表示外部类对象引用,比如Employee.this.id;
- OuterObject.new InnerClass()显式调用内部对象的构造函数,例如this.new Payroll(10000);
- OuterClass.InnerClass其它类访问内部类;
- OuterClass$InnerClass编译器翻译成JVM能够识别的类,内部类对JVM是透明的.
内部类表现形式
简单内部类
每个内部类对象都有一个指向外部对象的隐式引用outer;每次外部类对象初始化一个内部类对象时都会把自己的this引用传给内部类对象的隐式的构造函数,以下是模拟的过程:
public class Outer{
public void function(){
Inner inner = new Inner(this);
....
}
public class Inner{
private Outer outer;
public Inner(Outer outer){
this.outer = outer;
}
}
}
实例如下
public class Employee {
private int id;
private String name;
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
public void start(){
class Computer{
private int seq;
public Computer(int seq){
this.seq = seq;
public void run(){
System.out.println(seq + " computer is run");
}
}
Computer c = new Computer(2015);
c.run();
}
public class Payroll {
private int pay;
public Payroll(int pay) {
this.pay = pay;
}
public void printPay() {
if(Employee.this.id ==1){
System.out.println("name is " + name);
System.out.println("pay is: " + pay);
System.out.println("----------------------------");
} else {
System.out.println("you can not print pay");
}
}
}
public void printPayroll() {
Payroll p = this.new Payroll(10000);
p.printPay();
}
public static void main(String[] args) {
Employee e1 = new Employee(1, "a");
Employee e2 = new Employee(2, "b");
e1.printPayroll();
e2.printPayroll();
e1.start();
}
}
局部的内部类
在外部类方法中定义的内部类称为局部内部类,局部内部类不能用修饰符(public or private)定义.只能访问局部方法作用域的final变量.
public void start(){
final int num = 2015;
class Computer{
private int seq;
public Computer(int seq){
this.seq = seq;
}
public void run(){
System.out.println("seq is: " + seq + ", num is: " + num);
}
}
Computer c = new Computer(2015);
c.run();
}
匿名内部类
语法如下,SuperType可是接口也可以是类.匿名内部类不能有构造函数.匿名内部类隐式地继承了一个父类或者实现了一个接口。
new SuperType(construction parameters)
{
inner class method and data
}
或者是
new InterfaceType()
{
inner class method and data
}
实例
new Thread() {
@Override
public void run() {
System.out.println("----------------------------");
System.out.println("this is a anonymous class run");
}
}.start();
静态内部类
静态内部类与其它内部类相似,不同之处在于静态内部类没有指向外部类的引用.当不需要访问外部对象时,可以考虑使用静态内部类.被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。 注意,声明在接口中的内部类自动成为public和static。
实例
public class StaticInner {
private static int a = 4;
public static class Inner {
public void test() {
System.out.println(a);
}
}
public static void main(String[] args) {
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
JAVA内部类的一些总结
java内部类总结,内部类的共同特征,内部类的分类等
最全面的java内部类总结,概念和实例帮助深入理解!
Java内部类总结.pdf
java内部类总结.pdf
Java内部类总结[参考].pdf
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现...
关于JAVA内部类总结讲解,个人网上整理收藏,觉得不错滴
java中的匿名内部类总结
详细全面的了解java内部类的工作原理!
Java内部类语法总结.pdf
内部类总结,超详细!希望能够帮助到有需要的同学,免积分下载!
170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java