内部类
将一个类定义到另一个类的内部
A类要直接访问B类成员时,可以将A类定义在B类中
内部类可以直接访问外部类中成员
外部类访问内部类要创建对象
内部类相当于外部类中的成员,所以可以用成员修饰符修饰
如果内部类权限非私有,可以在外部其他程序访问到
非静态内部类中不可以定义静态方法
非静态非私有类情况
先创建外部类对象,再创建内部类对象
class Out{
private int num=4;
public class Inner{
void Show(){
System.out.println(num);
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
/* Out o=new Out();
Out.Inner in= o.new Inner();*/
Out.Inner in=new Out().new Inner();
in.Show();
}
}
静态非私有类情况 访问非静态成员
因为外部类加载时内部类也加载
class Out{
private static int num=4;
public static class Inner{//静态内部类相当于外部类
void Show(){//调用非静态类要创建对象
System.out.println(num);
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
Out.Inner inner=new Out.Inner();//因为调用的是非静态方法所以要创建对象。
inner.Show();
}
静态非私有类情况 访问静态成员
Out.Inner.Show();
非静态内部类中不能声明静态方法
但是可以声明静态常量final static
获取内部类方法中、内部类中、外部类中不同的num值
package Study;
class Out{
int num=1;
class Inner{
int num=2;
void Show(){
int num=3;
System.out.println(num);
System.out.println(this.num);
System.out.println(Out.this.num);
}
}
public void Method(){
new Inner().Show();
}
}
public class InnerClassDemo {
public static void main(String[] args) {
Out out=new Out();
out.Method();
}}
局部内部类
将内部类定义在局部位置上,局部内部类,只能访问final修饰的局部变量
class Out{
int num=1;
public void Method(){
final int NUM=2;//局部变量
class Inner//局部内部类
{
void Show()
{
System.out.println(NUM);
System.out.println(Out.this.num);
}
}
new Inner().Show();
}
}
public class InnerClassDemo {
public static void main(String[] args) {
Out out=new Out();
out.Method();
}}
因为方法在使用过后 会保留新建的对象但是弹栈后,局部变量消失造成无法找到对应变量。
但可以调用外部类的num因为外部类方法时通过创建对象建立的。存防在堆内存中 不会消失。








网友评论