Java----内部类
非静态内部类
静态内部类
匿名内部类
局部内部类
一、非静态内部类
内部类可以直接使用外部类的成员,但是外部类不能直接访问内部类的成员
内部类创建对象必须通过外部类,内部类的成员使用也需要通过外部类创建对象
内部类和外部类进行编译之后生成的是两个不同的类
非静态内部类中不能定义静态的成员
package com.company.testInnerClass;
public class outer1 {
private int age = 10;
void run()
{
System.out.println(age);
}
//普通内部类
class inner1{
//定义和外部类重名的属性
private int age = 20;
void m2(){
//内部类中可以直接调用外部类中的方法和属性
run();
//打印的是当前内部类中属性值
System.out.println(age);
//如果要调用外部类中与内部类重名的属性,可以通过外部类.this.属性名调用
System.out.println(outer1.this.age);
}
}
public static void main(String[] args) {
//使用内部类必须通过外部类的对象
//内部类的对象构建方法
outer1.inner1 n01 = new outer1().new inner1();
//第二种方法
outer1 o01 = new outer1();
inner1 n02 = o01.new inner1();
n01.m2();
System.out.println("--------------");
n02.m2();
}
}
二、静态内部类
静态内部类中可以直接访问外部类的静态成员,但不能访问非静态成员
静态内部类中的对象创建只能通过( 内部类 对象名 = new 外部类.内部类(); )的方法创建
package com.company.testInnerClass;
public class outer2 {
private int a = 10;
private static int b = 5;
static class inner2 {
public void test()
{
//静态内部类可以访问外部类的静态成员,但不能访问外部类的非静态成员
/*System.out.println(a);*/ //a会报错
System.out.println(b);
}
}
public static void main(String[] args) {
//创建静态内部类的对象只能使用下面的第二种方法
/* outer2 o1 = new outer2();
inner2 n1 = o1.new inner2();*/
inner2 n02 = new outer2.inner2();
n02.test();
}
}
匿名内部类
匿名内部类使用之后就没了,定义一次用一次
在定义匿名内部类时要注意语法格式,定义在对象调用方法的括号中充当参数的位置
package com.company.testInnerClass;
/*
* 匿名内部类
*/
public class outer3 {
public void test(A a)
{
a.run();
}
public static void main(String[] args) {
//创建outer3对象
outer3 o1 = new outer3();
//匿名内部类
o1.test(new A(){
public void run(){
System.out.println("outer3.run");
}
});
}
}
interface A{
void run();
}
局部内部类
局部内部类只能在定义的方法中使用
package com.company.testInnerClass;
/*局部内部类*/
public class outer4 {
public void run(){
//创建局部内部类
class inner4{
public void run2(){
System.out.println("inner4.run2");
}
}
//创建内部类对象调用run2()方法
new inner4().run2();
}
public static void main(String[] args) {
//创建外部类对象调用方法
outer4 o1 = new outer4();
o1.run();
}
}