内部类什么时候用:
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事物在使用外部事物的内容。
内部类定义在局部时:
1:不可以被成员修饰符修饰
2:可以直接访问外部类中的成员,因为还持有外部类中的引用。
但是不可以访问他所在的局部中的变量。只能访问被final修饰的局部变量。(在jdk 1.8之前的版本 )
class Outer
{
int x=3;
void method()
{
int y=4;
class Inner
{
void function()
{
System.out.println();
}
}
new Inner().function();
}
}
class OuterDemo3
{
public static void main(String[] args)
{
new Outer().method();
}
}
这个代码在1.7版本
说局部变量要需要声明最终类型;
要改代码
void method()
{
final int y=4;
}
但在1.8版本是可以运行的
同样
class Outer
{
int x=3;
void method(int a)
{
class Inner
{
void function()
{
System.out.println(a);
}
}
new Inner().function();
}
}
class OuterDemo3
{
public static void main(String[] args)
{
new Outer().method(8);
}
}
这个在1.7版本中 int a 前面要加final修饰
而在1.8中就不需要;这样就会输出8;
看下面代码;
class Outer
{
int x=3;
void method(final int a)
{
class Inner
{
void function()
{
System.out.println(a);
}
}
new Inner().function();
}
}
class OuterDemo3
{
public static void main(String[] args)
{
Outer p=new Outer();
p.method(8);
p.method(7);
}
}
注意这是可以输出的
原因:
第一次调用mthod方法,a就进栈了,把8在付给a,一执行完就释放了;再一次调用method方法时,就另一个a进栈;
说一下
JDK1.8与1.7版本的不同:
1.8相关的新特性,有个lambda 项目,解决或部分解决了java匿名内部类中如下缺点:
1. 语法相对复杂。
2. 在调用内部类的上下文中,指引和this的指代容易混淆。
3. 类加载和实例创建语法不可避免。
4. 不能引用外部的非final对象。
5. 不能抽象化控制流程