一成员内部类:作为外部类的成员存在,与成员变量和方法平级关系。
class Out{
//成员变量
//成员方法
访问权限 class In{//成员内部类
}
}
语法:
成员内部类的访问权限:任意的
创建成员内部类的对象:由于成员内部类作为外部类的成员存在,若想访问类成员需通过对象,所以成员内部类需要通过外部类对象创建。
创建成员内部类对象的语法:
一:
Out o=new Out();
Out.In i=o.new In();
二:
Out.In o1=new Out().new In();
如何在成员内部类中访问外部类的成员:
1当外部类的属性和内部类属性不同名时,可以直接访问。
2当外部类属性与内部类属性同名时,格式:
外部类名.this.属性名
class A{
int i=1;
int j=1;
void f()
{
System.out.println("我是外部类");
}
class B
{
int i=2;
void f()
{
System.out.println("我是内部类");
A.this.f();
System.out.println("外部类中i="+A.this.i+" "+"j="+j);
System.out.println("内部类中i="+i);
}
}
}
public class Test {
public static void main(String[] args) {
A.B haha=new A().new B();
haha.f();
}
}
输出:
我是内部类
我是外部类
外部类中i=1 j=1
内部类中i=2
成员内部类的字节码文件格式:
外部类$内部类名.class
二局部内部类:
作为局部成员存在,和局部变量平级
class Outer{
//成员变量
//成员方法
public void fun(){//局部内部类所在的方法
class Inner{
//局部内部类的成员变量
//局部内部类的成员方法
}}}
局部内部类的访问权限:只能是默认的
创建局部内部类的对象:直接在局部内部类所在的方法中创建对象并调用方法。
如何在局部内部类中访问外部类的属性:
1不同名:直接访问
2同名:外部类名.this.属性名
字节码文件:外部类名$编号内部类名.class
class A
{
int i=1;
void f()
{
class B//成员内部类
{
int i=1;
void f()
{
System.out.println("我是局部内部类中的函数哦!");
System.out.println("外部类的i="+A.this.i);
System.out.println("局部内类的i="+i);
}
}
B b=new B();
b.f();
}
}
public class Test {
public static void main(String[] args) {
A a=new A();
a.f();
}
}
输出:
我是局部内部类中的函数哦!
外部类的i=1
局部内类的i=1
三静态内部类:用static修饰的成员内部类是静态内部类
public class Out{
访问权限 static class In{
}
}
说明:
访问权限:任意的,一般用public修饰
使用static修饰的成员内部类,自动提升为普通类,相当于一个独立的类
创建对象:
不需要外部类的对象,可以直接创建静态内部类的对象,格式:
外部类名.内部类名 标识符=new 外部类名.内部类名();
package haha;
class A
{
int a1=1;
static int a2=2;
void f1()
{
System.out.println("我是外部类的非静态函数");
}
static void f2()
{
System.out.println("我是外部类的静态函数");
}
static void g1()
{
System.out.println("外部类的同名静态函数");
}
public static class B
{
static void g1()//就算不用static修饰,它里面也只能直接调用外部类的静态成员
{
//f1();非静态报错
f2();
//System.out.println(a1);非静态报错
System.out.println(a2);
A.g1();
}
}
}
public class Test {
public static void main(String[] args)
{
A.B haha=new A.B();//前后A.B都要写全
haha.g1();
System.out.println();
A.B.g1();
}
}
我是外部类的静态函数
2
外部类的同名静态函数
我是外部类的静态函数
2
外部类的同名静态函数
四匿名内部类:没有名字的内部类
产生原因:由于接口和抽象类不能创建对象,若一个接口的实现类只需要使用一次,或一个抽象类的非抽象类只需要使用一次,可以使用匿名内部类,匿名内部类只能创建一个对象。
匿名内部类的注意事项:
匿名内部类中必须把抽象方法全部实现。
匿名内部类可以声明独有的属性和方法,但是由于接口引用不能访问实现类中独有的属性和方法,所以一般不在内部类中声明独有的方法。
匿名对象:若在匿名内部类中声明了独有的方法和属性,可以使用匿名对象访问,匿名对象只能访问一次。