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

- 日理万妓 2022-02-16 18:51 446阅读 0赞

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

  我们先看这样一段话:人是由大脑、肢体、器官等身体结果组成。而组成我们人体的心脏它也有自己的属性和行为(血液、跳动),显然,此处不能单方面用属性或者方法表示一个心脏了,而需要一个类,但是这个类要依赖于人这个类存在(因为心脏不能脱离人体而存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所心脏以需要写在人类的内部。内部类就相当于其中的某个器官之一。

  首先看看什么是内部类:在类的内部定义另一个类。没错,定义就这么简单。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。内部类的定义格式如下:

  1. public class 外部类的名称{
  2. //外部类的成员
  3. public class 内部类的名称{
  4. //内部类的成员
  5. }
  6. }

使用内部类有什么好处;

1)实现多重继承;

2)内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

3)减少了类文件编译后的产生的字节码文件的大小

使用内部类的缺点:使程序结构不清楚。

内部类在编译完成后也会产生.class文件,但文件名称是:外部类名称$内部类名称.class

内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类。下面分别详细学习一下这四种内部类的具体使用。

一、成员内部类

1、成员内部类也叫实例内部类。应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)

2、成员内部类的特征:

作为外部类的一个成员存在,与外部类的属性、方法并列

成员内部类持有外部类的引用

成员内部类中不能定义static变量和方法

3、使用格式:

  1. Outer outer = new Outer();
  2. Outer.Inner inner = outer.new Inner();

代码演示一:

  1. /* * 成员内部类 */
  2. public class Body {
  3. String arm;
  4. String leg;
  5. String blood;
  6. public Body(String arm, String leg, String blood) {
  7. super();
  8. this.arm = arm;
  9. this.leg = leg;
  10. this.blood = blood;
  11. }
  12. //内部类Heart
  13. class Heart{
  14. String name;
  15. void work() {
  16. System.out.println("心脏正在给"+arm+leg+"输"+blood);
  17. }
  18. };
  19. }
  20. public class Test {
  21. public static void main(String[] args) {
  22. Body body=new Body("两个胳膊","两条腿","血");
  23. Body.Heart heart=body.new Heart();
  24. heart.work();
  25. }
  26. }

运行截图:

942621-20160427202347267-1221863720.png

代码演示二:

  1. /* * 成员内部类 */
  2. public class Outer {
  3. private String name="Hello World";
  4. public class Inner{
  5. public void print(){
  6. System.out.println(name);
  7. }
  8. };
  9. public void print(){ //定义外部类方法
  10. new Inner().print();//通过内部类的实例化对象调用方法
  11. }
  12. public static void main(String[] args) {
  13. Outer outer=new Outer();
  14. outer.print();//调用外部类的方法
  15. }
  16. }

运行截图:942621-20160427202506080-1611230690.png

  1. 解释一下,上述代码中,new Inner().print();代码相当于
  2. Inner inner=new Inner();
  3. Inner.print();

二、静态内部类

1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类 . 内部类来访问。

2、静态内部类使用场合:内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。

3、静态内部类的特征:

静态内部类不会持有外部类的引用

静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问

4、Java中只有内部类才可以是静态的

使用格式:Outer.Inner inner = new Outer.Inner();

代码演示一:

  1. /* * 静态内部 */
  2. public class Company {
  3. String companyNam;
  4. static String country;
  5. static class Clear{
  6. String name;
  7. public Clear() {
  8. // TODO Auto-generated constructor stub
  9. }
  10. public Clear(String name) {
  11. super();
  12. this.name = name;
  13. }
  14. public void work(String name){
  15. String na=new Company().companyNam="联想";
  16. country="中国";
  17. System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country);
  18. }
  19. }
  20. }
  21. public class Test {
  22. public static void main(String[] args) {
  23. Company.Clear zcl=new Company.Clear();
  24. zcl.work("shen_hua");
  25. }
  26. }

运行截图:942621-20160427203441423-21297669.png

代码演示二:

  1. /* * 静态内部类 */
  2. public class Outer {
  3. private static String info="Hello World";
  4. private int i=8;
  5. static class Inner{
  6. int num=new Outer().i;//获取外部类的非静态成员变量,景天成员变量可以直接使用
  7. public void show() {
  8. System.out.println(info+"---"+num);
  9. }
  10. };
  11. }
  12. public class Test {
  13. public static void main(String[] args) {
  14. Outer.Inner inner=new Outer.Inner();
  15. inner.show();
  16. }
  17. }

运行截图:942621-20160427203416080-81422984.png

三、局部内部类:

1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。

2、使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类

3、特征:

用在方法内部,作用范围仅限于该方法中

根据情况决定持有外部类对象引用

不能使用private,protected,public修饰符

不能包含静态成员

代码演示一:

  1. /* * 局部内部类 */
  2. public class School {
  3. String schoolName;
  4. String buss="培养人才";
  5. int studentNum;
  6. public School() {
  7. // TODO Auto-generated constructor stub
  8. }
  9. public School(String schoolName, String buss, int studentNum) {
  10. super();
  11. this.schoolName = schoolName;
  12. this.buss = buss;
  13. this.studentNum = studentNum;
  14. }
  15. //宣传
  16. public void show(){
  17. final double tvMoney=10000;
  18. final double netMoney=20000;
  19. class AdverTeam{
  20. String teamName="shen_hua";
  21. //电视宣传
  22. public void tvShow(){
  23. System.out.println("宣传队是:"+teamName);
  24. System.out.println("这是电视宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+tvMoney);
  25. }
  26. //网络宣传
  27. public void netShow(){
  28. System.out.println("宣传队是:"+teamName);
  29. System.out.println("这是网络宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+netMoney);
  30. }
  31. }
  32. new AdverTeam().tvShow();
  33. new AdverTeam().netShow();
  34. }
  35. }
  36. public class Test {
  37. public static void main(String[] args) {
  38. School qinghua=new School("清华","互联网培训",1000);
  39. qinghua.show();
  40. }
  41. }

运行截图:942621-20160427203257080-800698500.png

四、匿名内部类

1、如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

2、使用场合:简化内部类的使用

3、特征:

使用new创建 ,没有具体位置

创建的匿名类,默认继承或实现new后面的类型

根据使用情况决定是否持有外部类对象引用

内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类

代码演示:

  1. /* * 匿名内部类 */
  2. public interface Person {
  3. public void run();
  4. }
  5. /* * 测试类 */
  6. public class Test {
  7. public static void main(String[] args) {
  8. Person p=new Person() {
  9. public void run() {
  10. System.out.println("匿名内部类实现的");
  11. }
  12. };
  13. p.run();
  14. }
  15. }

运行截图:942621-20160427203141627-998477783.png

发表评论

表情:
评论列表 (有 0 条评论,446人围观)

还没有评论,来说两句吧...

相关阅读