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
投稿

猜你喜欢

  • 教你轻松制作java音乐播放器

    2023-09-27 11:17:11
  • C#基础之Lambda表达式用法实例教程

    2021-12-06 14:07:56
  • Java 集合框架之List 的使用(附小游戏练习)

    2023-11-24 10:33:40
  • Java Socket 编程详解

    2022-06-13 12:06:57
  • android端使用openCV实现车牌检测

    2023-02-26 07:50:50
  • C#实现的XML操作类实例

    2022-04-04 12:17:37
  • C语言与C++中关于字符串使用的比较

    2022-01-22 01:30:37
  • 详解Spring Cloud Zuul中路由配置细节

    2022-07-31 06:55:45
  • Android设置PreferenceCategory背景颜色的方法

    2021-09-24 10:13:29
  • Gradle修改本地仓库的位置方法实现

    2022-01-17 21:25:52
  • 逆转交替合并两个链表的解析与实现

    2021-12-31 12:37:41
  • 详解Swagger接口文档和常用注解的使用

    2023-11-24 15:35:21
  • Java双向链表的操作

    2021-07-31 02:54:33
  • Json读写本地文件实现代码

    2023-10-10 06:03:21
  • Android卫星菜单效果的实现方法

    2023-10-18 12:41:34
  • Android Bitmap详解及Bitmap的内存优化

    2022-06-27 13:44:55
  • Android中隐藏标题栏和状态栏的方法

    2022-04-16 07:04:27
  • Android实现记住账号密码功能

    2021-10-02 01:51:24
  • Android studio so库找不到问题解决办法

    2023-10-28 02:20:49
  • Android Framework如何实现Binder

    2021-12-09 03:54:20
  • asp之家 软件编程 m.aspxhome.com