java-嵌套类
浏览以下内容前,请点击并阅读 声明
java允许在一个类中定义另外一个类,这就叫类嵌套。类嵌套分为两种,静态的称为静态嵌套类,非静态的又称为内部类。
使用嵌套类的原因:
- 能够将仅在一个地方使用的类合理地组合。如果一个类可能只对于另外一个类有用,此时将前者组合到后者,可以使得程序包更加简洁。
- 增强封装性。假如由两个类A和B,B类需要使用A类中的成员,而恰好该成员又是仅类内部可见(private)的,如果将B定义为A的嵌套类,则B可以使用A的任何成员,而且B也可以声明为外部不可见(private),将B隐藏起来。
- 能够使代码可读性和维护性更强。嵌套的类代码相较于顶级类,更靠近它被使用的地方,方便查看。
嵌套类也属于类的成员,因此也可使用类成员的可视范围控制修饰词(public,protect,private),内部类能够使用其所在类的其他类成员,而静态嵌套类则不能使用其所在类的其他类成员。
静态嵌套类
与静态方法与静态字段类似,静态嵌套类是与其所在类相关的。静态嵌套类不能直接使用实例变量或者实例字段,而只能通过一个对象引用,可将静态嵌套类视为跟其他顶级类一样,只不过是内嵌在其他类里面,方便打包。
静态嵌套类的使用方法与类中的其他类成员类似,一下演示如何创建静态嵌套类对象:
//StaticNestedClass为OuterClass的一个嵌套类
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
内部类(非静态嵌套类)
内部类是与其所在类的实例相关的 ,能够直接使用实例对象的方法和字段,内部类与实例相关,所以内部类不能定义静态的成员。
如果需要创建内部类对象,首先需要创建该内部类所在的类的对象,如下所示:
//1创建内部类所在类的对象
OuterClass outerObject=new OuterClass();
//2创建内部类对象
//注意与静态嵌套类的构造器使用方法的差异
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
嵌套类的遮蔽
当我们声明一个类型时,如果其名称与当前代码块(如一个方法内部)所在的代码块(如类内部)内的另一个类型的声明含有相同的名称,这种现象就叫遮蔽。需要用到被遮蔽的类型时,我们不能直接引用其名称,如下例所示:
public class ShadowTest {
public int x = 0;
//嵌套类
class FirstLevel {
//以下声明会遮蔽其所在类的名称为x的字段
public int x = 1;
//以下方法的声明会遮蔽其所在类的名称为x的字段
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//注意this关键词的使用方法
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
上述代码输出为:
x = 23
this.x = 1
ShadowTest.this.x = 0
序列化,教程中强烈建议不要序列化内部类,在此留下疑问。
除了非静态嵌套类意外,还有两种内部类,一种是局部类,还有一种是匿名类。
局部类
局部类可以在任何代码块(花括号内)中定义,一般应用于方法之中。
局部类可以使用其所在顶级类的类成员,此外,局部类也可以使用局部变量,然而,其所使用的局部类必须有final关键词修饰,即不可变变量。在java SE8中,局部类可以使用本质上不变的局部变量,即该局部变量即便没有final关键词修饰,但实际上从初始化以后,其值从未改变过。
从java8开始,局部类也可以使用其所在方法的参数。
与内部类相似,局部类不能定义静态成员,在静态方法中定义的局部类不能使用实例成员。
在代码块中不能定义接口,因为接口本质是静态的。局部类中也不能定义借口成员,不过局部类中可以定义常量变量(用final修饰,类型为基本数据类型或者字符串,编译时进行初始化)。
匿名类
匿名类能是代码更加简洁,它不需要名称,可以声明,实例化一步完成。
匿名类的声明是一个表达式,如同调用一个构造器,不同的是其后还跟上了一个定义类的代码块。
匿名类的定义的表达式包含如下几个部分:
- new关键词
- 一个该匿名类需要实现的借口或者是继承的父类的名称
- 一对圆括号,包含参数,实现一个接口时,参数部分留空
- 匿名类主体,跟类的主体类似, 可以定义方法
匿名类对于可使用的类型与局部类相同:
- 可使用其所在类的类成员
- 可使用其所在代码块的带final修饰词的局部变量,或者初始化后不再赋值的局部变量(java8)
- 对于遮蔽的类型,不能直接用名称引用
同样匿名类不能声明静态的成员或者接口,但是可以声明常量变量,在匿名类的类主体中,可以声明实例字段,实例方法,实例初始化代码块和局部类。
java-嵌套类的更多相关文章
- JAVA 嵌套类和内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...
- java嵌套类
java有四种嵌套类: 静态内部类,成员内部类,局部内部类,匿名内部类 1)静态内部类: (1)类的申明加上staitc关键字.一般用public修饰 (2)只能访问外部类的静态变量和静态方法.不能访 ...
- 分析java 嵌套类与内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...
- 深入理解java嵌套类和内部类
一.什么是嵌套类及内部类 能够在一个类的内部定义还有一个类.这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用非常少,最重要的是非静态嵌套类,也 ...
- (十二)java嵌套类和内部类
嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...
- Java 嵌套类基础详解
目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...
- JAVA嵌套类:静态嵌套类和非静态嵌套类
1.内部类定义 内部类在维基百科的定义为: 面向对象编程中,内部类(又叫做嵌套类)是在另一个类或者接口中进行声明的类.内部类不同于子类(subclass).(译者注:wiki的注解有误,内部类和嵌套 ...
- Java嵌套类,内部类和外部类
1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...
- java 嵌套类 简记
嵌套类包括:1)静态嵌套类 (static 修饰符) 2)非静态嵌套类(又叫内部类) 其中内部类又可分为三种: 其一.在一个类(外部类)中直接定义的内部类: 其二.在一个方法(外部类的方法)中定义的 ...
- Java 嵌套类和内部类演示样例<二>
嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...
随机推荐
- SQLServer视图
视图简介:通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图.SELECT 语句引用的数据表称为视图的基表.在SQL Server 2005系统中,可以把视图分为3种类型,即标准视图,索 ...
- iOS - HTTPS接口加密和身份认证
为什么要使用HTTPS代替HTTP HTTPS和HTTP的区别 https协议需要到CA申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https则是具有安全性的SS ...
- DB2 create partitioned table
在Z上和开放平台上的创建方法还不太一样,两套人马开发出来的就是牛! 蛋疼…… 贴不同类型的几个例子感受一下,Z上的ASC,DESC不见了: CREATE TABLE foo(a INT) PARTIT ...
- JS中级 - 03:文档宽高及窗口事件(选)
可视区尺寸 document.documentElement.clientWidth document.documentElement.clientHeight 滚动距离 document.body. ...
- 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...
- Sublime Text3使用记录
概述 Sublime是一款很好用的程序编辑网站,主要说的就是编写网页代码,同时Sublime支持接口开发,致使网络上有很多大牛写的编辑插件也很多,使用起来也自如方便了好多,最近一直在用Sublime ...
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...
- 【Java环境变量的配置问题】
首先是JVM.JRE.JDK三者之间的关系: java的跨平台性依赖于Java虚拟机:jvm(Java Virtual Machine),而jre(Java Runtime Environment,中 ...
- Multiple types were found that match the controller named 'Home'. (weird error)
found the error, because I changed the namespace and assembly name, then on the bin folder the old d ...
- android开子线程避免出现main错误
Runnable SonThread=new Runnable() { @Override public void run() { // TODO Auto-generated method stub ...