Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java-内部类

java-内部类

作者头像
卢衍飞
发布于 2023-02-16 06:57:52
发布于 2023-02-16 06:57:52
35500
代码可运行
举报
文章被收录于专栏:技术分享交流技术分享交流
运行总次数:0
代码可运行

内部类 内部类既可以访问自身的数据域,也可以访问创建它的外部类对象的数据域 内部类对象总有一个隐式引用,它指向了创建它的外部类的对象 外部类的引用在内部类的构造方法中设置,不必手动设置,编译器会自动在构造方法中生成外部类引用 只有内部类可以是私有的,建议设置为私有的,这样只有外部类的方法才可以构造该对象。 在外部类的作用域中,可以通过OuterClass.InnerClass引用内部类 只有静态内部类可以有静态方法 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date;

public class InnerClassTest { public static void main(String[] args) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TalkingClock clock = new TalkingClock(1000, true);

// 使用外部类对象创建一个内部类对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TalkingClock.TimePrinter newClock = clock.new TimePrinter();
  newClock.print_inner();
  clock.start();


  // keep program running until user selects "Ok"
  JOptionPane.showMessageDialog(null, "Quit program?");
  System.exit(0);

} }

class TalkingClock { private int interval; private boolean beep;

public TalkingClock(int interval, boolean beep) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  this.interval = interval;
  this.beep = beep;

}

/**

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* Starts the clock.
*/

public void start() {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  ActionListener listener = new TimePrinter();
  Timer t = new Timer(interval, listener);
  t.start();

}

private void print() {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  System.out.println("hello");

}

// public void setBeep(boolean beep) { // this.beep = beep; // }

class TimePrinter implements ActionListener {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public TimePrinter() {
  }

  public void actionPerformed(ActionEvent event)
  {
     Date now = new Date();
     System.out.println("At the tone, the time is " + now);

// print();

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     if (beep) {
        Toolkit.getDefaultToolkit().beep();

// setBeep(false);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     }
  }

  public void print_inner() {
     System.out.println("inner");
  }

} } 局部内部类 局部类不能用public或private访问修饰符进行声明。它的作用域被限定在声明这个局部类的块中。

局部类只能访问的局部变量需要是不可变的。需要更改计数时,可以定义一个数组,对数组值进行更新。

局部类并不是直接调用方法传递的参数,而是利用自身的构造器对传入的参数进行备份,内部类的方法调用的实际上是自己的属性而不是外部方法传递进来的参数

为什么要将局部内部类访问的局部变量设置为final?

简单理解: 拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用 final 来让该引用不可改变。

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date;

public class LocalInnerClassTest { public static void main(String[] args) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TalkingClock clock = new TalkingClock();
  clock.start(1000, true);

  // keep program running until user selects "Ok"
  JOptionPane.showMessageDialog(null, "Quit program?");
  System.exit(0);

} }

class TalkingClock {

public void start(int interval,final boolean beep) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  int[] arr = new int[1];
  class TimePrinter implements ActionListener
  {
     public void actionPerformed(ActionEvent event)
     {
        Date now = new Date();
        System.out.println("At the tone, the time is " + now);
        if (beep) Toolkit.getDefaultToolkit().beep();
        arr[0]++;
        System.out.println(arr[0]);
     }
  }
  ActionListener listener = new TimePrinter();
  Timer t = new Timer(interval, listener);
  t.start();

} } 匿名内部类 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。 匿名内部类中是不能定义构造方法的。 匿名内部类中不能存在任何的静态成员变量和静态方法。 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date;

public class AnonymousInnerClassTest { public static void main(String[] args) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TalkingClock clock = new TalkingClock();
  clock.start(1000, true);

  // keep program running until user selects "Ok"
  JOptionPane.showMessageDialog(null, "Quit program?");
  System.exit(0);

} }

class TalkingClock { public void start(int interval, final boolean beep) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 匿名内部类

// ActionListener listener = new ActionListener() // { // public void actionPerformed(ActionEvent event) // { // Date now = new Date(); // System.out.println("At the tone, the time is " + now); // if (beep) Toolkit.getDefaultToolkit().beep(); // } // };

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 使用lambda表达式
  ActionListener listener = event -> {
     Date now = new Date();
     System.out.println("At the tone, the time is " + now);
     if (beep) Toolkit.getDefaultToolkit().beep();
  };

  Timer t = new Timer(interval, listener);
  t.start();

} } 由于匿名内部类没有构造方法,所以只能通过构造代码块来进行构造

语法形式:

new 实现接口() {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//匿名内部类类体部分

} new 父类构造器(实参列表) { //匿名内部类类体部分 } abstract class Person {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract void eat();

}

interface Player {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void play();

}

public class Demo {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    Person p = new Person() {
        @Override
        public void eat() {
            System.out.println("eating");
        }
    };
    p.eat();

    Player player = new Player() {
        @Override
        public void play() {
            System.out.println("playing");
        }
    };

    player.play();
}

} 静态内部类 有时候使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类对象。为此,可以将内部类声明为static

只能在内部类中定义静态类。静态内部类的对象除了没有对生成它的外部类对象的引用特权外,与其他所有内部类完全一样。

静态类只能引用外部类的static成员变量或方法

只有静态内部类可以定义static成员变量或方法,普通的内部类不行!

创建一般内部类和静态内部类的区别:

//假设类A有静态内部类B和非静态内部类C,创建B和C的区别为: A a=new A(); //创建B A.B b=new A.B(); //创建C A.C c=a.new C(); public class StaticInnerClassTest {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args)
{
    double[] d = new double[20];
    for (int i = 0; i < d.length; i++)
        d[i] = 100 * Math.random();

    ArrayAlg.Pair p = ArrayAlg.minmax(d);
    System.out.println("min = " + p.getFirst());
    System.out.println("max = " + p.getSecond());
    // 调用静态内部类的静态变量和静态方法
    ArrayAlg.Pair.print();
    System.out.println(ArrayAlg.Pair.NUMBER);
}

}

