JAVA入门级教学之(匿名内部类)

 

看了本文章你将知道什么是匿名内部类,如何熟练掌握并使用匿名内部类。如果你已经是大牛可以跳过,没有看的必要。

什么是匿名内部类What

先说类,我们都知道类用于描述客观世界里某一类对象的共同特征,对象是其具体体现。类可以被被认为是一种自定义的数据类型,可以使用类来定义变量。也就是所说的类类型,是一种引用数据类型。

如果在一个类里面定义一个类,那么这个类就是内部类,外面的那个类就是外部类,这个很好理解。内部类就相当于外部类的一个成员,你可以把内部类看成一个整体。内部类分为:静态内部类,非静态内部类。匿名内部类是非静态内部类的一种特殊情况,匿名内部类没有类名,因此就不可能有构造函数,不能创建对象。除此之外还有局部内部类,就是定义在方法内的,这个一般不怎么用,不需要掌握,知道就好,本文主要说匿名内部类,其他内部类以后会说。

为什么会有匿名内部类

说白了,就是因为想偷懒,不想写太多代码。如果可以,程序员完全可以通过实现接口或者继承抽象类的方式来实现而不用创建匿名内部类。但是使用匿名内部类的优点是显而易见的,可以少些代码,而且代码更加简洁。

匿名内部类的定义

先看匿名内部类的定义的语法格式:

 

new 实现接口()
{//匿名内部类类体部分
}

 

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

为什么匿名内部类的定义有这两种方式呢?这是因此这两种方式的定义分别对应两种方式,一种是接口,另一种是抽象类。

对于实现接口,由于接口是没有构造函数的,注意这里一定是空参数。
第二种是调用父类的构造器,注意此处可以是空参数,也可以传入参数。

如何使用匿名内部类

对于匿名内部类的使用,我将通过两个具体的例子进行说明,如果你看懂了这两个例子,就基本掌握了他的使用,建议多看几遍例子。

第一种情况:实现接口

 

interfance Product
{public double getPrice();public String  getName();
}

上面代码定义一个接口,接口里面两个抽象方法

 

