java基础---内部类
Posted buptyuhanwen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础---内部类相关的知识,希望对你有一定的参考价值。
===静态内部类,和静态成员变量一致不需要依赖外部类,不能够使用外部类的非static成员变量和方法,因为不依赖于对象。
===成员内部类:可以有四种访问权限---private,default,protected,public就像一个成员变量一样
内部类访问外部类的成员变量和方法(出现和内部类的成员变量和方法重名的情况的时候)
外部类.this.成员变量
外部类.this.成员方法
外部类访问内部类的成员变量和方法的时候必须先创建成员内部类的对象,再通过指向这个对象的引用来进行访问
两种方式:1.创建外部类后再创建内部类;2.使用外部类的方法来创建。
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner(); //必须通过Outter对象来创建
//第二种方式:
Outter.Inner inner1 = outter.getInnerInstance();
===局部内部类,定义在方法内部或者一个作用域内部,访问权限就是方法内或者该作用域内。
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
===匿名内部类,使用一次来简化编程,必须实现一个接口或者父类,主要就是用来创建一个对象然后使用。
继承接口的方式来实现。
继承父类的方式来实现。
创建线程的方式也是使用匿名内部类,而且是使用了继承接口的方式来创建。
new InnerClass{}的方式来创建
new Thread(new Runnable{}).start();
深入理解内部类:
1.为什么成员内部类能够访问外部类的成员变量和方法呢?
因为编译器在编译的时候默认会编译成两个.class文件,内部类会有一个指向外部类对象的引用。
2.局部内部类和匿名内部类在编译的时候怎么取名字呢?局部内部类和匿名内部类只能够在方法内和作用域内进行使用,为什么只能访问的是final修饰的局部变量?
首先匿名内部类使用的变量值是对方法局部变量值的拷贝,拷贝的这个变量放入到常量池里面了,和方法栈中的变量相互独立的。
使用final进行修饰的话,这个变量就无法被更改,也就不会出现数据不一致的情况。
不用final修饰的话编译都通不过。
public void test(final int b) {
final int a = 10;
new Thread(){
public void run() {
System.out.println(a);
System.out.println(b);
};
}.start();
}
3.static静态内部类有外部类对象的引用吗?
没有,因为和外部类对象无关,所以不存在对象引用。
为什么在Java中需要内部类?总结一下主要有以下四点:
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,丰富了java继承的方式,除了继承接口和类,还能够使用匿名继承的方式,更加灵活。
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
3.方便编写事件驱动程序
4.方便编写线程代码
个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。
以上是关于java基础---内部类的主要内容,如果未能解决你的问题,请参考以下文章