首页 > 编程语言 >Java拾贝第六天——匿名内部类

Java拾贝第六天——匿名内部类

时间:2023-10-19 19:56:50浏览次数:40  
标签:Java 拾贝 void say 第六天 匿名 重写 public 内部

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

匿名内部类

匿名对象没忘吧?

new Person();//语法同匿名内部类

匿名内部类就是匿名的局部内部类,地位同局部变量。

有两种形式:基于接口的匿名内部类,基于类的匿名内部类

基于接口的匿名内部类

常规方式实现接口并重写其方法

public class Test6 {
    public static void main(String[] args) {
        A a=new B();
        a.say();
    }
}
interface A{//定义接口
    void say();
}

class B implements A{//定义其实现类
    @Override
    public void say() {
        System.out.println("常规方式实现接口并重写方法");
    }
}
//常规方式实现接口并重写方法

常规方式的实现接口:

  1. 先定义接口
  2. 再定义实现类
  3. 再初始化对象并调用方法

如果该实现类复用率不高的话其实非常不方便(这种显式定义实现类的方式也叫硬编码)。

如果某实现类使用次数少的话可以采用匿名内部类的方式:

public class Test6 {
    public static void main(String[] args) {
        A a = new A() {//对象a指向的一个实现A接口的匿名内部类
            @Override
            public void say() {
                System.out.println("匿名内部类实现接口");
            }
        };
        a.say();
    }
}
interface A{
    void say();
}
//匿名内部类实现接口

其内部结构如下:

        A a=new A(){//匿名内部类的好处就是可以马上初始化
            @Override
            public void say() {
                System.out.println("匿名内部类实现接口");
            }
        };
        a.say();

其实就是一个匿名的局部内部类

        class XXX$1 implements A{
	//匿名内部类 类名一般是外部类名 ($后的数字是匿名内部类出现次数)
            @Override
            public void say() {
                System.out.println("匿名内部类实现接口");
            }
}
A a=XXX;
a.say();

至此,相对于常规方式实现接口:

  1. 定义接口
  2. 直接初始化并调用方法

基于类的匿名内部类

常规方式继承类并重写其方法(类与类的关系肯定是继承)

public class Test6 {
    public static void main(String[] args) {
        A a=new B();
        a.say();
    }
}

abstract class A {//抽象类普通类都可以
    public abstract void say();
}

class B extends A {
    @Override
    public void say() {
        System.out.println("常规方式继承类并重写方法");
    }
}

常规方式重写类方法:

  1. 先定义父类
  2. 再定义子类
  3. 再初始化对象并调用方法

如果该类复用率不高的话其实非常不方便(硬编码别忘了)

如果某类使用次数少的话可以采用匿名内部类的方式:

public class Test6 {
    public static void main(String[] args) {
      A a=new A() {
            public A(String name){//匿名内部类不允许重写构造方法
            }
            @Override
            public void say() {
                System.out.println("匿名内部类重写类方法");
            }
        };
        a.say();

    }
}

abstract class A {
    public A(){
        System.out.println("抽象类也可以有构造方法");
    }
    public abstract void say();
}
/*
抽象类也可以有构造方法
匿名内部类重写类方法
*/

其内部结构如下:

        A a=new A() {
            @Override
            public void say() {
                System.out.println("匿名内部类重写类方法");
            }
        };
        a.say();
//或者可以写成如下:

        new A() {
            @Override
            public void say() {
                System.out.println("匿名内部类重写类方法");
            }
        }.say();//但是只能使用一次,连引用的变量都没了

其实就是一个匿名的局部内部类

       class XXX$1 extends A{
            @Override
            public void say() {
                System.out.println("匿名内部类重写类方法");
            }
        }
A a=new XXX$1();
a.say();

至此,相对于常规方式重写类方法:

  1. 定义父类
  2. 直接初始化并调用方法

注意!!!!!!!

new A(){//这是匿名内部类

};

new A();//这是匿名对象

标签:Java,拾贝,void,say,第六天,匿名,重写,public,内部
From: https://www.cnblogs.com/Ocraft/p/17775467.html

相关文章

  • JAVA项目中的常用的异常处理情况
    #Java项目中常用的异常处理情况Java是一种强类型、面向对象的编程语言,它具有丰富的异常处理机制。异常处理是编写健壮、可靠和可维护的Java代码的关键组成部分。在Java项目中,处理异常的方式通常包括:##1.try-catch-finally块try-catch-finally是Java中最常见的异常处理机......
  • Java有哪些保证原子性的方法?如何保证多线程下i++ 结果正确?什么是原子操作类?
    使用循环原子类,例如AtomicInteger,实现i++原子操作使用juc包下的锁,如ReentrantLock,对i++操作加锁lock.lock()来实现原子性使用synchronized,对i++操作加锁原子操作类当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经......
  • JavaScript内置对象和DOM
    数组数组遍历/* 数组遍历的方法 1.for循环遍历数组下标输出 2.forEach遍历forEach(function(item,index,arr)) 3.filter(function(item,index,arr))返回一个新数组,回调函数返回true的结果会保存在新数组中 4.map(function(item,index,arr)) 返回一个新数组,回调函数retur......
  • [Java]Java初学之多线程01
    Intro写完上一篇博客就立刻开始了Java多线程的学习学习这个东西还是得趁热打铁,一两天不学感觉知识要从脑子里流走了(不要啊(≧□≦)ノ)就是这样,这篇文章主要集中在Java多线程的相关内容,可能会分篇写。正文程序(Program)、进程(Process)、线程(Thread)在正式学习内容之前,我觉得先......
  • 基于Java Web的多功能旅游网站的设计与实现-计算机毕业设计源码+LW文档
    摘 要 随着时代的发展,人们对旅游也越来越重视,近些年来我国的旅游产业也发生了翻天覆地的变化,但是很多人在出去旅游的时候不知道去哪里旅游,在预订酒店和机票的时候也没有一个综合性的旅游网站,为了让人们的旅游变的更加的方便,为此我开发了本基于JavaWeb的多功能旅游网站本基于......
  • 基于Java的智慧图书管理系统-计算机毕业设计源码+LW文档
    摘要随着时代的发展,图书的重要性显示的越来越突出了,尤其是知识大爆炸的这个年代,人们需要掌握的知识也越来越多,只有不断的提高自己才能够更好的立足于社会,但是通常情况下很多图书的价格比较高,这个时候就可以通过图书馆借阅图书来达到图书阅读的目的,为了让图书借阅变的更加的方便我......
  • java生成Excel文件
    版本一:importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importjava.io.ByteArrayOutputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;import......
  • 开源游戏 | 一款采用 Java开发的基于小孔成像原理与图形光栅化的字符 3D 画面框架构建
     去关注、不迷路一、项目概述       这是一款采用JavaSwing开发的基于小孔成像原理与图形光栅化的字符3D画面框架构建的空战游戏,简单说就是作者为了做个3D字符空战游戏,顺手写了个3D引擎,别人的本科毕设。注:dogfight为军事用语,是指战机近距离接战缠斗,可直接......
  • Java 记事本
    Notepadpackagecom.company;importjava.awt.Dimension;importjava.awt.FileDialog;importjava.awt.Image;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowEvent;importjava.aw......
  • 如何使用GraalVM和Java采集天涯图片
    今天我要给大家分享的是如何使用GraalVM和Java编写一个采集天涯论坛图片的程序,内容通俗易懂,非常适合新手学习,大神勿喷。```java//导入必要的库importjava.io.*;importjava.net.*;importjava.util.*;//创建一个名为Downloader的类publicclassDownloader{//定义......