1、总体定义

定义在一个类中的类,就称之为内部类。

2、为什么要使用内部类

(1)使用匿名内部类,无需对只使用一次的接口实现类进行创建,方便了对于接口和抽象类的实现及其使用。

(2)每个内部类都可以独立的继承一个(接口)的实现,所以无论外部类是否已经继承了某个接口的实现对于内部类都没有影响。简单来说,内部类实现了java中的多重继承。

3、内部类的分类和使用

3.1、成员内部类

成员内部类即所定义内部类作为外部类的一个成员变量。成员内部类的特点如下:

(1)内部类随意访问外部类,外部类必须通过实例化来访问内部类;

(2)成员内部类中不能存在任何static的变量和方法;

(3)成员内部类的创建必须依附于外部类;

成员内部类的创建方式:

外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称()

成员内部类的使用:

(1) 间接方式:在外部类的方法中使用内部类,通过调用外部类的方法来使用内部类;
(2) 直接方式:先创建再使用;

代码示例

public class Insertclass {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} //成员内部类的间接使用方法
public void methodBody(){
System.out.println("外部类");
//外部类中使用内部类
Heart h=new Heart();
h.beat();
} //成员内部类
public class Heart{
public void beat(){
System.out.println("心脏跳动");
System.out.println("我叫"+name);
}
}
}

3.2、局部内部类

局部内部类即所定义内部类定义在外部类的方法中。局部内部类的特点如下:

局部内部类只能在定义了该内部类中的方法中被使用。

成员内部类的创建方式:

外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

代码示例

public class Insertclass {
private String name;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public void methodOuter(){
//局部内部类
class Inner{
int num=10;//必须为有效final
public void show(){
System.out.println(num);
}
}
}
}

3.3、静态内部类

使用static关键字进行修饰的内部类称之为静态内部类,或者嵌套内部类。静态内部类的特点如下:

(1)静态内部类的创建不需要依附于外部类
(2)静态内部类由static修饰,故而只能调用外部类中由static修饰的变量和方法

静态内部类的创建方式:

    外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

代码示例

public class OutClassTest {
static int a;
int b;
public static void main(String[] args) {
// new一个外部类
OutClassTest oc = new OutClassTest();
// 不依赖于外部类实例,直接实例化内部静态类
OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
// 调用静态内部类的非静态方法
System.out.println(inner.getValue());
} //静态内部类
private static class InnerStaticClass {
// 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
private static String static_value = "0";
private int flag = 0;
//静态内部类方法
public InnerStaticClass() {
System.out.println("InnerClass create a:" + a);
// 静态内部类不能够访问外部类的非静态成员
// System.out.println("InnerClass create b:" + b);
System.out.println("InnerStaticClass flag is " + flag);
System.out.println("InnerStaticClass tt is " + static_value);
} public int getValue() {
// 静态内部类中的非静态方法
test();
return 1;
}
}
}

其实到此处,内部类的分类就已经结束,但对于局部内部类中的匿名内部类由于使用较多,需要着重介绍一下。

3.4、匿名内部类

匿名内部类是一种特殊的局部内部类,它可以在不创建新类的条件下对于现有接口(或者抽象类)进行实现。匿名内部类的特点如下:

(1) 匿名内部类没有访问修饰符。

(2) 匿名内部类对于类的实例化,没有任何变量名称,这就导致匿名内部类所定义的类在保证简便的同时有着不可复用的缺点。

(3)匿名内部类中不能存在任何静态变量和静态方法。

(4)匿名内部类中不能定义构造函数。

匿名内部类的创建方式:

new 现有接口名称{ 接口中需要实现的内容 }

代码示例

interface MyInterface{
public void show();
}
public class AnymiousClass {
public static void main(String[] args){
//使用局部内部类之匿名内部类
MyInterface obj=new MyInterface() {
@Override
public void show(){
System.out.println("匿名内部类实现了方法");
}
}; //匿名内部类实现的接口实体类
new MyInterface() {
@Override
public void show(){
System.out.println("匿名内部类实现了方法");
}
}.show();
}
}

4、内部类的注意事项

(1)内用外,随意调用;外用内,需要内部类对象;

