分享
 
 
 

JAVA技术专题综述之内部类篇

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

有些类的定义中包含另一个类的定义。这种处于内部的类称为内部类(inner class)。

例如:

public class OuterClass

{

public class InnerClass

{

//---This is a inner class.

}

}

InnerClass类嵌套在OuterClass中,并且被声明为public,因此被OuterClass类之外的对象访问。

InnerClass类没有被声明为OuterClass类的一个静态成员,因此除非生成了一个OuterClass对象,否则无法生成任何InnerClass对象。但是,当你声明一个包含嵌套类的类对象时,并不一定会生成嵌套类的对象,这主要由包含嵌套类的类的构造方法决定。

示例1:

class OuterClass

{

class InnerClass

{}

}

public class Test

{

public static void main(String[] args)

{

OuterClass out = new OuterClass();

OuterClass.InnerClass in = out.new InnerClass();

}

}

我们使用OuterClass out = new OuterClass();语句生成了一个OuterClass类对象。然后又使用OuterClass.InnerClass in = out.new InnerClass();语句借助外部类的实例生成了一个内部类的对象。main()方法中的两条语句也可以用下面的这一条语句替换:

OuterClass.InnerClass in = new OuterClass().new InnerClass();

总之:在一个类(Test)中,创建另一个类(OuterClass)中的非静态内部类(InnerClass)必须要借助这个外部类(OuterClass)的一个实例。而且这个内部类对象的声明也必须用OuterClass.InnerClass的形式。

示例2:

public class Test

{

class InnerClass

{}

1

public static void main(String[] args)

{

InnerClass in = new Test().new InnerClass();

}

}

在main()方法中实例化本类的内部类可以用上例的形式。

示例3:

public class Test

{

class InnerClass

{}

InnerClass in = new InnerClass();

public static void main(String[] args)

{}

}

在main()方法外,实例化本类的内部类就和我们平常的操作一样了。

示例4:

public class Test

{

class InnerClass

{}

public void method()

{

InnerClass in = new InnerClass();

}

public static void main(String[] args)

{}

}

在本类的非静态方法中,实例化本类的内部类也和我们平常的操作一样。

为了让内部类的对象不依赖于外部类的对象,你可以把内部类声明为static。

示例5:

class OuterClass

{

static class InnerClass

{}

}

public class Test

{

public static void main(String[] args)

{

2

OuterClass.InnerClass in = new OuterClass.InnerClass();

}

}

从这个例子我们可以看出:创建InnerClass类的对象不再需要OuterClass类的对象。但依然要用OuterClass.InnerClass这个形式声明in对象。

示例6:

class Outer

{

static int outer_stat = 0;

int outer_non_stat = 1;

static class StaticInner

{

static int stat = 2;

static int stat_test = outer_stat;

public void tester()

{

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

}

}

class NonStaticInner

{

public void tester()

{

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

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

System.out.println("StaticInner.stat = " + StaticInner.stat);

}

}

}

public class Test

{

public static void main(String[] args)

{

new Outer().new NonStaticInner().tester();

System.out.println("------------");

new Outer.StaticInner().tester();

}

}

输出结果:

outer_stat = 0

outer_non_stat = 1

StaticInner.stat = 2

3

------------

outer_stat = 0

NonStaticInner类中的System.out.println("outer_stat = " + outer_stat);语句说明:非静态内部类的非静态成员可以访问外部类的静态变量。

System.out.println("outer_non_stat = " + outer_non_stat);语句说明:非静态内部类的非静态成员可以访问外部类的非静态变量。

System.out.println("StaticInner.stat = " + StaticInner.stat);语句说明:非静态内部类的非静态成员可以访问相同外部类下的静态内部类的静态变量。

StaticInner类中的System.out.println("outer_stat = " + outer_stat);语句说明:静态内部类的非静态成员可以访问外部类的静态变量。

static int stat_test = outer_stat;语句说明:静态内部类的静态成员可以访问外部类的静态变量。

注意:静态内部类可以有静态成员,而非静态内部类则不能有静态成员。

示例7:

class Outer

{

public void tester()

{

class Inner

{}

}

}

public class Test

{

public static void main(String[] args)

{}

}

可以在一个方法中定义一个类,这个类称为本地内部类。只能在本地,也就是说在该类定义出现的方法中生成一个本地内部类的对象。这种处理适用于一个方法中的计算要求使用一种特殊的类,而这个类在其他地方根本不需要的时候。

本地内部类可以引用其定义出现所在的方法中声明的变量,当且仅当这种变量是final型的。请看示例8。

示例8:

class Outer

{

public void tester()

{

final int i = 5;

class Inner

{

int j = i;

4

}

Inner in = new Inner();

}

}

public class Test

{

public static void main(String[] args)

{}

}

最后来讲解匿名内部类。简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

?只用到类的一个实例。

?类在定义后马上用到。

?类非常小(SUN推荐是在4行代码以下)

?给类命名并不会导致你的代码更容易被理解。

在使用匿名内部类时,要记住以下4个原则:

?匿名内部类不能有构造方法。

?匿名内部类不能定义任何静态成员、方法和类。

?匿名内部类不能是public,protected,private,static。

?只能创建匿名内部类的一个实例。

下面是匿名内部类的用法举例。请读者通过例子来体会匿名内部类的用法。

示例9:(注意:匿名内部类以";"结束)

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Test extends JFrame

{

Test()

{

super("test_title");

Container cp = getContentPane();

cp.setLayout(new FlowLayout());

JButton btn = new JButton("close");

cp.add(btn);

btn.addActionListener(act);

setSize(300,200);

}

ActionListener act = new ActionListener()

{

public void actionPerformed(ActionEvent e)

5

{

System.exit(0);

}

};

public static void main(String[] args)

{

Test test = new Test();

test.setVisible(true);

}

}

示例10:(根据示例8改编)

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Test extends JFrame

{

Test()

{

super("test_title");

Container cp = getContentPane();

cp.setLayout(new FlowLayout());

JButton btn = new JButton("close");

cp.add(btn);

btn.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

System.exit(0);

}

});

}

public static void main(String[] args)

{

Test test = new Test();

test.setSize(300,200);

test.setVisible(true);

}

}

示例11:

public class Test

{

public static void main(String[] args)

6

{

Thread r = new Thread()

{

public void run()

{

for(int k=0;k

{

System.out.print(k);

}

}

};

r.start();

}

}

示例12:(根据示例11改编)

public cl

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有