文档章节

内部类

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:41
字数 1030
阅读 1
收藏 0

外部类:包含内部类的类。

内部类: 把一个类放在另一个类的内部。

 

形式:     public  class    外部类{
【修饰符】【访问控制符】class 【类名】{

    }

}

作用:    1。内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。


           2。内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。

                        

public class Out{
	private int a= 12;
	public class Int{
		public void say(){
		System.out.println(a);//直接访问外部类私有属性
		}
	}
	
	public void test(){
		Int i = new Int();//外部类不能直接访问非静态内部类的实例属性,必须显式创建内部类对象
		i.say();
	}
	public static void main(String[] args){
		Out o = new Out();//只是创建了外部类,还未创建内部类对象
		o.test();
	}
}


PS:非静态内部类对象中保留外部类对象的引用。 


非静态内部类不能有静态方法,静态属性,静态初始化块。

非静态内部类的对象必须寄存在外部类的对象里,因此创建非静态内部类之前,必须先创建其外部类的对象。


静态内部类可以包含静态成员,也可以包含非静态成员。静态内部类不能访问外部类的实例变量,只能访问外部类的类成员。即使静态内部类的实例方法也不能访问外部类的实例成员。

 静态内部类是外部类的类相关,而不是外部类的对象相关的,也就是说,静态内部类的对象不是寄存在外部类对象里的,而是寄存在外部类的类本身中。当一个静态内部类的对象存在时,并不存在一个被它寄存的外部类对象,静态内部类的对象里只有外部类的类引用,没有外部类对象的引用。


                3。 匿名内部类适合用于创建那些仅需要一次使用的类。



外部类以外定义内部类:  Outclass.Inclass  var;

外部类以外创建内部类实例:Outclass.new  Inclass();

class Out
{
	//定义一个非静态内部类,不使用访问控制符,即同一个包中其他类可访问该内部类
	class In
	{
		public In(String msg)
		{
			System.out.println(msg);
		}
	}
}
public class CreateInnerInstance
{
	public static void main(String[] args) 
	{
		Out.In in = new Out().new In("测试信息");
		/*
		上面代码可改为如下三行代码:
		使用OutterClass.InnerClass的形式定义内部类变量
		Out.In in;
		创建外部类实例,非静态内部类实例将寄存在该实例中
		Out out = new Out();
		通过外部类实例和new来调用内部类构造器创建非静态内部类实例
		in = out.new In("测试信息");
		*/
	}
}



非静态内部类的构造器必须使用外部类对象来调用



非静态内部类的子类:

如果需要创建一个SubClass对象,必须创建一个Out对象。

public class SubClass extends Out.In
{
	//显示定义SubClass的构造器
	public SubClass(Out out)
	{
		//通过传入的Out对象显式调用In的构造器
		out.super("hello");
	}
}





匿名内部类: 创建匿名内部类时会立即创建一个该类的实例。        1 不能是抽象类       2  不能定义构造器       3 可以定义实例初始化块


new 父类构造器(实参列表) |实现接口()

{

//匿名内部类的类体部分

}


匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类或实现一个接口。


最常用的创建匿名内部类的方式是     :需要创建某个接口类型的对象。

interface Product  //接口
{
	public double getPrice();
	public String getName();
}


public class TestAnonymous
{
	public void test(Product p)
	{
		System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
	}
	public static void main(String[] args) 
	{
		TestAnonymous ta = new TestAnonymous();
		//调用test方法时,需要传入一个Product参数,此处传入其匿名实现类的实例
		ta.test(
		
		new Product()
		{
			public double getPrice()
			{
				return 567.8;
			}
			public String getName()
			{
				return "AGP显卡";
			}
		});
	}
}


本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/8228715

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
JAVA内部类是怎么玩儿的

内部类一共分为:成员内部类,局部内部类,静态嵌套类,匿名内部类。 1. 成员内部类 最普通的内部类 成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private...

牧师-Panda
2016/09/08
21
0
黑马程序员---面向对象之内部类

-------------------------android培训、java培训、期待与您交流! ------------------------- Java中的内部类有四种:一般内部类、静态内部类、局部内部类、匿名内部类。 一、一般内部类 定...

长平狐
2013/07/01
94
0
Java的内部类

类是java中定义的一个独立的程序单元,在某种情况下也可以把一个类放在另外一个类的内部定义,这定义在内部的类就叫内部类或嵌套类。 1.内部类提供了更好的封装,把一个内部类隐藏在外部类之...

西红柿的眼泪
2016/07/09
53
0
Java中的内部类总结

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为...

zhangyujsj
2016/01/04
8
0
经典Java面试题-内部类

[面试原题] 以下代码运行结果是什么? public class BwfOuterClass { private int x = 1; private int y = 2; private class BwfInnerClass{ private int x = 3; public void print(){ Syst......

博为峰教研组
2016/10/27
103
0

没有更多内容

加载失败,请刷新页面

加载更多

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
45分钟前
4
0
通过OAuth2.0 获取授权访问SF 用户数据

通过OAuth2.0 获取授权访问SF 用户数据 OAuth2.0 相关知识 深入了解 Salesforce 中的 OAuth 2.0(SF官方) OAuth 2.0 的一个简单解释(阮一峰大神) OAuth 2.0 的四种方式(阮一峰大神) GitHub OA...

在山的那边
51分钟前
7
0
编写程序:从键盘上接受一个三位数(首先要确保是三位数),计算出各位之和输出。

#include<stdio.h> int main() { int a,sum=0; printf("请输入一个三位数:\n"); scanf("%d",&a); sum=a/100+a%100/10+a%10; printf("这三个数的和:%d",sum); return 0; }......

201905021729吴建森
今天
7
0
如何离开/退出/停用Python virtualenv

我正在使用virtualenv和virtualenvwrapper。 我可以使用workon命令在virtualenv之间切换。 me@mymachine:~$ workon env1(env1)me@mymachine:~$ workon env2(env2)me@mymachine:~$ workon e......

技术盛宴
今天
7
0
成长之路 万事坚持难

任何事情开了头,想要更好的发展下去,不忘初心,就一定要坚持下去。 以前自己坚持了一些事情,比如早睡不吃东西,由于中途断了,没有及时止损,导致又接着恶习断了几天。所以 及时的反省和调...

T型人才追梦者
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部