可以直接访问外部类的成员,包括私有;
外部类访问内部类的成员必须创建对象;
成员内部类:在成员位置
局部内部类:在成员方法内部
外界创建成员内部类对象的格式:
外部类名.内部类名 对象名=外部对象.内部对象
如:Outer.Inner oi=new Outer().new Inner();
注意:
被静态修饰的成员内部类,只能访问外部类的静态成员;
内部类被静态修饰后的方法可以有静态方法也可以有非静态方法;
对于局部内部类访问局部变量:
可以直接访问外部类的成员;
在局部位置可以创建内部类对象,通过对像调用内部类方法;
局部内部类访问局部变量必须被声明为final;
匿名内部类:
前提:存在一个类或者接口(可具体,可抽象)
格式:new 类名或者接口名(){重写方法;}
本质:是一个继承了该类或者实现了该接口的子类匿名对象
具体代码:
一、
/**
* @author
* date:
* function:测试内部类
*/
package com.test3_1;
public class Demo1 {
public static void main(String[] args) {
Demo1 d1=new Demo1();
System.out.println("主类成员变量"+d1.a);
//System.out.println("成员内部类成员变量"+b);必须创建内部类对象
//外部类创建成员内部类对象,下面两个是一样的
Demo1.Inner1 di1=new Demo1().new Inner1();
di1.getInner1();
Demo1.Inner1 di2=d1.new Inner1();
di2.getInner1();
System.out.println("成员内部类成员变量"+di1.b);
//Demo1.Inner2 di3=d1.new Inner2();如果Demo1是静态的类,才能创建静态的内部类,否则这样写不行
//di3.getInner2();
d1.method();
}
//成员变量
private int a=10;
static private int c=40;
//成员内部类
class Inner1
{
private int b=20;
public void getInner1()
{
System.out.println("成员内部类方法输出内部类成员变量"+b);
System.out.println("成员内部类方法输出外部类私有成员变量"+a);
}
}
//成员内部类
static class Inner2
{
private int b=20;
public void getInner2()
{
System.out.println("成员内部类方法输出内部类成员变量"+b);
//System.out.println("成员内部类方法输出外部类私有成员变量"+a);只能访问外部静态的成员
System.out.println("成员内部类方法输出外部类静态私有成员变量"+c);
}
}
//成员方法
public void method()
{
//局部变量必须为final型才能被局部内部类访问
final int d=30;
//局部内部类
class Inner3
{
public void getInner3()
{
//局部内部类可以直接访问外部类成员
System.out.println("局部内部类方法输出外部类成员变量"+a);
//局部变量必须为final型才能被局部内部类访问
System.out.println("局部内部类方法输出局部成员常量"+d);
}
}
//在局部位置可以创建局部内部类对象
Inner3 i3=new Inner3();
i3.getInner3();
}
}
二、
/**
* @param
* date:
* function:测试匿名内部类
*/
package com.test3_1;
public class Demo2 {
public static void main(String[] args) {
Outer o=new Outer();
o.method();//不会输出结果show,因为该方法中只有一个匿名对象,该对象没有调用方法
}
}
//前提是存在一个类或接口
interface Inter
{
public abstract void show();
}
//外部类
class Outer
{
public void method()
{
//匿名内部类,实现接口,得到一个子类匿名对象,所以下面也是用分号
new Inter()
{
public void show()
{
System.out.println("show");
}
};//注意分号
}
}
三、
/**
* @param
* date:
* function:匿名内部类的方法调用
*/
package com.test3_1;
public class Demo3 {
public static void main(String[] args) {
Outer1 o=new Outer1();
o.method();
}
}
interface Inter1
{
public abstract void show1();
public abstract void show2();
}
class Outer1
{
public void method()
{
//一个方法的调用,也要实现接口中的所有方法
new Inter1()
{
public void show1()
{
System.out.println("show1");
}
public void show2()
{
System.out.println("show2");
}
}.show1();
//两个方法的调用
Inter1 i=new Inter1()
{
public void show1()
{
System.out.println("show1");
}
public void show2()
{
System.out.println("show2");
}
};
i.show1();
i.show2();
}
}