class ArrayAlg {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final boolean flag = false;
public static void outerClassMethod(){
    System.out.println("inner method");
}
public static class Pair
{

    private double first;
    private double second;

    public static final Integer NUMBER = 20;

    public Pair(double f, double s)
    {
        first = f;
        second = s;
    }

    public double getFirst()
    {
        return first;
    }


    public double getSecond()
    {
        return second;
    }

    // 静态内部类中可以定义静态方法
    public static void print() {
        // 可以调用外部类的静态方法(变量)
        System.out.println("flag: " + flag);
        outerClassMethod();
        System.out.println("static method");
    }
}

public static Pair minmax(double[] values)
{
    double min = Double.MAX_VALUE;
    double max = Double.MIN_VALUE;
    for (double v : values)
    {
        if (min > v) min = v;
        if (max < v) max = v;
    }
    return new Pair(min, max);
}

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023 年 01 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础之内部类
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java基础之内部类,希望能够帮助大家进步!!!
Java架构师必看
2021/12/14
2730
Java-内部类
那么要访问外部类的date1可以通过外部內类名(OuterClass.this.date1)就可以。
学无止尽5
2024/11/29
780
Java-内部类
【Java入门提高篇】Day7 Java内部类——局部内部类
本文介绍了Java中的内部类,包括局部内部类、静态内部类和成员内部类,并说明了Java中内部类的用途和优势。对于局部内部类,它只能在定义它的方法中或者作用域内使用,并且只能被同一方法或同一个作用域内的类所访问。而静态内部类则不会持有任何外部类的引用,它只与外部类的静态成员变量有关联。成员内部类则不会受到外部类的影响,它既可以访问外部类的成员变量和方法,也可以访问外部类的静态成员变量。使用内部类可以避免类的公开和访问性问题,同时也可以实现接口的功能,并能够解决多继承带来的问题。
弗兰克的猫
2018/01/09
6270
这一篇让你彻底搞懂 JAVA内部类
做 Android 的话有时候会将各种 Adapter 直接写在 Activity 中,如:
程序员Leo
2023/08/02
2500
内部类学习
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
全栈程序员站长
2022/07/09
2010
java之内部类
成员内部类的优点: ⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。) ⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
猫头虎
2024/04/07
1290
Java内部类是如何实现的
本代码主要想说明的是作为内部类的TimePrinter可以直接访问外部类TalkingClock的私有成员变量beep。
Ryan-Miao
2019/05/17
7550
Java基础系列(三十):局部内部类,匿名内部类
当我们在外围类中定义的内部类仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。
山禾说
2019/01/21
7610
Java Review (十五、面向对象----内部类)
大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有的地方也叫嵌套类),包含内部类的类也被称为外部类(有的地方也叫宿主类)。Java从JDK 1.1开始引入内部类,内部类主要有如下作用。
三分恶
2020/07/16
3590
Java 内部类种类及使用解析
  Java 内部类种类及使用解析 内部类Inner Class   将相关的类组织在一起,从而降低了命名空间的混乱。   一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。 Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类local inner class 匿名内部类anonymous inner class 静态内部
mukekeheart
2018/02/27
1.3K0
Java基础系列(二十九):基本内部类
我们回过头来分析这个类,首先这里的TestListener类位于InnerClassTest类内部,但是这并不意味着每个InnerClassTest类都有一个TestListener实力域,我们可以在start()方法中看到,这个内部类对象是通过一个构造器来构造的ActionListener listener = new TestListener();,我们接着观察这个内部类,发现他其中使用了一个名叫beep的变量,但是这个类中并没有任何关于这个beep变量的定义,通过观察我们可以发现,这个名叫beep的变量来自于它的外围类对象的数据域。
山禾说
2019/01/21
3700
Java-内部类详解
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Fisherman渔夫
2019/07/31
3540
Java-内部类详解
Java 内部类
1 、说点闲话   因为个人原因,布衣博主的技术博文大半年来一直没时间更新(WHAT ? 这是啥理由),恍恍惚惚间,一年又是头,还是得跳出来,给自己一个交代。   编程日久,项目开发中最常用的技能大概
用户1615728
2019/02/13
6870
Java——内部类详解
说起内部类,大家肯定感觉熟悉又陌生,因为一定在很多框架源码中有看到别人使用过,但又感觉自己使用的比较少,今天我就带你具体来看看内部类。
健程之道
2019/12/09
4010
Java内部类复习笔记
什么是Java内部类? 在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Out
框架师
2021/03/05
6320
Java 内部类
在类的内部定义另一个类。定义就这么简单。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。内部类的定义格式如下:
赵哥窟
2018/12/24
3960
详解 Java 内部类
内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点。 从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看:
指点
2019/01/18
5310
详解 Java 内部类
【java】浅谈java内部类
根据文章内容为读者总结摘要。
啦啦啦321
2018/01/03
1K0
【java】浅谈java内部类
Java 内部类种类及使用解析
一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。
用户7886150
2021/04/07
4780
Java提高篇——详解内部类
本文主要介绍了Java中的内部类相关知识点,包括内部类的定义、特点、使用方式以及局部内部类、匿名内部类和静态内部类的使用。同时,还讲解了Java中的局部变量和成员变量在使用上的一些区别,以及如何在方法中使用局部变量和成员变量。最后,还通过一个示例来演示了内部类的使用方式和应用场景。
Java后端工程师
2017/12/12
1.1K0
相关推荐
Java基础之内部类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验