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

什么是匿名内部类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、当匿名内部类和外部类有同名变量(方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。

JAVA入门级教学之(匿名内部类)相关推荐

  1. JAVA入门级教学之(接口)

    目录 JAVA入门级教学之(接口) 接口也是一种引用类型,可以等同看做类 1.如何定义接口,语法: 2.接口中只能出现: 3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的 4.接口中没有构造方法 ...

  2. JAVA入门级教学之(abstract抽象类)

    目录 JAVA入门级教学之(abstract抽象类) 1.如何定义抽象类? 2.抽象类无法被实例化 3.虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的 4.抽象类中可 ...

  3. JAVA入门级教学之(super关键字)

    目录 JAVA入门级教学之(super关键字) 1.super关键字用在构造方法中: 2.语法规则: 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样 4.通过 ...

  4. JAVA入门级教学之(package和import)

    目录 JAVA入门级教学之(package和import) 1.包又称为package 2.怎么定义package? 3.包名的命名规范: 4.包名要求全部小写,包名也是标识符,必须遵守标识符的命名规 ...

  5. JAVA入门级教学之(多态)

    JAVA入门级教学之(多态) 怎么理解多态:你本身就该喊你爹叫爹,你让你爹叫你爹就是强制认做爹 多态的使用: A  a = new D(); D类继承A类,父类型引用指向子类型对象 * 关于java语 ...

  6. JAVA入门级教学之(参数传递)

    JAVA入门级教学之(参数传递) 问题引入: 参数分为形式参数还有实际参数,我们传入是的数据到底是什么呢? 方法调用的时候,涉及参数传递的问题, 传递的时候,java只遵循一种语法机制 就是将变量中保 ...

  7. JAVA入门级教学之(面向过程和面向对象的区别)

    目录 JAVA入门级教学之(面向过程和面向对象的区别) 面向过程和面向对象的区别: -面向过程: -面向对象: -发展历程: -生命周期中包括: -什么是类: -什么是对象: -软件开发的过程: -重 ...

  8. JAVA入门级教学之(方法递归)

    目录 JAVA入门级教学之(方法递归) 1.关于方法的递归调用: 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量别用 3.以下程序运行的时候发生了这样的一个错误[不是异常,是错误] 4.递归必须 ...

  9. JAVA入门级教学之(方法内存分配机制)

    目录 JAVA入门级教学之(方法内存分配机制) 1.方法只定义,不调用,是不会执行的 2.在JVM内存划分上有这样三块主要的内存空间:[还有其它的内存空间] 3.关于"栈"数据结构 ...

  10. JAVA入门级教学之(方法-1)

    目录 JAVA入门级教学之(方法-1) 1.以下程序不使用"方法",分析一下程序会存在哪些优缺点? 2.方法的本质:是一段代码片段,可以完成特定功能,可以重复利用 3.注意:方法定 ...

最新文章

  1. DJango-如何快速准备Python虚拟开发环境并快速定制一个项目
  2. Core Dump流程分析
  3. HTML/CSS——float制作页面DEMO
  4. 使用Prometheus针对自己的服务器采集自定义的参数
  5. 【CF#505B】Mr. Kitayuta's Colorful Graph (并查集或Floyd或BFS)
  6. 游戏开发使用的各个主流引擎对比
  7. EXCHANGE虚拟目录功能介绍
  8. 学python后到底能干什么-普通小白学会Python到底具体能做什么呢?
  9. note同步不及时 one_续航800仅卖23万,比亚迪唐DM为啥却卖不过理想ONE?
  10. redis实现高并发下的抢购/秒杀功能
  11. JAVA智能分析的简单聚众筹平台计算机毕业设计Mybatis+系统+数据库+调试部署
  12. 重磅!腾讯优图11篇论文入选AI顶会AAAI 2021
  13. 这些配色方案让数据可视化图表更加高大上
  14. narwal机器人_NARWAL云鲸智能扫拖机器人,海外Kickstarter众筹销量第一
  15. 公钥加密、数字签名、消息认证
  16. 如何将ppt演示文稿上传到微信公众号?
  17. 【SEED Lab】ARP Cache Poisoning Attack Lab
  18. 2021-03-17
  19. Python代码画小猪佩奇--turtle绘图
  20. Mac下设置zsh的环境变量

热门文章

  1. 五大原则让你的代码不再受bug的困扰
  2. 发送广播BroadcastReceiver
  3. CSS-Transform-transition-Animation
  4. 有BRT,为啥还建公交港湾
  5. JavaWeb——EL表达式
  6. 为什么linux远程一进入sudo su就卡住_Linux 实战(上)
  7. java单终端登陆_配置终端服务单一登录
  8. hadoop jar包_【大数据学习】Hadoop的MR分布式开发小实战
  9. QT示例:基于TCP 点对多Socket通讯(server,clients)
  10. Android之ActionBar