java内部测试类代码详解

我们一般使用的java内部类有4种形式:一般内部类、局部内部类、匿名内部类、静态内部类。以下是我作的一个测试,以说明各种内部类的特性。

有关内部类的特性,代码中有详细说明,如下。

/*
* java内部类测试
*
* InterObj反射结果:
*
* private int i
* private InterObj$InterA ia
* public InterObj()
* public static void main(java.lang.String[])
* private int getI()
* public void p()
* public void pi()
* public void pp()
* public static void ppp()
* public void pppp()
* 下面是编译器自动生成用于访问私有属性或方法package级别的static方法
* static int access$0(InterObj)
*/
public class InterObj {
	private int i=8;
	private InterA ia=null;
	public InterObj(){
		ia=new InterA();
	}
	private int getI(){
		return i;
	}
	public void p(){
		pi();
		pp();
		ppp();
		pppp();
	}
	/*
  * 在一般内部类中可以访问“外套类”中的任何级别的方法和属性。而外套类也同样可以
  * 访问“内部类”中的任何级别的方法和属性。因为内部类可以持有对外套类对象的引用。
  * 而“外套类”对于自己的需要被内部类访问的私有方法和属性,编译器都会自动生成与
  * 私有方法和属性相对应的“package”级别的static方法,这些方法需要用外部类对象作
  * 为参数,这样就可以在“package”级别的static方法中通过访问外套类中的私有方法和
  * 属性了。
  * 而对于外套类要访问内部类中的私有方法和属性,也是同样的原理,内部类在编译时,
  * 会生成与需要被外套类访问的私有方法、属性相对应的“package”级别的static方法。
  *
  * InterA反射结果:
  * private int ia
  * 下面是内部类持有的外套类对象引用
  * final InterObj this$0
  * 构造函数中用外套类对象作为参数
  * InterObj$InterA(InterObj)
  * private void pA()
  * 下面是编译器自动生成用于访问私有属性或方法package级别的static方法
  * static void access$0(InterObj$InterA)
  * public void pA1()
  *
  */
	class InterA{
		private int ia=9;
		private void pA(){
			System.out.println("this is InterA.pA: ia="+ia+",InterObj.i="+getI());
		}
		public void pA1(){
			System.out.println("this is InterA.pA1: ia="+ia+",InterObj.i="+getI());
		}
	}
	/*
  * 局部内部类,只在方法内部可见,其它特性与一般内部类相同。
  * 对需要访问的局部变量,必需设置成final,因为局部内部类虽然可以持有对外套类对象的
  * 引用来访问外部类的属性和方法,但是却不能访问外部类方法中局部变量,所有编译器就
  * 在局部内部类中“拷贝”了一份需要访问的局部变量(但是对于基本类型int,float和String
  * 等值不发生改变的类型没有拷贝)为了保证拷贝的变量值和外部方法中的变量的值所指向的
  * 对象是同一 个对象,所以要求那些被局部类使用的局部变量应该设置成final,而不能被修
  * 改,这样来保证局部内中拷贝的变量和外部方法中的变量所指向的是同一个对象。变量设
  * 置成final只是控制变量指向的对象地址不变,而不是它指向的对象的内部属性不能改变。
  *
  * InterB的反射结果:
  *
  * private int ib
  * 下面是内部类持有的外套类对象引用
  * final InterObj this$0
  * 下面是内部类持有的外部方法中的局部变量Test对象的引用拷贝
  * private final Test val$test
  * 构造函数中用外套类对象和局部变量Test作为参数
  * InterObj$1$InterB(InterObj,Test)
  * private void pB()
  * 下面是编译器自动生成用于访问私有属性或方法package级别的static方法
  * static void access$0(InterObj$1$InterB)
  */
	public void pi(){
		final int s=5;
		final Test test=new Test();
		class InterB{
			private int ib=7;
			private void pB(){
				System.out.println("this is InterB.pB: ib="+ib+
				          ",(Method)pi.s="+s+",Test.t="+test.getT());
			}
		}
		InterB ib=new InterB();
		//此处改变了被局部内部类引用了的Test test的内部状态。
		//结果调用ib.pB()时,输出的就是改变后的值100
		test.setT(100);
		ib.pB();
	}
	/*
  * 静态内部类,在不需要持有对“外套类对象”的引用时使用。
  *
  * InterC反射结果:(静态内部类没有对外套类对象的引用)
  * private int ic
  * InterC()
  * private void pC()
  */
	static class InterC{
		private int ic=6;
		private void pC(){
			System.out.println("this is InterC.pC: ic="+ic);
		}
	}
	/*
  * 非静态方法,可以构造静态和非静态的内部类。
  * 可以访问内部类中任何权限的属性和方法
  */
	public void pp(){
		InterA ia=new InterA();
		ia.pA();
		ia.pA1();
		InterC ic=new InterC();
		ic.pC();
		//局部内部类,只在方法内部可见
		//InterB ib=new InterB();
	}
	/*
  * 静态方法,只能构造静态的内部类。
  * 不能构造非静态的内部类,因为静态方法中没有this来引用“外套类”的对象,来构造
  * 需要引用外套类对象引用的内部类对象。
  */
	public static void ppp(){
		//InterA ia=new InterA();
		//但是可以如下构造:
		InterObj iobj=new InterObj();
		InterA ia=iobj.new InterA();
		ia.pA();
		ia.pA1();
		InterC ic=new InterC();
		ic.pC();
		//局部内部类,只在方法内部可见
		//InterB ib=new InterB();
	}
	/*
  * 匿名内部类测试
  */
	public void pppp(){
		TestInterface tif=new TestInterface(){
			public void pppp() {
				System.out.println("TestInterface.noName");
			}
		}
		;
		tif.pppp();
	}
	/*
  * 运行结果:
  * this is InterB.pB: ib=7,(Method)pi.s=5,Test.t=100
  * this is InterA.pA: ia=9,InterObj.i=8
  * this is InterA.pA1: ia=9,InterObj.i=8
  * this is InterC.pC: ic=6
  * this is InterA.pA: ia=9,InterObj.i=8
  * this is InterA.pA1: ia=9,InterObj.i=8
  * this is InterC.pC: ic=6
  * TestInterface.noName
  */
	public static void main(String[] args) {
		InterObj io=new InterObj();
		io.p();
	}
}
/*
* 用于创建内部类的接口
*/
interface TestInterface{
	public void pppp();
}
/*
* 用于测试局部内部类的局部变量类
*/
class Test{
	private int t=9;
	public int getT(){
		return t;
	}
	public void setT(int t1){
		t=t1;
	}
}

