JAVA内部类

转载 2004年08月19日 22:37:00

//StaticCls.java

public class StaticCls{
 public static void main(String[] args){
//  OuterCls ci = new StaticCls().new OuterCls();//method 3 replace 2.1
//  OuterCls.InnerCls oi=new OuterCls.InnerCls();//method 1
  OuterCls ci = new OuterCls();//method 2.1
  OuterCls.InnerCls oi = ci.new InnerCls();//method 2.2
 }
}//if we use method 3 ,we must put OuterCls into the StaticCls

class OuterCls{
 OuterCls(){
  System.out.println("OuterCls");
 }
// public static class InnerCls{//1 public or default? Please have a try
 public class InnerCls{
  InnerCls(){
   System.out.println("InnerCls");
  }
 }
}

//xTest.java

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 xTest{
 public static void main(String[] args){
  new Outer().new NonStaticInner().tester();
  System.out.println("------------");
  new Outer.StaticInner().tester();
 }
}

JAVA技术专题综述之内部类篇
来源:IT网络学院 2003年5月8日11:6
  有些类的定义中包含另一个类的定义。这种处于内部的类称为内部类(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。 
  ·只能创建匿名内部类的一个实例。 

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

  示例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) 


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) 


Thread r = new Thread() 

public void run() 

for(int k=0;k<10;k++) 

System.out.print(k); 


}; 
r.start(); 

}  

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

public class Test 

public static void main(String[] args) 

new Thread(new Runnable() 

public void run() 

System.out.println("run"); 

}).start(); 

  示例11和12的程序并没有什么实际用处,在实际编程时几乎没有人这样写程序。但这两个程序有助于我们理解匿名内部类的用法。

@ 符号 在java中是什么语法 代表什么

java中@是什么     J2SE 提供的最后一个批注是 @SuppressWarnings。该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。     一点背景:...
  • skyboy11yk
  • skyboy11yk
  • 2013年10月12日 16:49
  • 38686

关于java中<T>问题

关于java中问题 Jdk5.0新特性Generic Types (泛型) 原文 来源: 中国IT实验室 作者: 未知 责编: 宝良 1. 介绍 2.定义简单Java泛型 其实Java...
  • zhengqiqiqinqin
  • zhengqiqiqinqin
  • 2013年05月31日 19:22
  • 35805

Java中布尔类型操作&=,|=与^=的使用

今天在对同事的代码进行code review的时候,见到一个比较好玩的写法。“flag &= false;”,乍一看,还感觉他写错了,但是程序可以正常运行,赶紧去百度,看一下这个写法到底是怎么一回事,...
  • ziwen00
  • ziwen00
  • 2014年10月31日 16:35
  • 17976

java中==与equel的区别

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。     ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
  • hellokatewj
  • hellokatewj
  • 2014年03月26日 17:43
  • 2822

java this 3种常见用法 详解

this 关键字 1.区分成员变量和局部变量 2.代表当前对象 3.构造器之间调用
  • u012176204
  • u012176204
  • 2017年01月17日 09:41
  • 3064

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。...
  • wuwenxiang91322
  • wuwenxiang91322
  • 2013年10月02日 09:28
  • 80276

Java可以做什么及可以给我们带来什么?

一般来说,Java是一个功能强大的软件平台。一套完整的Java平台将会给你带来如下特性: 开发工具箱:...
  • stewen_001
  • stewen_001
  • 2014年03月12日 16:06
  • 2891

Java 进度条控件的使用

利用JProcessBar类可以实现一个进度条,它本身不过是一个矩形控件,通过填充它的部分或全部来指示一个任务的执行情况,可以放置到一个新的线程中运行。 示例如下:...
  • kehyuanyu
  • kehyuanyu
  • 2014年05月19日 17:44
  • 8664

最小堆和最大堆的JAVA实现

/** * 文件名:BinaryHeap.java * 时间:2014年11月3日下午7:15:34 * 作者:修维康 */ package chapter6; import java.ut...
  • xiuweikang
  • xiuweikang
  • 2014年11月04日 16:37
  • 4432

java事务处理全解析

最近学习java事务,看到一位前辈的系列博客不错,转载过来作为记录 转载地址:http://www.davenkin.me/post/2013-02-16/40048284001    (一)Ja...
  • huilangeliuxin
  • huilangeliuxin
  • 2015年02月03日 10:26
  • 55300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA内部类
举报原因:
原因补充:

(最多只允许输入30个字)