一、内部类

    1、将一个类定义在另一个类的里面,对里面那个类就成为内部类(内置类,嵌套类)
    2
、访问特点、访问规则:
        (1)
、内部类可以直接访问外部类中的成员,包括私有成员
        (2)
、而外部类要访问内部类中的成员必须要建立内部类的对象
        (3)
、之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用, 格式类名.this
        (4)
、外部类.内部类 变量名 = new 外部类().new 内部类();

例子1:

 

class Outer

{

int x = 3;

 

//内部类可以被私有修饰! private class Inner

class Inner//内部类:可以直接访问外部类的成员

{

int x = 4; 

 

void function()

{

int x = 6;

//System.out.println("inner :"+x);//结果是6;内部有就不出去找了

//System.out.println("inner :"+this.x);//this.x//结果:4

System.out.println("inner :"+Outer.this.x);//结果是,3

}

}

 

void method()

{

System.out.println(x);

 

Inner in = new Inner();//外部类要访问内部类,必须建立对象,才能访问内部类

in.function();

}

}

 

public class InnerClassDemo 

{

public static void main(String[] args) 

{

//Outer out = new Outer();

//out.method();

 

//直接访问内部类中的成员

Outer.Inner in = new Outer().new Inner();//格式:就面试用

in.function();

}

 

}


二、静态内部类
    1
、当内部类在成员位置上时,就可以被成员修饰符所修饰
        (1)
private:将内部类在外部类中进行封装
        (2)
static:内部类就具备了静态的特性,当内部类别static修饰后,只能直接访问外部类中的static成员,出现了访问局限
        (3)
、访问被static 修饰的内部类,访问非静态    new 外部类.内部类().方法
        (3)
、访问被static 修饰的内部类,访问静态    new 外部类.内部类.方法
    2
、访问格式
        (1)
、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部类对象
        (2)
、外部类.内部类 变量名 = new 外部类().new 内部类();
    3
、主意:
        (1)
、当内部类中定义了静态成员,该内部类必须是static
        (2)
、当外部类中的静态方法,访问内部类时,内部类也必须是 static

例子2:

 

class Body

{

private class XinZang//私有了,外部不能访问;必须提供访问心脏的方法才能访问

{

//隐藏了

}

 

public void show()//提供心脏访问方式

{

new XinZang();

}

}

 

*/

 

class Outer1

{

private static int x = 3;

 

static class Inner1//静态内部类(共享数据)//内部类中有静态方法,类必须也是静态

{

//void function()//非静态方法

static void function()//静态方法

{

System.out.println("inner :"+x);

}

}

 

 

class Inner2

{

void show()

{

System.out.println("Innet2 show");

}

}

 

public static void method()

{

Inner1.function();//静态方法访问静态成员

 

//new Inner2().show();//出错

//必须把class Inner2改成静态内部类,才能访问他的非静态方法show

}

}

 

public class InnerClassDemo2 

{

public static void main(String[] args) 

{   

//Outer1.Inner1.function();

 

//类调用     对象调用  

//new Outer1.Inner1().function();//Inner1是static的,可用类访问;方法functin不是静态,用对象调用

 

//Outer.Inner in = new Outer().new Inner();//格式:就面试用

//in.function();

 

//Outer1.method();//静态方法可以直接访问静态变量,function会运行//结果:inner:3

 

}

 

}

 


三、内部类定义原则  
    1
、类是用来描述事物的,当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容。
    2
、隐藏内部类,提供相应接口
    3
、内部类定义在局部,时
        (1)
、不可以被成员修饰符修饰
        (2)
、可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部的变量,只能访问被final修饰的局部变量。

 

例子3:

class Outer3

{

int x = 3;

 

void method(final int a)

{

//a++;//出错,因为此时a被锁住,不能改变

 

final int y = 4;//局部变量

 

class Inner3//局部,不能定义成static,private型,因为这两个是修饰成员的

{

void function()//他若是静态,类必须也是静态,所以也不能用static,private修饰

{

 

System.out.println(a);

}

}

 

new Inner3().function();

}

}

 

public class InnerClassDemo3 

{

public static void main(String[] args) 

{

//new Outer3().method();

Outer3 out = new Outer3();

out.method(7);//结果:7; 执行完,出栈,释放内存

out.method(8);//结果:8; 所以不会出错

}

 

}

四、匿名内部类       

 

1、匿名内部类其实就是内部类的简写格式

2、定义匿名内部类的前提

   (1)、内部类必须是继承一个类或者实现接口

3、匿名内部类的格式:new 父类或者接口(){定义子类的内容}

4、其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖。可以理解为带内容的对象;

5、匿名内部类中定义的方法最好不要超过三个;

例子

 

abstract class AbsDemo

{

abstract void show();

}

 

class Outer4

{

int x = 3;

 

 

 

//简化:

 

public void function()//建立方法,通过建立对象访问内部类

{

//AbsDemo a = new Inner();//多态:父类引用指向子类对象

 

//Inner in = new Inner();

//in.show();

//in.abc();//简化内部类不能实现

 

//new Inner4().show();

 

AbsDemo d = new AbsDemo()

{

//里面可以定义变量,和方法;但是尽量不要写太多,匿名内部类就是为了简化

//int num = 9;

void show()

{

System.out.println("x="+x);

}

 

void abc()

{

System.out.println("haha");

}

};

d.show();

//d.abc();//因为只能使用父类方法,编译失败

 

 

}

}

 

public class InnerClassDemo4 

{

public static void main(String[] args) 

{

new Outer4().function();

}

 

}

posted on 2013-03-10 14:38  Stone_S123  阅读(133)  评论(0编辑  收藏  举报