Java匿名内部类使用与示例
首先说为什么有匿名类(产生的使命)
两个原因
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匿名内部类使用与示例的更多相关文章
- #随笔之java匿名内部类
随笔之java匿名内部类 从今天起开始每日一篇技术博客,当然这只是我当天所学的一些随笔,里面或多或少会有理解不当的地方,希望大家多多指教,一起进步! 在讲匿名内部类之前,先讲讲内部类的一些概念. 1. ...
- Java枚举类型使用示例
Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...
- JAVA代理方式使用示例总结
JAVA代理方式使用示例总结 一. 代理方式概括 Java的代理方式主要包含了静态代理,动态代理两种方式,其中,动态代理根据实现的方式不同,又可以划分为jdk动态代理和cglib动态代理. 二. ...
- Java SE 9 模块化示例
Java SE 9 模块化示例 作者:Grey 原文地址:Java SE 9 模块化示例 说明 Java SE 9引入了模块系统,模块就是代码和数据的封装体.模块的代码被组织成多个包,每个包中包含Ja ...
- Java 8 lambda表达式示例
例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...
- 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰
大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类. class Outer { priv ...
- java匿名内部类使用场景列举
示例一: package com; interface Operation { double operateTwoIntNum(int a, int b); } p ...
- Java Socket长连接示例代码
SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...
- 从JAVA客户端访问Redis示例(入门)
转自:http://blog.csdn.net/kkdelta/article/details/7217761 本文记录了安装Redis和从JAVA端访问Redis的步骤 从http://downlo ...
随机推荐
- wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题
完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考. WeMall-Client/res/layout/wemall_main_ui.xml </RadioGroup&g ...
- 3409: [Usaco2009 Oct]Barn Echoes 牛棚回声
3409: [Usaco2009 Oct]Barn Echoes 牛棚回声 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 57 Solved: 47[ ...
- 1820: [JSOI2010]Express Service 快递服务
1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 847 Solved: 325 ...
- tp框架之对列表的一系列操作及跳转页面(详细步骤)
依旧是在Main控制器里面写类方法,如果想看tp全部的话,可以从前几篇开始看,都是一整个步骤下来的 在控制器中重新写个类 然后再做个shouye.html页面 nation表的数据,将会在shou.h ...
- install g++ on windows
install c++/g++ on windows install c++/g++ on windows link 原文 1. 算是提示吧: Pick the drive and a fol ...
- linux apache添加多站点配置(Ubuntn和Centos)
Linux Apache 多站点配置 Centos 配置方式: 找到 /etc/httpd/conf/http.conf 添加监听端口,eg: Listen 89 虚拟机配置,一个端口对应一个 &l ...
- Web Storage
前面的话 Web存储最初作为HTML5的一部分被定义成API形式,但是后来被剥离出来作为独立的一份标准了.该标准目前还在草案阶段,但其中一部分内容已经被包括IE8在内的所有主流浏览器(可交互地)实现了 ...
- 解决MVC中JsonResult返回 弹出文件下载对话框
设置一下返回类型为HTML TEXT就可以了 JsonResult json = Json(xxx, JsonRequestBehavior.DenyGet); json.ContentType = ...
- java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...
- iOS开发之JSON & XML
1.概述 JSON (1) 作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 (2) 基于JavaScript的一个子集 (3) 易读性略差,编码手写难度大,数据量小 (4) ...