内部类小结

来源:互联网 发布:jquery遍历json的顺序 编辑:程序博客网 时间:2024/06/07 03:05
内部类:
        可以直接访问外部类的成员,包括私有;
外部类访问内部类的成员必须创建对象;
成员内部类:在成员位置
局部内部类:在成员方法内部


外界创建成员内部类对象的格式:
外部类名.内部类名   对象名=外部对象.内部对象
如: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();
}
}



0 0