在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。内部类可以间接解决多继承问题,可以使用内部类继承一个类,外部类继承一个类,实现多继承。
内部类主要分为成员内部类,方法内部类,静态内部类,匿名内部类。
1.成员内部类
成员内部类顾名思义就是外部类的一个成员属性,只不过该属性不是String,int等类型,而是class类型。类的成员内部类可以访问该类的属性和方法,因为他也是该类的一个成员。
成员内部类使用:
package com.dream; public class MyTest { public static void main(String[] args) { Mother mother=new Mother(12, "小明"); //实例内部类的方法之一 Mother.baby temp=mother.new baby(); temp.say(); //实例化方法二,通过调用类的成员函数访问内部类 mother.say(); } } class Mother{ private int age; public String name; public Mother(int age, String name) { this.age = age; this.name = name; } //定义内部类(成员内部类) class baby{ public void say() { System.out.println("我已经"+age+"岁啦,名字叫"+name); } } //在类中实例化 public void say() { baby temp=new baby(); temp.say(); } }
成员内部类是类的一个成员,类的成员依赖类对象,所以内部类也依赖于对象,类需要实例化才能使用,所以使用外部类对象来实例化内部类。
2.方法内部类
顾名思义方法内部类即把类定义在方法里面,需要注意的是:
1.方法内部类只能在定义该内部类的方法里实例化,不可在此方法之外地方对其实例化
2.方法内部类对象不能使用该内部类所在方法的非final属性
public class MyTest { public void say(final String name) { //方法内部类 class baby { public void say() { //需要final属性 System.out.println("名字叫"+name); } } //在该方法内部实例化 baby temp=new baby(); temp.say(); } public static void main(String[] args) { MyTest test=new MyTest(); test.say("王小帅"); } }
方法内部类的作用域局限于该方法内,所以要在方法内实例化。方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期,所以需要拷贝到内部类中,而拷贝会带来不一致性,从而需要使用final声明保证一致性。
3.静态内部类
即在一个类里定义一个静态内部类,静态就是该内部类可以像其他静态成员一样,没有实例的外部类对象也可以访问调用,静态属性不属于类的实例对象。
public class MyTest { public int age=1; public static String name="小黑"; //定义静态内部类 static class baby{ public void say() { //不能访问age属性,只能访问静态属性 System.out.println("name: "+name); } } public static void main(String[] args) { //实例化静态内部类 MyTest.baby temp=new MyTest.baby(); temp.say(); } }
需要注意的是静态内部类只能访问外部类中的静态成员属性和方法,因为静态属性可以不使用外部实例对象进行访问,若属性不是静态属性,则需要依赖于外部类的实例对象。所以静态内部类只能访问外部类的静态属性
4.匿名内部类
匿名内部类有点像匿名对象,没有名字,只能使用一次,匿名内部类又分三种情况
1.继承式匿名内部类:可以不定义class去继承该抽象类而实现抽象类的实例和运行
public class MyTest { public static void main(String[] args) { //相当继承Mother类并实现抽象方法 Mother mother=new Mother(25, "桂纶镁"){ public void say() { System.out.println("age: "+age+" name: "+name); } }; mother.say(); } } abstract class Mother{ public int age; public String name; public Mother(int age, String name) { this.age = age; this.name = name; } public abstract void say(); }
2.接口式匿名内部类:可以不定义class去实现该接口而实现接口的调用
public class MyTest { public static void main(String[] args) { //相当于实现接口 baby temp=new baby() { @Override public void say() { System.out.println("name: "+name); } }; temp.say(); } } interface baby{ String name="小黑";//接口定义的属性都是常量,修饰为 public final static String name public void say(); }
3.参数式匿名内部类:只能访问final属性
public class MyTest { public void say(baby temp) { temp.say(); } public static void main(String[] args) { MyTest test=new MyTest(); final int age=10; //参数匿名内部类 test.say(new baby() { @Override public void say() { //要访问final定义的属性 System.out.println("age: "+age); } }); } } interface baby{ String name="小黑";//接口定义的属性都是常量,修饰为 public final static String name public void say(); }
说明为什么要使用final属性
主要是局部变量的生命周期与局部内部类的对象的生命周期的不一致。
内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时, 外部方法的局部变量很可能已经不存在了,那么就得延续其生命,拷贝到内部类中,而拷贝会带来不一致性,从而需要使用final声明保证一致性。 复制保证生命周期延续,final保证引用一致。
相关推荐
Java内部类是Java言语的一个很重要的概念,《Java编程思想》花了很大的篇幅来讲述这个概念。但是我们在实践中很少用到它,虽然我们在很多时候会被动的使用到它,但它仍然像一个幕后英雄一样,不为我们所知,不为我们...
java内部类详解
Java内部类总结 学习java的资源
从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。...本文档讲述Java内部类的规则及应用
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
这里是自己对java内部类整理的一篇文章,有可执行的源代码
java内部类使用例子,可以运行
谈Java内部类的四个应用场景
java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用
Java 的使用 分别介绍了 成员内部类、方法内部类、静态内部类
Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
详细介绍JAVA内部类的用法,用途,基本语法,及匿名类用法
Java内部类的作用
JAVA内部类的一些总结
对内部类不错的讲解,以及如何应用并且还帮你归了类,不错的选择
Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;
java基础java内部类