Java面向对象之内部类案例讲解

作者:Z && Y 时间:2021-09-16 13:28:19 

1. 内部类

很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了

1.1 内部类概述

  • 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

  • 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我可以把外边的类称为外部类,在其内部编写的类称为内部类。

  • 内部类分为四种:

    • 成员内部类

    • 静态内部类

    • 局部内部类

    • 匿名内部类


1.2 成员内部类(实例内部类、非静态内部类)

注:成员内部类中不能写静态属性和方法


1.2.1 【定义一个内部类】


//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
   private int id;

class Inner {
       public void in() {
           System.out.println("这是内部类方法");
       }
   }

public void out() {
       System.out.println("这是外部类方法");
   }
}

1.2.2【实例化内部类】

实例化内部类,首先需要实例化外部类,通过外部类去调用内部类


// 代码接上
class Test {
   public static void main(String[] args) {
       //实例化成员内部类分两步
       //1、实例化外部类
       Outer outObject = new Outer();
       //2、通过外部类调用内部类
       Outer.Inner inObject = outObject.new Inner();
       //测试,调用内部类中的方法
       inObject.in();//打印:这是内部类方法
   }
}

Java面向对象之内部类案例讲解

分析:
想想如果你要使用一个类中方法或者属性,你就必须要先有该类的一个对象,同理,一个类在另一个类的内部,那么想要使用这个内部类,就必须先要有外部类的一个实例对象,然后在通过该对象去使用内部类。


1.2.3 【成员内部类能干什么?】

访问外部类的所有属性(这里的属性包括私有的成员变量,方法)

//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
   private String id = "11923020124";

class Inner {
       public void in() {
           System.out.println("这是内部类方法");
       }

//内部类访问外部类私有的成员变量
       public void getId() {
           System.out.println("id: " + id);
       }

public void useOut() {
           out();
       }
   }

public void out() {
       System.out.println("这是外部类方法");
   }
}

class Test {

public static void main(String[] args) {
       //实例化成员内部类分两步
       //1、实例化外部类
       Outer outObject = new Outer();
       //2、通过外部类调用内部类
       Outer.Inner inObject = outObject.new Inner();
       //测试,调用内部类中的方法
       inObject.in();//打印:这是内部类方法
       inObject.getId();
       inObject.useOut();
   }
}

Java面向对象之内部类案例讲解

如果内部类中的变量名和外部类的成员变量名一样,要通过创建外部类对象 "."属性来访问外部类属性,通过this.属性访问内部类成员属性


//在A类中申明了一个B类,此B类就在A的内部,并且在成员变量的位置上,所以就称为成员内部类
public class Outer {
   private String id = "Outer Id";

class Inner {
       private String id = "Inner Id"; //这个id跟外部类的属性id名称一样。

public void getInnerId() {
           System.out.println(id);//输出Inner Id,内部类中的变量会暂时将外部类的成员变量给隐藏
       }

public void getOuterId() {
           System.out.println(Outer.this.id);//输出Outer Id,内部类中的变量会暂时将外部类的成员变量给隐藏
       }
   }

public void out() {
       System.out.println("这是外部类方法");
   }
}

class Test {
   public static void main(String[] args) {
       //实例化成员内部类分两步
       //1、实例化外部类
       Outer outObject = new Outer();
       //2、通过外部类调用内部类
       Outer.Inner inObject = outObject.new Inner();
       //测试,调用内部类中的方法
       inObject.getInnerId();
       inObject.getOuterId();
   }
}

Java面向对象之内部类案例讲解

说明:

如何调用外部类的成员变量呢?通过Outer.this,因为如果想实例化内部类对象,就必须通过外部类对象,当外部类对象new出内部类对象时,会把自己(外部类对象)的引用传到了内部类中,所以内部类就可以通过Outer.this来访问外部类的属性和方法,到这里,你也就可以知道为什么内部类可以访问外部类 的属性和方法,这里由于有两个相同的属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名 不重复,那么我们在内部类中调用外部类的属性和方法时,前面就隐式的调用了Outer.this。


1.2.4 借助成员内部类,来总结内部类(包括4种内部类)的通用用法:

  • 要想访问内部类中的内容,必须通过外部类对象来实例化内部类。

  • 能够访问外部类所有的属性和方法,原理就是在通过外部类对象实例化内部类对象时,外部类对象把自己的引用传进了内部类,使内部类可以用通过Outer.this去调用外部类的属性和方法,一般都是隐式调用了,但是当内部类中有属性或者方法名和外部类中的属性或方法名相同的时候,就需要通过显式调用Outer.this了。

来源:https://blog.csdn.net/I_r_o_n_M_a_n/article/details/119335854

标签:Java,内部类
0
投稿

猜你喜欢

  • Spring整合Dubbo框架过程及原理解析

    2022-01-31 01:49:16
  • Android带进度的圆形进度条

    2023-08-05 21:47:18
  • 使用Android Studio检测内存泄露(LeakCanary)

    2022-08-31 11:08:12
  • Spring Native项目实战(体验79毫秒启动springboot应用)

    2022-03-14 22:18:42
  • c#多线程中Lock()关键字的用法小结

    2022-07-08 04:33:27
  • 深入理解Java设计模式之命令模式

    2023-11-24 11:06:31
  • Android编程显示网络上的图片实例详解

    2021-11-29 05:21:10
  • Spring占位符Placeholder的实现原理解析

    2023-03-14 18:14:00
  • IDEA搭建dubbo项目的过程及存在的问题

    2023-10-15 17:56:53
  • C#表达式中的动态查询详解【译】

    2021-07-29 05:19:42
  • Java中自动装箱、拆箱引起的耗时详解

    2023-01-11 11:42:42
  • 完整的iOS新浪微博分享功能开发

    2023-06-24 14:14:08
  • SSM Mapper文件查询出返回数据查不到个别字段的问题

    2023-10-17 01:02:08
  • Java——对象初始化顺序使用详解

    2023-11-01 01:08:46
  • Quartz.Net使用方法详解

    2023-08-17 11:50:54
  • Spring Boot 静态资源处理方式

    2022-09-14 11:14:39
  • java基础之注解示例详解

    2022-05-08 23:47:20
  • Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    2023-02-19 23:22:37
  • Java实现分解任意输入数的质因数算法示例

    2022-07-29 23:07:08
  • Java实现简单猜数字小游戏

    2023-11-28 08:10:07
  • asp之家 软件编程 m.aspxhome.com