public class Anonymous
{public void test (Product p){System.out.println(p.getName()+"--------"+p.getPrice());}public static void main(String [ ] args ){Anonymous as= new Anonymous ();as.test(new Product( )//此处实现接口并实现抽象方法{public double getPrice( )//实现方法{return 8888;}public String getName( )//实现方法{return "I can do it ";}});}
}

上面代码很简单,就是定义了一个类Anonymous,在类里定义了一个test方法。然后就是创建Anonymous对象,调用他的实例方法test()。
不过调用test()方法时,要传入一个Product对象。但是由于Product是一个接口,无法创建对象,所以要实现该接口。因此此处采用匿名内部类的方式进行,并实现接口中全部的抽象方法!



作者:pmThinker_以默
链接:https://www.jianshu.com/p/0950c6787c7d

package com.lbj.javase22;
/**
 *     匿名内部类:指的是类没有名字,直接在调用的类体里面重写实现继承过来的方法,达到不知名却知意的功能
 * 
 * 
 *     优点:代码量减少,少定义一个类
 *     缺点:复用性太低,没有名字可以进行重复使用
 * @author 14811
 *
 */
public class Test {

    //首先定义一个静态方法
    public static void t(CustomerService cs){
        cs.logout();
    }
    
    
    //程序入口
    public static void main(String[] args){
        
        //如何调用t方法呢
        
        //方法1
        //编写一个类实现CustomerService接口
        //调用t方法
        //顺序main方法调用t方法,t方法调用logout方法,
        //t(new CustomerServiceImpl());
        
        //方法2
        //使用匿名内部类的方法执行t方法
        //整个new CustomerService(){} 就是匿名内部类
        t(new CustomerService(){public void logout(){System.out.println("系统退出");}});
        
        
    }
    
}

//定义一个接口
interface CustomerService{
    //退出系统的抽象方法
    void logout();
}

编写一个类实现CustomerService接口,在没有匿名内部类的时候还是写一个子类实现接口的方法,这时候我们再用方法2来看看怎么处理,怎么方便
//这种多定义一个类优点就是可以重复利用,而匿名内部类是不可以重复利用的
//class CustomerServiceImpl implements CustomerService{
//    public void logout(){
//        System.out.println("退出系统");
//    }
//}

匿名内部类不能定义任何静态成员、方法。

匿名内部类中的方法不能是抽象的;

匿名内部类必须实现接口或抽象父类的所有抽象方法。

匿名内部类访问的外部类成员变量或成员方法必须用static修饰;

 

1、匿名内部类因为没有类名,可知匿名内部类不能定义构造器

2、因为在创建匿名内部类的时候,会立即创建它的实例,可知匿名内部类不能是抽象类,必须实现接口或抽象父类的所有抽象方法

3、匿名内部类会继承一个父类(有且只有一个)或实现一个接口(有且只有一个),实现父类或接口中所有抽象方法,可以改写父类中的方法,添加自定义方法。

5、当匿名内部类和外部类有同名变量(方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 怎么读取Cpp文件_从PCD文件写入和读取点云数据

(1)学习向PCD文件写入点云数据建立工程文件ch2,然后新建write_pcd.cpp CMakeLists.txt两个文件write_pcd.cpp : #include <iostream> //标准C库中的输入输出的头文件 #include <pcl/io/pcd_io.h> //PCD读写类相关的头文件 #include <pcl…

JAVA入门级教学之(类之间究竟有哪几种关系呢)

关于计算机的一些专业名词的解释 1.泛化关系&#xff1a; 什么是泛化关系呢&#xff1f;简单来说就是一个子类继承父类&#xff0c;这就是一个泛化关系图例&#xff1a;或者说一个子接口继承父接口&#xff0c;这也是一个泛化关系图例&#xff1a;2.实现关系&#xff1a; 实…

既约分数蓝桥杯c语言,2021蓝桥杯C++第二届省赛

负载平衡题目描述有 \\(n\\) 台计算机&#xff0c;第 \\(i\\) 台计算机的运算能力为 \\(v_i\\)。有一系列的任务被指派到各个计算机上&#xff0c;第 \\(i\\) 个任务在 \\(a_i\\) 时刻分配&#xff0c;指定计算机编号为 \\(b_i\\)&#xff0c;耗时为 \\(c_i\\) 且算力消耗为 \\…

蓝桥杯c语言难还是JAVA难_蓝桥省一难如猛虎?宝刀助你一战成名!

为什么说[C语言网](C语言网 - 领先实用的编程在线学习网站)这是可以让编程萌新圆梦的的宝刀利器&#xff1f;相信大多数人会问&#xff0c;你是不是口若悬河&#xff0c;纸上谈兵呢&#xff1f;当然不是&#xff0c;下面笔者将为大家介绍一下&#xff0c;本人的编程经历。这些话…

c 字符串数组_在C++中将字符串转换为char数组

我们许多人遇到了错误‘cannot convert std::string to char[] or char* data type’。例如&#xff1a;Input : string s "geeksforgeeks" ;Output : char s[] { g, e, e, k, s, f, o, r, g, e, e, k, s } ;Input : string s "coding&q…

无法打开虚拟机“Ubuntu2” (D:\software\Ubuntu2.vmx): 未找到文件。 是否从库中移除“Ubuntu2”?

1.关闭虚拟机并重启 2.删除ubuntu目录的.lck文件 3.关闭电脑防火墙 4.点击ubuntu目录下的.vmx文件直接运行

51C语言编译后执行到一半,“C语言” 读书札记之[再续编译执行]

介绍上一篇a.out(hello&#xff0c;world程序)执行之后发生了什么&#xff1f;这次通过系统硬件和操作做粗略的描述&#xff0c;这样对我们也是有一些帮助的。如果中间若有误&#xff0c;请不吝赐教。从键盘上读取a.out命令当我们打开我们的终端的时候&#xff0c;shell程序会执…

linux 安装mysql8_MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?

作者介绍贺春旸&#xff0c;凡普金科DBA团队负责人&#xff0c;《MySQL管理之道&#xff1a;性能调优、高可用与监控》第一、二版作者&#xff0c;曾任职于中国移动飞信、安卓机锋网。致力于MariaDB、MongoDB等开源技术的研究&#xff0c;主要负责数据库性能调优、监控和架构设…

acm竞赛2016c语言真题,C语言acm竞赛习题集锦.doc

C语言acm竞赛习题集锦.doc杭州电子科技大学 acm 习题精选 第 1 页 共 21 页 目录 1、 数塔问题 2 2、 并查集类问题 4 3、 递推类问题 9 4、 动态规划系列 10 5、 概率类题型 13 6、 组合数学类题型 15 7、 贪心策略 16 8、 几何问题 .19 杭州电子科技大学 acm 习题精选 第 2 页…

JAVA入门级教学之(文档里的is-a、is-like-a、has-a到底是什么意思)

1.is-a&#xff1a;【什么什么是】 描述的是一个继承关系 2.is-like-a&#xff1a;【什么什么像】 描述的是一个接口关系 3.has-a&#xff1a;【什么什么包含】 描述的是一个关联关系

c语言死循环中输入字符,如下代码,如果输入字符,为什么会造成死循环?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼上面代码有误&#xff0c;本来switch语句是接收int型的&#xff0c;有死循环&#xff1b;有人建议改成接收字符&#xff0c;上面没改完全&#xff0c;现在改完全了&#xff0c;但是会重复输出&#xff0c;输出如下*** ACME checkbo…

python 字符转义_2500字 字符串专题总结

我的完整施工计划已完成专题&#xff1a;1.我的施工计划2.数值专题这篇是字符串专题总结除了常见的数值型&#xff0c;字符串是另一种常遇到的类型。一般使用一对单引号或一对双引号表示一个字符串。字符串中如果遇到 \ 字符&#xff0c;可能是在做字符转义&#xff0c;所谓的转…

JAVA入门级教学之(异常机制的原理到底是什么)

* 1.异常是什么&#xff1f; * * 第一&#xff1a;异常模拟的是现实世界中"不正常的"事件 * * 第二&#xff1a;java中采用"类"的形式去模拟异常 * * 第三&#xff1a;类是可以创建对象的 * * 例如&#xff1…

python修改列表指定位置的_Python 基础教程—列表(1)

Python内置了多种序列&#xff0c;本次讨论&#xff1a;列表。列表是Python提供的容器型数据类型。可变并且有序。可变 - 列表中的每个元素的值可变&#xff0c;列表的长度可变&#xff0c;列表中的顺序可变。(支持增、删、改)有序 - 每个元素可以通过下标来确定位置1、 列表的…

JAVA入门级教学之(深入throws的异常抛出机制)

package com.lbj.javase23; import java.io.*;public class ExceptionTest04 {public static void main(String[] args) throws FileNotFoundException{//使用throws处理异常不是真正处理异常而是推卸责任&#xff0c;谁调用就上抛给谁//上面的m1方法如果出现了异常&#xff0c…

android 代码 shape,Android Shape控件美化实现代码

如果你对Android系统自带的UI控件感觉不够满意&#xff0c;可以尝试下自定义控件&#xff0c;我们就以Button为例&#xff0c;很早以前Android123就写到过Android Button按钮控件美化方法里面提到了xml的selector构造。当然除了使用drawable这样的图片外今天Android开发网谈下自…

操作系统之(一篇文章让你简单搞定:什么是进程和线程)

文章目录1.为什么引入进程2.进程究竟是什么&#xff1f;进程的定义和属性&#xff1a;3.进程的状态和转换4.什么是进程上下文5.进程的控制和管理6.为什么要引入线程7.线程的概念8.引入线程的好处9.进程和线程的区别1.为什么引入进程 1、我们知道&#xff0c;最早出现的OS系统是…

冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结

一、排序算法说明排序的定义&#xff1a;对一个无序的序列进行排序的过程。输入&#xff1a;n个数&#xff1a;a1,a2,a3,…,an。输出&#xff1a;n个数的排列:a1,a2,a3,…,an&#xff0c;使得a1<a2<a3<…<an。排序的稳定性&#xff1a;相同值的节点相对位置是否会发…

同步android wear音乐,Android Wear首次更新:添加离线音乐 GPS功能等

凤凰科技讯 北京时间10月24日消息&#xff0c;据科技博客TechCrunch报道&#xff0c;Android Wear日前迎来了其发布后的首次大更新。谷歌为这一可穿戴设备的操作系统添加了离线音乐、蓝牙耳机以及GPS定位等功能。此次更新意味着&#xff0c;当你出去慢跑但将智能手表落在家里的…

JAVA入门级教学之(异常的处理try...catch)

* 处理异常的第二种方式&#xff1a;捕捉 try{}catch(){} * * 语法&#xff1a; * try{ * 可能出现异常的代码; * } * catch(异常类型1 变量){ * 处理异常的代码; * } * catch(异常类型2 变量…