JAVA技术专题综述 之 内部类篇
有些类的定义中包含另一个类的定义。这种处于内部的类称为内部类(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
{}
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)
{ 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
------------
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;
}
Inner in = new Inner();
}
}
public class Test
{
public static void main(String[] args)
{}
}
最后来讲解匿名内部类。简单地说:匿名内部类就是没有名字的内部类。什么情况下需要
使用
匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN 推荐是在 4 行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下 4 个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是 public,protected,private,static。
·只能创建匿名内部类的一个实例。
下面是匿名内部类的用法举例。请读者通过例子来体会匿名内部类的用法。
示例 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(act);
setSize(300,200);
}
ActionListener act = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
};
public static void main(String[] args)
{
Test test = new Test();
test.setVisible(true);
}
}
示例 9:(根据示例 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);
}
}
示例 10:
public class Test
{
public static void main(String[] args)
{
Thread r = new Thread()
{
public void run()
{
for(int k=0;k<10;k++)
{
System.out.print(k);
}
}
};
r.start();
}
}
示例 11:(根据示例 10 改编)
public class Test
{
public static void main(String[] args)
{
new Thread(new Runnable()
{
public void run()
{
System.out.println("run");
}
}).start();
}
}
示例 10 和 11 的程序并没有什么实际用处,在实际编程时几乎没有人这样写程序。但这两个程
序有助于我们理解匿名内部类的用法。
发表评论
-
深入分析 Java 中的中文编码问题
2011-11-16 07:45 0几种常见的编码格式 ... -
Java 编码
2011-11-16 07:44 0http://zhidao.baidu.com/quest ... -
java字符编码原理解析
2011-11-16 07:43 0可以理解为计算机没 ... -
HttpClient
2011-11-03 11:07 844From http://www.blogjava.net/Al ... -
ECLIPSE ANT OutOfMemoryError
2011-08-04 17:23 1026ANT BUILD MEMORY ERROR: [cl ... -
JDBC BATCH
2011-07-05 14:58 0PreparedStatement ps = conn.pre ... -
OUT OF MEMORY WHEN BUILD
2011-02-22 17:47 01, ANT BUILD: In Eclipse op ... -
spring weblogic jndi
2011-02-16 09:18 1850weblogic:weblogic8.1 数据库:MySql ... -
log4j 邮件
2011-01-24 15:54 0<!-- 设置上下文参数 --> ... -
tomcat weblogic
2010-12-01 11:25 1877EJB 层基本搞定,以前测试 EJB 也都是写一个 appli ... -
ant weblogic “local class incompatible: stream classdesc serialVersionUI”
2010-11-29 12:41 2251weblogic.management.Management ... -
Debugging with the Maven Jetty Plugin in Eclipse
2010-11-15 17:42 1047debug: http://docs.codehaus.or ... -
maven tomcat eclipse debug
2010-11-15 17:36 1964from: http://bandaidprogrammin ... -
maven app tomcat 部署
2010-11-11 15:56 1317修改pom.xml,添加如下配置: <build ... -
Maven Cargo Tomcat 部署
2010-11-11 15:49 1781pom.xml中<build>下添加如下代码: ... -
java中读取配置文件各种方法
2010-09-07 12:31 01。使用Java.util.Properties类的load( ... -
ThreadGroup
2010-05-25 08:47 0在Java中每个线程都属于某个线程组(ThreadGroup) ... -
java Excel 导出
2010-03-28 20:06 0public void createExcel(OutputS ... -
java小数保留两位小数
2009-11-19 16:49 2348方式一: 四舍五入 double f = ... -
java中实现xml schema 验证文件
2009-11-16 20:05 3896XML 是可扩展标记语言,也就是说其中的标记我们可以按照我们 ...
相关推荐
Java 内部类详解 Java 内部类是一种高级特性,允许在一个类的定义内部创建另一个类。这种设计模式提供了更灵活的代码组织方式,同时还可以实现特定的封装和访问控制。内部类主要分为四种类型:静态内部类、成员内部...
### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...
### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...
### Java内部类应用详解 #### 一、引言 自Java 1.1引入内部类这一概念以来,它一直是开发者们热烈讨论的话题。作为一种强大的语言特性,内部类为Java编程带来了许多灵活性,但也可能导致代码复杂度增加。正确理解...
Java 内部类是Java语言特性中的一个重要组成部分,它允许我们在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现复杂逻辑和封装上具有很大的灵活性。下面我们将详细...
### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...
Java内部类是Java语言提供的一种独特特性,它允许我们在一个类的定义内部定义另一个类。这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用...
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在处理一些特定情况时非常有用,例如实现匿名回调、封装特定逻辑或创建与外部类有紧密关系的类。本篇文章将深入探讨Java...
Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...
### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...
Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...
Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...
Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...
Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...
谈Java内部类的四个应用场景
Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...
### Java内部类的作用 #### 一、定义及概念 内部类,顾名思义,指的是一个定义在另一个类内部的类。这样的结构让内部类能够访问外部类的成员(包括私有成员),并且允许内部类拥有不同的访问级别,如`private`、`...
Java内部类是Java语言的一个重要特性,它允许我们在一个类的内部定义另一个类。这种设计模式使得代码结构更加紧凑,同时也提供了更高级的封装和抽象。内部类主要有两种类型:成员内部类和局部内部类。 1. 成员内部...