再分享一则实例:

public class InnerClass {
	static Toy toy = new Toy(){
		String name = "老吴";
		@Override
		 public void jump()
		 {
			System.out.println(name+"跳出地球");
			go();
		}
		public void go(){
			System.out.println("奔跑");
		}
	}
	;
	/*内部类:定义在类的内部的类
 *1.成员内部类:
 *1.1成员内部类可以直接访问外部类的属性
 *1.2通过 外部类名.this 这种方式访问外部类的当前对象
 *成员内部类实例化对象: 外部类名.内部类名 引用名 = 外部类对象.new 内部类名();
 *2.静态内部类
 *2.1静态内部类内部不能访问外部类的成员资源,只能通过类名访问外部类的静态资源
 *静态内部类实例化对象: 外部类名.内部类名 引用名 = new 外部类名.内部类名();
 *3.局部内部类:
 *3.1也可以直接访问外部类的属性
 *3.2也可以通过 外部类名.this 访问外部类当前对象
 *3.3局部内部类只能在方法内部被访问,修饰符只能是默认的
 *4.匿名内部类:在需要一个类的具体子类实例的时候,临时的生成一个类使用
 *new 类名(){
 * 重写方法;
 *};
 *4.1匿名内部类访问外部方法的属性,该属性会被转换为常量
 *4.2匿名内部类中新增的属性和方法,只能在匿名内部类内部使用
 *
 */
	public static void main(String[] args)
	 {
		Person per = new Person("老陈",18);
		Person.Computer pc = per.new Computer("外星人");
		Person.Computer pc1 = new Person("简自豪",18).new Computer("外星人");
		pc.runGame();
		pc1.runGame();
		Person.Computer1 pc11 = new Person.Computer1("网吧的电脑");
		pc11.runGame();
		per.useComputer();
		String str = "啦啦啦";
		//str = "罗库偶偶";
		Computer com = new Computer(){
			@Override
			  public void runGame()
			  {
				// TODO Auto-generated method stub
				System.out.println(per.age+"岁的"+per.name+"在玩啦啦啦啦啦德玛西塔");
				System.out.println(str);
			}
		}
		;
		com.runGame();
		//具体类的匿名内部类独享
		/*Toy toy = new Toy(){
  @Override
  public void jump()
  {
  System.out.println("跳出地球");
  }
 };*/
		toy.jump();
		toy.jump();
		//toy.go();
		//System.out.println(toy.);
	}
}
class Person {
	String name;
	int age;
	static int age1 = 18;
	static String name1 = "全职高手";
	public Person(String name,int age)
	 {
		super();
		this.name = name;
		this.age = age;
	}
	public void playGame(){
		System.out.println(name+"玩游戏");
	}
	public class Computer{
		String name;
		public Computer(String name)
		 {
			super();
			this.name = name;
		}
		public void runGame(){
			System.out.println(name+"运行游戏");
			System.out.println(age+"岁的"+Person.this.name+"玩游戏");
		}
	}
	public static class Computer1{
		String name;
		public Computer1(String name)
		 {
			super();
			this.name = name;
		}
		public void runGame(){
			System.out.println(name+"运行游戏");
			System.out.println(Person.age1+"的"+Person.name1+"在玩游戏");
		}
	}
	public void useComputer(){
		class Computer{
			String name;
			public Computer(String name)
			  {
				super();
				this.name = name;
			}
			public void runGame(){
				System.out.println(name+"运行游戏");
				System.out.println(Person.this.age+"的"+Person.this.name+"正在玩游戏");
			}
		}
		Computer com = new Computer("笔记本");
		com.runGame();
	}
}
public interface Computer {
	void runGame();
}
public class Toy {
	public void jump(){
		System.out.println("玩具跳一下");
	}
}

