首先说为什么有匿名类(产生的使命)

两个原因

1.简化代码编写

某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类

2.在不同的包内的类内调用类的protected方法(其实,也可以理解和第一个原因是一样的)

匿名类继承了父类,并调用了父类的protected方法

条件:

匿名类完成上述使命,则需要继承一个类或者实现某个接口

形式:new <类或接口> <类的主体>

示例1:

/**
* 一般类
* @author masan
*
*/
class Normal{
public void func(){
System.out.println("do with name");
}
} public class UnNamedClass {
public static void main(String[] args) {
Normal m = new Normal(){
public void func(){
System.out.println("do without name");
};
};
m.func();
}
}

  输出结果为:"do without name",

匿名类继承了Normal类,并且覆盖了父类的func方法

那么这个m到底是哪一个类的对象,是父类的还是子类的??

示例2:

/**
* 一般类
* @author masan
*
*/
class Normal{ public void func(){
System.out.println("do with name");
} } public class UnNamedClass { public static void main(String[] args) {
Normal m = new Normal(){
// 覆盖了父类的方法func()
public void func(){
System.out.println("do without name");
};
// 定义一个父类没有的方法func1
public void func1(){
System.out.println("func1 do without name");
}
}; m.func(); // 输出 "do without name" m.func1(); // 报错,没有这个方法 // 调用func1(),这种写法是对的,可以调用匿名类的任意方法
new Normal(){
public void func(){
System.out.println("do without name");
}; public void func1(){
System.out.println("func1 do without name");
}
}.func1(); // 上述示例说明这种关系是 父类引用指向了new出来的子类实例,m是父类的引用但是指向了子类的实例 } }

   上述示例说明这种关系是 父类引用指向了new出来的子类实例,那么接口的情况下会如何?

示例3:匿名类实现接口

// 先定义一个接口

public interface Human {
public void eat(); public void drink(); }
public class UnNamedClass {

	public static void main(String[] args) {

// 大家可以看到,这里new了一个接口,Java里接口是没有构造函数的,那么这里又是什么情况
Human masan = new Human(){
// 匿名类实现了Human接口的所有方法
@Override
public void eat() {
System.out.println(" masan eat ");
} @Override
public void drink() {
System.out.println(" masan drink ");
} }; masan.eat(); // 编译通过, 输出 " masan eat " masan.drink(); // 编译通过,输出 " masan drink "
// 可以看出 masan这个对象可以调用所有实现了方法,也就是说其实masan是匿名类的实例,
// 所以并没有实例化接口 而是实例化了这个匿名类 } }

  

示例4:调用不同包的类的protected方法

访问权限如果不熟悉的话,附上一张权限图

修饰词

本类

同一个包的类

继承类

其他类

private

×

×

×

无(默认)

×

×

protected

×

public

父类:(不同包)

package another;

public class Parent {

	public void run(){
System.out.println(" run with legs! ");
} public void drink(){
System.out.println(" parent drink with mouth! ");
} // protected 方法
protected void eat(){
System.out.println(" parent eat with mouth! (protected)");
}
}

另一个包调用protected方法

package base;

import another.Parent;

public class UnNamedClass {

	public static void main(String[] args) {

		Parent p = new Parent();

		p.eat();  // 报错,因为不是同包内的类,也不是子类,所以,不能调用protected方法;

		//  假设只有这一个地方需要调用这个protected权限的eat()方法
// 则可以使用匿名类继承Parent,调用父类的eat
new Parent(){
// 匿名类新定义一个方法,方法体调用父类的eat();
public void peat(){
  super.eat();
};
}.peat(); // 输出 " parent eat with mouth! (protected)" 则成功的调用了父类的eat()
} }

总结,综合上述4个示例可以看出:

匿名类与普通类的区别主要在于,没有名字和使用时机

匿名类的继承父类和实现接口都符合Java的一般规定

匿名类在实例化的时候会有些特殊

要new 父类的构造方法,实例化匿名类本身(因为没有名字嘛)

同理,引用也只能用父类的,所以一般是父类引用指向子类(匿名类)实例

Java匿名内部类使用与示例的更多相关文章

  1. #随笔之java匿名内部类

    随笔之java匿名内部类 从今天起开始每日一篇技术博客,当然这只是我当天所学的一些随笔,里面或多或少会有理解不当的地方,希望大家多多指教,一起进步! 在讲匿名内部类之前,先讲讲内部类的一些概念. 1. ...

  2. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  3. JAVA代理方式使用示例总结

    JAVA代理方式使用示例总结 一.    代理方式概括 Java的代理方式主要包含了静态代理,动态代理两种方式,其中,动态代理根据实现的方式不同,又可以划分为jdk动态代理和cglib动态代理. 二. ...

  4. Java SE 9 模块化示例

    Java SE 9 模块化示例 作者:Grey 原文地址:Java SE 9 模块化示例 说明 Java SE 9引入了模块系统,模块就是代码和数据的封装体.模块的代码被组织成多个包,每个包中包含Ja ...

  5. Java 8 lambda表达式示例

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  6. 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰

    大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类. class Outer { priv ...

  7. java匿名内部类使用场景列举

    示例一: package com;      interface Operation {       double operateTwoIntNum(int a, int b);   }      p ...

  8. Java Socket长连接示例代码

    SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...

  9. 从JAVA客户端访问Redis示例(入门)

    转自:http://blog.csdn.net/kkdelta/article/details/7217761 本文记录了安装Redis和从JAVA端访问Redis的步骤 从http://downlo ...

随机推荐

  1. ACM 子串和

    子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3   描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...

  2. 购买的wemall 6.0商城系统源码分享

    使用方法 1.解压目录 2.cd wemall6 && npm i 3.配置config下的config.json 4.npm start 摒弃以往的开发框架thinkphp,使用no ...

  3. swift -- as / 扩展

    一.使用 可选链式 调用代替强制展开 //当声明一个属性时,将属性类型设置为可选类型: 好处: 当可选类型的属性被赋予初始值时,系统调用初始值;当可选类型属性没有赋予初始值时,系统只会调用失败;如果属 ...

  4. SVN的安装及使用指南

    SVN的安装及使用指南 目录: 一.     SVN的安装. 1. VisualSVN的安装 2. Server Port的选择及错误处理 3. TortorieseSVN的安装 二.     SVN ...

  5. H5 音频

    HTML 5 音频 HTML5 视频/DOM HTML5 拖放 HTML5 提供了播放音频的标准. Web 上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比 ...

  6. 【转】请求处理机制其二:Django中间件的解析

    Middleware 开始工作了 get_response 做的第一件事就是遍历处理器的 _request_middleware 实例变量并调用其中的每一个方法,传入 HttpRequest 的实例作 ...

  7. SolrCloud的介绍

    SolrCloud(solr云)是Solr提供的分布式搜索方案. 当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud. 当索引量很大,搜索请求并发很高时,同样需要使用SolrClou ...

  8. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  9. 关于mui选择器的使用

    使用mui引入选择器的picker.js.poppicker.js.及他们的css文件之后引入代码与点击确定之后的状态: document.querySelector('#osex').addEven ...

  10. css远距离链接

    远距离链接主要运用了hover伪类,但是运用了两次 <!DOCTYPE html> <html lang="en"> <head> <me ...