首页 > 编程语言 >Java内部类与匿名类

Java内部类与匿名类

时间:2023-05-01 12:11:28浏览次数:41  
标签:Java 内部 void System public 匿名 println class

内部类

定义:

一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类

//外部类
class Outer
{
	//内部类
	class Inner
	{
	
	}
}
package Innerclass;

//外部其他类
public class c1 {
}

class Outer
{
    //属性
    private int n1 = 100;
    //方法
    public void m1()
    {
        System.out.println("m1()");
    }
    //内部类
    class Inner
    {
        
    }
}

内部类的分类

1、定义在外部类局部位置上(比如方法内)
(1)局部内部类(有类名)

(2)匿名内部类(没有类名)

2、定义在外部类的成员位置上
(1)成员内部类(没用static修饰)
(2)静态内部类(使用static修饰)

1、局部内部类

1、局部内部类是定义在外部类的方法中的
2、并且局部内部类可以访问外部类的所有成员包括私有的,访问的方法是直接访问,外部类在方法中可以创建内部类的对象,然后通过内部类的对象去调用其方法
3、不能添加访问修饰符,和局部变量一样,可以用final来修饰
4、作用域只在局部类的方法体内
5、外部其他类不能访问局部内部类(因为局部内部类的地位是一个局部变量)

package Innerclass;

public class LocalInnerClass {
    public static void main(String []args)
    {
        Outer02 outer02 = new Outer02();
        outer02.m1();
    }
}
//外部类
class Outer02
{
    //属性
    private int n1 = 100;
    //私有方法
    private void m2()
    {
        System.out.println("m2");
    }
    //方法
    public void m1()
    {
        //局部内部类通常定义在外部类的方法中
        //局部内部类
        class Inner02
        {
            //局部内部类可以访问外部类的所有成员,包含私有的
            public void f1()
            {
                m2();
                System.out.println("n1 = " + n1);
            }
        }
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }
}

6、如果外部类和内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用(外部类名.this.成员)

Out02.this.n2

匿名内部类

1、本质是类
2、内部类, 但实际是有名字的,只不过用完之后会立即被销毁
3、该类是没有名字
4、同时还是一个对象

匿名内部类创建之后,会立马实例化出来,然后这个匿名类内部类就不能再被使用了,但实例化出来的对象是可以反复调用的

基于接口的匿名内部类使用

package Innerclass;