总结

以上就是本文关于java内部测试类代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • java中的匿名内部类总结

     java中的匿名内部类总结 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法 abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat somet

  • java 内部类的详解及实例

     java 内部类的详解及实例 内部类的存在意义: 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.内部类使得多重继承的解决方案变得完整.接口解决了部分问题,二内部类有效地实现了"多重继承".(这是<Java编程思想>里面的解释) 代码: public class OuterAndInnerClass { public static void main(String[] args) { //创建内部类对象的

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • Java中的静态内部类详解及代码示例

    1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

  • java 中内部类的实例详解

    java 中内部类的实例详解 一:内部类可直接访问外部类的成员变量,包括外部类私有的成员变量 二:外部类要访问内部类的成员变量,需要建立内部类的对象 class Outer{ int x=110; public void show(){ System.out.println("外部类的x="+x); } public void showInner(){ Inner inner=new Inner(); inner.show(); System.out.println(inner.x);

  • Java单例模式实现静态内部类方法示例

    Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式.接下来我们看看具体介绍. Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下

  • java 中匿名内部类的实例详解

    java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈"); System.out.println("超级女声"); } TT tt=new TT(); tt.show(); 只是说我们这里采用的是匿名的形式来处理. 重写了Test的show()方法,在重写好了以后,又调用了重写后的show()方法 实现代码: package cn.com; c

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • java内部测试类代码详解

    我们一般使用的java内部类有4种形式:一般内部类.局部内部类.匿名内部类.静态内部类.以下是我作的一个测试,以说明各种内部类的特性. 有关内部类的特性,代码中有详细说明,如下. /* * java内部类测试 * * InterObj反射结果: * * private int i * private InterObj$InterA ia * public InterObj() * public static void main(java.lang.String[]) * private int

  • Java编程复用类代码详解

    本文研究的主要是Java编程中的复用类,那么到底复用类是什么东西,又有什么用法,下面具体介绍. 看了老罗罗升阳的专访,情不自禁地佩服,很年轻,我之前以为和罗永浩一个级别的年龄,也是见过的不是初高中编程的一位大牛之一,专访之后,发现老罗也是一步一个脚印的人.别说什么难做,做不了,你根本就没去尝试,也没有去坚持. If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but whateve

  • 一个通用的Java分页基类代码详解

    分页的基类 import java.util.List; /** * 分页显示的标准类,基本操作,是先给予-当前页数一共的数据条数-每页显示的条数, * 然后在初始化该类,得到总共页数,和开始序号和结束序号, * 然后数据库分页用到开始序号和结束序号,得到数据集合后赋值给该类的list属性, * * 然后把该类发送到jsp页面,进行访问 * @author admin * * @param <T> */ public class PageBean<T> { private int

  • JAVA错误类结果类和分页结果类代码详解

    这篇文章主要介绍了JAVA错误类结果类和分页结果类代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public interface ErrorCode { String getCode(); String getMsg(); /** * 公共错误码<br/> * 码段:10000~10099 * * */ public enum CommonError implements ErrorCode { SUCCESS("

  • Java回调函数实例代码详解

    首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到

  • Java反射 PropertyDescriptor类案例详解

    JAVA中反射机制(JavaBean的内省与BeanUtils库) 内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set(

  • java日期相关类实例详解

    一.Date类 类 Date 表示特定的瞬间,精确到毫秒.用距离1970年1月1日00:00:00的毫秒数(long)类型来表示一个特定的时间点,该值可正可负. Date类中很多方法已经过时,使用Calendar来替代. 常用方法有 long getTime() void setTime(long time) public class T01Date { public static void main(String[] args) { //getTime():返回的时间是距离1970年的毫秒数.

  • 通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并实现委托方法 //添加一个静态方法委托,返回整型值ID代表该方法与参数构成的实例.若失败,则返回-1. public synchronized int addFunctionDelegate(Class<?> srcClass,String methodName,Object... params)

  • Java中可变长度参数代码详解

    到J2SE1.4为止,一直无法在Java程序里定义实参个数可变的方法--因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了.尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但是这仍然不能达到让实参数量任意变化的目的. 然而,有些方法的语义要求它们必须能接受个数可变的实参--例如著名的main方法,就需要能接受所有的命令行参数为实参,而命令行参数的数目,事先根本无法确定下来. 对于这个问题,

  • Java Scoket实现双向通信代码详解

    你好我是辰兮,很高兴你能来阅读,本篇总结了Java Scoket类的相关知识,并且整理了实现双向通信的相关代码也有案例实现截图,分享获取新知,大家一起进步. 一.网络通信 网络通信,在网络中程序(发送者)与程序(接受者)之间的数据交互. 通信要素①ip + 端口号 ②传输协议 java.net包: 包含了Java用于网络通信所需的类. ServerSocket类,用于表示网络服务 创建网络服务(创建ServerSocket对象) //构造器 public ServerSocket(int por

随机推荐