**
关于JAVA内部类的小见解
**
- 非静态内部类
特点:
1、外部类不能直接访问非静态类内部成员
2、创建非静态内部类对象时,要先创建外部类对象再创建内部类对象
3、非静态内部类不能定义静态成员、方法以及代码块
public class Test_innerclass {
public static void main(String arg[]) {
outer.inner nner = new outer().new inner();
//说明非静态内部类必须寄存在一个外部类对象下。所以创建一个非静态类对象时一定要先创建外部类对象
nner.testinner();
}
class outer{
int b = 5;
void a() {
System.out.println("444444");
}
/*外部类不能直接访问非静态内部类的成员
System.out.println("调用内部类对象"+inner.b);
void testinner2() {
tastinner();
}
*/
class inner{
/*非静态类不能定义静态成员、方法以及静态块
static int d = 5;
static void way() {
}
static {
}
*/
int b = 3;
public void testinner() {
int b = 10;
System.out.println("答案是="+outer.this.b);
System.out.println("答案是="+this.b);
/*改成inner.b或者outer.inner.b会出现编译错误
System.out.println("答案是="+inner.b);
System.out.println("答案是="+outer.inner.b);
这个this本身的含义还不知道代表啥*/
System.out.println("答案是="+b);
}
}
}
- 静态内部类
特点:
1、外部类能够调用静态内部类的静态成员
2、静态内部类的方法不能调用外部类的成员
3、静态内部类相当于外部类的一个成员,所以可以直接创建静态内部类对象
迷惑点:
1、在静态内部类中设置了一个静态成员b,当在内部类方法中调用时,只能用this.b,而用inner.b或者outer.inner.b时会报错,那么这个this这里指代的是什么呢
public class Test_innerclass {
public static void main(String arg[]) {
outer2.inner2 nner2 = new outer2.inner2();
//说明静态内部类相当于外部类一个成员,所以不需要先生成外部类对象再来生成内部类对象
nner2.testinner();
}
}
class outer2{
int b = 5;
void a() {
System.out.println("444444"+ inner2.b);
//说明外部类的方法能调用静态内部类的静态成员
}
static class inner2{
static int b = 3;
public void testinner() {
int b = 10;
/*静态内部类方法不能调用外部类的成员
System.out.println("答案是="+outer2.this.b);
*/
System.out.println("答案是="+this.b);
/*改成inner.b或者outer.inner.b会出现编译错误
System.out.println("答案是="+inner.b);
System.out.println("答案是="+outer.inner.b);
这个this本身的含义还不知道代表啥*/
System.out.println("答案是="+b);
}
}
}
- 匿名内部类
特点
1、不需要定义一个新类来继承接口
2、只能调用一次
3、接口的实现是在调用接口方法的地方而不是在main函数里
public class Test_innerclass {
public static void main(String arg[]) {
Test_innerclass.test(new A(){
public void aa() {
System.out.println("55555");
}
//说明实现接口A,将内容返回给test(A a),从而不需要定义一个实类来实现接口
});
interface A {
void aa();
}
public static void test(A a) {
a.aa();
}
}
4、局部内部类
特点:
1、只能在方法中使用,方法中创建,出了方法就无效了
public class Test_innerclass {
public static void main(String arg[]) {
Test_innerclass b = new Test_innerclass();
b.test();
}
public void test() {
class inner3{
int b = 10;
void show() {
System.out.println("砥砺前行"+b);
}
}
new inner3().show();
}
}