public class AnonymousInnerClass {
    public static void main(String []args)
    {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04
{
    private int n1 = 10;
    public void method()
    {
        //基于接口的匿名内部类
        //tiger的编译类型?IA
        //tiger的运行类型?就是匿名内部类
        /*
            底层是
            class XXXX implements IA
            {
                public void cry()
                {
                    System.out.println("老虎叫唤...");
                }
            }
         */
        IA tiger = new IA()
        {
            public void cry()
            {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型 = " + tiger.getClass());
        tiger.cry();
    }
}

interface IA{
    public void cry();
}

image

基于类的匿名内部类

package Innerclass;

public class AnonymousInnerClass {
    public static void main(String []args)
    {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04
{
    private int n1 = 10;
    public void method()
    {
        //基于接口的匿名内部类
        //tiger的编译类型?IA
        //tiger的运行类型?就是匿名内部类
        /*
            底层是
            class XXXX implements IA
            {
                public void cry()
                {
                    System.out.println("老虎叫唤...");
                }
            }
         */
        IA tiger = new IA()
        {
            public void cry()
            {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型 = " + tiger.getClass());
        tiger.cry();

        //正常new一个对象
        Father father1 = new Father();
        System.out.println("father1对象的运行类型是=" + father1.getClass());

        //匿名内部类
        Father father = new Father()
        {
            @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("father对象的运行类型=" + father.getClass());
        father.test();
        Animal animal = new Animal()
        {
            @Override
            public void say() {
                System.out.println("小狗吃骨头");
            }
        };
        animal.say();
    }
}

interface IA{
    public void cry();
}

class Father
{
    public void test() {}
}

abstract class Animal
{
    public void say()
    {}
}

image

匿名内部类的使用细节

匿名内部类的定义比较特殊,本身是一个类同时还是一个对象

先定义一个匿名内部类,接收之后,再用生成的对象

image

不接收直接调用

image

package Innerclass;

public class AnonymousInnerClassDetail
{
    public static void main(String[] args)
    {
        Outer05 outer05 = new Outer05();
        outer05.f1();
    }
}

class Outer05
{
    private  int n1 = 99;
    public void f1()
    {
        Person person = new Person()
        {
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi");
            }
        };
        person.hi();

        //也可以直接调用
        new Person()
        {
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi");
            }
        }.hi();
    }

}
class Person
{
    public void hi()
    {
        System.out.println("Person hi");
    }

}

匿名内部类的实践

匿名内部类主要用于当前类只使用一次,使用过后我们就不会再反复使用,这样我们就没有必要专门再写一个类。

package Innerclass;

public class InnerClassExercise01 {
    public static void main(String[]args)
    {
       f1(new IL() {
           @Override
           public void show() {
               System.out.println("这是一幅名画");
           }
       });
    }
    public static void f1(IL il)
    {
        il.show();
    }
}
interface IL
{
    void show();
}
package Innerclass;

public class InnerClassExercise02 {
    public static void main(String[] args)
    {
        CellPhone cellPhone = new CellPhone();
        cellPhone.alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
        cellPhone.alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("小伙伴们上课");
            }
        });
    }
}

interface Bell
{
    void ring();
}

class CellPhone{
    public void alarmclock(Bell bell)
    {
        bell.ring();
    }
}

标签:Java,内部,void,System,public,匿名,println,class
From: https://www.cnblogs.com/cxy8/p/17358266.html

相关文章

  • java 基础(5)在idea中对java程序打包运行
    第一步 第二步 第三步  src目录下 第四步   第五步:  ......
  • chatGTP对js匿名函数的解答
    前言笔者在使用chatGTP的过程中发现它越来越聪明,它可以对一个问题连续的解答,也预示着chatGTP的出现,百度等搜索引擎的即将消亡,chatGTP是聪明的这令笔者是大吃一惊的下面是对chatGTP的问答内容chatGTP对js匿名函数的解答问1:能说说js中的匿名函数吗?答1:当函数没有名字时,我们称之......
  • Java层序遍历打印二叉树(有Null值)
    publicclassSolution{publicstaticvoidmain(String[]args){Integer[]arr={3,9,20,null,null,15};//根据数组构造出二叉树TreeNodetreeNode=creatTreeNode(arr,0);//层序有Null值的打印二叉树printBin......
  • JavaScript相关
    Javascript基础​ JavaScript,是一门能够运行在浏览器上的脚本语言.简称JS.首先,Javascript这个名字的由来就很有意思,不少人认为Javascript和Java貌似很像.容易想象成Java的脚本.但其实不然,两者之间没有任何关系.纯粹是商业碰瓷.​ 那么既然JS是可以运行在浏览器上......
  • java基于springboot的毕业生信息招聘平台、高校学生招聘管理系统、招聘管理系统,附源码
    1、项目介绍毕业生信息招聘平台的功能如下:管理管理员;首页、个人中心、企业管理、空中宣讲会管理、招聘岗位管理、毕业生管理、个人简历管理、求职信息管理、信息咨询管理、岗位应聘管理、线上面试管理、面试回复管理、试卷管理、试题管理、管理员管理、论坛管理、系统管理、考试......
  • java基于ssm的超市管理系统、超市销售管理系统,附源码+数据库+文档,适合课设设计、毕业
    1、项目介绍java基于ssm的超市管理系统、超市销售管理系统。本系统的设计是两种用户,一种是普通用户,一种是管理员用户。权限都不一样。主要功能有:添加商品、库存查询、订单管理、商品删除管理、退货管理、销售统计、供应商管理、用户管理、角色管理。项目获取,看这里2、技术框......
  • java类的里面可以再定义一个类吗
    ava类里面还可以定义一个类,即内部类。1.java内部类分为:成员内部类、静态嵌套类、方法内部类、匿名内部类。2.内部类的共性(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。(2)、内部类......
  • java基于ssm的房屋租赁管理系统、房屋出租管理系统、租房管理系统,附源码+数据库,免费安
    1、项目介绍java基于ssm的房屋租赁管理系统、房屋出租管理系统、租房管理系统,​系统分为前台用户界面和后台系统管理。项目获取,看这里1.1前台用户界面用户注册、用户登录、用户中心、浏览房源、房源搜索查看房源明细、发布房源、提交合同、新闻公告、留言交流1.2后台系统......
  • java基于springboot的学生毕业离校系统管理系统、高校学生离校管理系统,附源码+数据库+
    1、项目介绍学生毕业离校系统的开发过程中,采用B/S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。中间件服务器是Tomcat服务器,使用Mysql数据库。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员:首页、个人中心、学生管理、教师管理、离校信息管......
  • java基础-算术运算符(加减乘除取余),隐式转换、强制转换
    一、运算符和表达式的定义运算符:对字面量或者变量进行操作的符号。表达式:用运算符把自变量连接起来,符合java语法的式子就可以称为表达式。例如:inta=10;intb=20;intc=a+b;其中,+,是运算符,并且是算术运算符;a+b是表达式,由于+是算数运算符,所以这个表达式叫算术表达式。二、......