初学Java,内部类(十九)

news/2024/7/4 0:53:46 标签: java, class, string, 测试
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views"> 非静态内部类访问外部类同名实例属性
class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class DiscernVariable 
{
	private String prop = "外部类属性";
	private class InClass
	{
		private String prop = "内部类属性";
		public void info()
		{
			String prop = "局部变量";
			//通过外部类类名.this.varName 访问外部类实例属性
			System.out.println("外部类的属性值:" + DiscernVariable.this.prop);
			//通过this.varName 访问内部类实例的属性
			System.out.println("内部类的属性值:" + this.prop);
			//直接访问局部变量
			System.out.println("局部变量的值:" + prop);
		}
	}
	public void test()
	{
		InClass in = new InClass();
		in.info();
	}
	public static void main(String[] args) 
	{
		new DiscernVariable().test();
	}
}


非静态内部类可以访问外部类private实例属性,但是反过来外部类访问内部类的private实例属性就不行了,原因在于,内部类保有外部类的对象引用,而外部类没有内部类的引用

如果要访问内部类的实例属性, 可以这样 new Inner().inProp

编译上面的程序,文件所有路径会生成两个class文件,一个是DiscernVariable,一个是DiscernVariable$InClass.class

成员内部类(包括,静态,非静态)的class文件总是这种形式: OuterClass$InnerClass.class

Java不允许在非静态类里定义静态成员(静态方法,静态属性,静态初始化块)

如果是静态内部类,同样用static修饰,这个内部类与外部类相关,属于整个外部类,而不是单独属于外部类的某个对象,因此静态内部类称为类内部类,静态类不能访问外部类的实例成员,换句话说,就是不能访问非静态的成员,只要是静态的就是对类而言,非静态就是对类的实例而言,而且它们保存的内存位置也不相同,类保存在栈区,类的实例保存在堆区

如果在外部类以处使用非静态内部类,那么就不能对内部类使用private修饰符.因为非静态内部类的对象必须寄存在外部类的对象里,因此创建非静态内部类对象之前,必须先创建 其外部类的对象.

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class out 
{
	//定义一个内部类,不使用访问控制符,即同一个包中其他类可访问该内部类
	class In
	{
		public In(String msg)
		{
			System.out.println(msg);
		}
	}
}

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class CreateInnerInstance 
{
	public static void main(String[] args) 
	{
		Out.In in = new Out().new In("测试信息");
		/*
		上面代码可以改为如下三行代码
		使用OuterClass.InnerClass 的形式定义内部类变量
		Out.In in;
		创建外部类实例,非静态内部类实例将寄存在该实例中
		Out out = new Out();
		通过外部类实例和new来调用内部类构造器创建非静态内部类实例
		in = out.new In("测试信息")
		*/
	}
}

class="language-class="tags" href="/tags/JAVA.html" title=java>java">Out.In in = new Out().new In("测试信息"); 这样的写法真的让人觉得很怪异,但它就是合理的

内部类可以被当成父类继承,这听起来很怪,但确实可行,下面的代码看起来也那么一点怪异

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class SubClass extends Out.In
{
	public SubClass(Out out) 
	{
		//通过传入的Out对象显式调用In的构造器
		out.super("hello");
	}
}

非静态内部类In类的构造器必须使用外部类对象来调用,上面的super代表In类的构造器,真的很怪异的写法,不是吗?要使用内部类,必须先创建它的外部类

Java还支持在方法体里定义类,即局部类,就是局部变量一样,并可以定义局部类的子类,即继承一个局部类的另一个局部类

class="language-class="tags" href="/tags/JAVA.html" title=java>java">
class="class="tags" href="/tags/JAVA.html" title=java>java">class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class LocalInnerClass 
{
	public static void main(String[] args) 
	{
		class InnerBase
		{
			int a;
		}
		class InnerSub extends InnerBase
		{
			int b;
		}
		InnerSub is = new InnerSub();
		is.a = 5;
		is.b = 8;
		System.out.println("InnerSub对象的a和b属性是:" + is.a + "," + is.b);
	}
}


输出 InnerSub对象的a和b属性是:5,8, 最后is对象也确实继承到父类的成员a

class="language-class="tags" href="/tags/JAVA.html" title=java>java">InnerSub对象的a和b属性是:


http://www.niftyadmin.cn/n/1411532.html

相关文章

webpack3.6最新用法总结

webpack的几大模块 如果说,一个webpack配置文件,我们到底需要配置的东西有什么?我觉得有这么几个重要的模块:entry(入口)、output(输出)、loaders、以及 plugins(插件&am…

初学Java,匿名内部类(二十)

匿名类的作用一般是只需要使用一次的类,不需要复用,临时性比较强,C#中同样有匿名类,不过是在C# 3.0才加入var myVar new {field_string “abcd”field_int 12; }; Java的格式很不一样,定义也很不一样new 父类构造器(实参列表) | 实现接口() {//匿名内部类的类体部分 } 匿名内…

underscore.js的用法

Array有map()和filter()方法,可是Object没有这些方法。此外,低版本的浏览器例如IE6~8也没有这些方法,解决问题的方式就是使用第三方库underscore.js。 underscore.js的百度cdn地址就是:http://apps.bdimg.com/l…

初学Java,闭包和回调(二十一)

闭包在Javascript中用的比较多,Java不显式支持闭包,但对于非静态内部类而言,它记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以把非静态内…

ABBYY PDF Transformer+安装教程

ABBYY PDF Transformer是一个新的全功能PDF文档工具,涵盖整个文档生命周期所涉及的各项功能,包括创建、讨论、批准、保护、转换成可编辑格式的PDF文件、文件合并、文本和图像的提取等。本文小编将给大家讲解ABBYY PDF Transformer安装教程,一…

初学Java,枚举类(二十二)

Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法public enum Gender {MALE,FEMALE;private String name;public void setName(String name){switch(this){case MALE:if(name.equals("男")){this.name name;}else{System.out.println("参数错误&…

转 VB ListView控件各种操作详解

Private Sub Form_Load()ListView1.ListItems.Clear 清空列表ListView1.ColumnHeaders.Clear 清空列表头ListView1.View lvwReport 设置列表显示方式ListView1.GridLines True 显示网络线ListView1.LabelEdit lvwManual …

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…