1 内部类-----是在其他类中的类

1.1 内部类的定义

  • 将类定义为 class xxxx{... ...}置于某个类的内部即可‘
  • 内部类编译时生成 xxxx$xxxx的class文件
  • 内部类不能够与外部类同名

1.2 内部类的使用

  • 在封装其类本省的类中使用该类,与普通类的使用方式相同
  • 在其他地方使用该类:a 类名前要冠以外部类的类名; b 在用new创建内部类对象时,外部类名.内部类名 内部类对象名=外部类对象名.new 内部类名(参数)

1.3 在内部类中使用外部类的成员

  • 内部类可以直接使用外部类的所有字段和方法;private也可以
  • 如果内部类与外部类有同名的字段方法,则:外部类名.this.字段或方法

代码示例:

public class TestInnerClass {
public static void main(String[] args){
ExternalClass extern = new ExternalClass();
ExternalClass.InnerClass inner = extern.new InnerClass();
inner.outPut("方法的字段");
}
} class ExternalClass{
private String s = "外部类字段"; class InnerClass{
private String s = "内部类字段";
public void outPut(String s){
System.out.println("s的值为 " + s);
System.out.println("this.s的值为 " + this.s);
System.out.println("ExternalClass.s的值为 " + ExternalClass.this.s);
}
} }

输出结果:

s的值为 方法的字段
this.s的值为 内部类字段
ExternalClass.s的值为 外部类字段

1.4 内部类的修饰符

内部类与外部类的字段和方法一样,作为外部类的成员而存在,其前面可以有访问控制符与其他修饰符

  • 访问控制符public,protected,默认、private
  • final、abstract、static等

1.5 static修饰的内部类也叫作嵌套类(nested class)

static修饰的内部类,表面该内部类实际上是一种外部类,他与外部类的实例无关;

static修饰的内部类在使用时:

  • 实例化static类时,在new前不需要增减外部类对象实例变量
  • static类中不能访问外部类中非static的字段及方法
  • static方法中不能访问非static的域及方法

2 局部类---在一个方法中定义的类

  • 同局部变量一样,方法中的内部类,不能够被访private、protected、public、static等修饰,但能够被final、abstract修饰
  • 可以访问其外部类的成员
  • 不能访问该方法中的非final的局部变量(注意:java8中使用lambda表达式来实现局部类时,可以访问方法的普通局部变量
class TestInnerInMethod
{
public static void main(String[] args)
{
Object obj = new Outer().makeTheInner(47);
System.out.println("Hello World!" + obj.toString() );
}
} class Outer
{
private int size = 5;
public Object makeTheInner( int localVar )
{
final int finalLocalVar = 99;
class Inner {
public String toString() {
return ( " InnerSize: " + size +
// " localVar: " + localVar + // Error!
" finalLocalVar: " + finalLocalVar
);
}
}
return new Inner();
}
}

3 匿名类----一种特殊的)是一种特殊的内部类 ,它没有类名,在定义类的同时就生成该对象的一个实例;“一次性使用”的类

  • 不取名字,直接用其父类或接口的名字,编译器生成 xxxxx$1之类的名字
  • 类的定义的同时就创建实例,即类的定义前面有一个new,即new 类名或接口名(){……}
  • 不定义构造方法,在构造对象时使用父类构造方法
class TestInnerAnonymous
{
public static void main(String[] args)
{
Object obj = new Outer().makeTheInner(47);
System.out.println("Hello World!" + obj.toString() );
}
} class Outer
{
private int size = 5;
public Object makeTheInner( int localVar )
{
final int finalLocalVar = 99;
return new Object() {
public String toString() {
return ( " InnerSize: " + size +
" finalLocalVar: " + finalLocalVar
);
}
};
}
}

java中几个特殊的类的更多相关文章

  1. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  2. Java中必须了解的常用类

    1.Java的包装类 基本数据类型我们都很熟悉,例如:int.float.double.boolean.char等,基本数据类型不具备对象的特征,不能调用方法,一般能实现的功能比较简单,为了让基本数据 ...

  3. Java中使用 Long 表示枚举类

    Java中使用 Long 表示枚举类 在日常的开发过程中,很多时候我们需要枚举类(enum)来表示对象的各种状态,并且每个状态往往会关联到指定的数字,如: private enum Color { R ...

  4. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  5. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  6. Java中各种集合(字符串类)的线程安全性!!!

    Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

  7. Java中的集合和常用类

    Java中的常用类: ▪ Object类 ▪ Math类 ▪ String类和StringBuffer类(字符串) ▪ 8种基本类型所对应的包装类 ▪ java.util包中的类——Date类 Obj ...

  8. JAVA基础——Java 中必须了解的常用类

    Java中必须了解的常用类 一.包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不 ...

  9. 讲说问题:|和||的区别以及&和&&的区别。2、Java中的数据类型分几类?基本数据类型有哪些?

    |和||的区别以及&和&&的区别. |或 为或运算 判断为逻辑或 || 为短路或 只有逻辑判断 当左侧为真不再继续判断 &与 为与运算 判断为逻辑与 && ...

  10. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

随机推荐

  1. orm框架与缓存的关系

    1.mybatis规定,一级缓存没必要bean类实现序列化,但二级缓存bean类必须实现序列化. 因为二级缓存是基于namespace的也就是基于接口的,二级缓存可以设置存储源,可以是redis或者m ...

  2. memcached部署memcached环境及PHP扩展

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lxsym.blog.51cto.com/1364623/876209 Memca ...

  3. HADOOP基本操作命令

    在这篇文章中,我们默认认为Hadoop环境已经由运维人员配置好直接可以使用. 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与关闭 启动HADOOP 进 ...

  4. 第一章 CLR的执行模型

    编译器将源代码编译为托管模块.托管木块包含: PE32或PE32+头 CLR头 元数据 IL(中间语言)代码 PE32头的文件可在32或64位的电脑上运行,PE32+的只能在64上运行.Window6 ...

  5. 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)

    之前一直以为retain就是简单的计数器+1,copy就是重新开辟内存复制对象: 其实不是这样,原来之前的自己独自徘徊于糊涂之中. (官方SDK,对NSString属性的定义都是用copy,而不是re ...

  6. C#中的多文档的使用

    1.首先,新建一个窗体,设置窗体的IsMdiContainer = true; 窗体的大小为700*600  长700  高600 2.在窗体的Load事件中添加如下代码 private void F ...

  7. Java开发之File类

    File类 File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当 ...

  8. 【待填坑】bzoj上WC的题解

    之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...

  9. vijos1194 Domino

    vijos上的题解: 1.因为每个格子不是被覆盖就是没被覆盖,状态只有0 1两种,m<=5,所以可以将每一列的状态压缩,看作一个二进制数.2.矩阵G表示从I状态到J状态的路径条数,自乘N次为长度 ...

  10. Entity Framework4.0 (七) EF4的存储过程

    前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...