(2)局部内部类引用局部变量,这个局部变量必须是有效final的,也即是必须要被final关键字修饰的。

原因:new出来的对象在堆内存中,而局部变量跟随方法在栈内存中。方法运行结束立即出栈,局部变量消失。 new的对象会保持在堆中,直到垃圾回收时才消失。

此时要保证栈中的对象的功能正常,就必须保证对象所引用的局部变量的生存周期和对象的相同,故而使用局部变量必须是有效final的。

java提升一:内部类的更多相关文章

  1. [java] 深入理解内部类: inner-classes

    [java] 深入理解内部类: inner-classes // */ // ]]>   [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...

  2. Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...

  3. java基础之 内部类

    Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...

  4. atitit groovy 总结java 提升效率

    atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3.  添加 Groovy 类 2 4.  编译运行groovy类 ...

  5. java 笔记(2) —— 内部类的作用

    一.内部类简介 个人觉得内部类没多少研究价值,GUI中的事件响应算是非常典型的应用了. Java内部类其实在J2EE编程中使用较少,不过在窗口应用编程中特别常见,主要用来事件的处理.其实,做非GUI编 ...

  6. Java基础(53):内部类(转)

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

  7. JAVA 第二天 内部类

    package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件 ...

  8. Java提升篇之反射的原理(二)

    Java提升篇之通过反射越过泛型检查 /* *问题:在一个ArrayList<Integer>对象中,在这个集合中添加一个字符串. */ 在我们还没有学反射前,遇到这个问题都是无法实现的, ...

  9. Java提升篇之反射的原理

    Java提升篇之反射的原理 1.构造方法的反射 import java.lang.reflect.Constructor; public class ReflectConstructor { publ ...

  10. Java 中的内部类

    前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...

随机推荐

  1. oracle的concat、convert、listagg函数(字符串拼接和类型转换)

    ORACLE几种常用的方法(2) 1.concat常见的用法 : 格式:concat(String1,String2) 说明:concat函数用于将两个字符串连接起来,形成一个单一的字符串 实例: s ...

  2. build hadoop, spark, hbase cluster

    1,something: 1,arc land 506  git branch 507  git status 508  git reset multicloud/qcloud/cluster_man ...

  3. Hibernate框架报错:org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.mikey.hibernate.domain.Person.pid

    报错信息 org nate.PropertyAccessException:IllegalArgumentException在调用com.mikey.Hibernate.domain.Person.p ...

  4. python学习记录(持续更新)--最最最基础的一部分(方法,异常处理,注释,类)

    写在前面 本系列教程针对有一定编程经验的伙伴快速入门python基础,一些涉及开发的常识问题,本文并不涉及. 方法 function def greet_user(name): print(f'Hi ...

  5. 杭电2014 (第一次用vector ac题目)

    早就想用容器类来实现一些编程,今天也算是学了一点吧. vector的使用方法参考了某位博主的一篇文章,感觉写得还是不错的:http://blog.csdn.net/always2015/article ...

  6. 前端代码编译器Hbuilder下载地址和谷歌浏览器下载地址

    编译器:HbuilderX 浏览器:谷歌浏览器

  7. CentOS7编译安装httpd-2.4.41

    安装参考环境: CentOS Linux release 7.5.1804 (Core) 一.安装依赖包 httpd安装的依赖包 # yum -y install pcre-devel # yum - ...

  8. 计划任务之一次性计划任务(at)和周期性计划任务(crontab)(重点)

    一:知识要点 ----计划任务的意义----计划任务分类----用户计划任务crontab----系统计划任务----计划任务使用注意事项----anacron服务介绍 二:计划任务的意义计划任务 - ...

  9. 问题解决 : MyBatis一对一查询时,打印结果只有一条数据

    问题截图:修改后,结果返回条数正确 问题解决: 因为有重名的列,建议起个别名

  10. JavaScript动画实例:李萨如曲线

    在“JavaScript图形实例:阿基米德螺线”和“JavaScript图形实例:曲线方程”中,我们学习了利用曲线的方程绘制曲线的方法.如果想看看曲线是怎样绘制出来的,怎么办呢?编写简单的动画,就可以 ...