什么是匿名内部类是什么意思解决办法

博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)已解决问题
内部类可以引用他包含类的成员吗?有没有什么限制?
浏览次数:912
用手机阿里扫一扫
最满意答案
一个内部类对象可以访问创建它的外部类对象的内容
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is okjava外部类怎样调用内部类方法?_百度知道
java外部类怎样调用内部类方法?
public class Lei{
public static void main(String ages[]){
Leis x=new Leis();
public class Leis{
public Leis(){
System.out.println(&asd&);
上面是我的方法。但不知道错...
我有更好的答案
public class Lei{ public static void main(String ages[]){ Leis x=new Leis();
} public static class Leis{ public Leis(){ System.out.println(&asd&); } } } 主函数调用的是静态方法,内部类要定义为static,Leis()为构造方法,用来初始化成员变量,不能用“x.Leis()”
采纳率:26%
你这里面有两个错:1、Leis内部类是非静态类,不能在静态方法里初始化,即第三行Leis x=new Leis();报错,可以把Leis类改成静态类,即public static class Leis{......} 2、Leis()是Leis类的构造函数,不能在第4行x.Leis()显示调用一句话:静态方法里不能访问非静态内部类。但你可以在外部类的一个成员方法里访问非静态内部类,然后你再在静态方法里初始化外部类,通过外部类来访问非静态内部类。
为您推荐:
其他类似问题
您可能关注的内容
java的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Java内部类的异常处理 - 简书
Java内部类的异常处理
最近遇到一个问题,使用Java写某个DSL标记语言X的parser(解析器)Maven插件的时候,对外暴露一个名为Callback的接口和一个待实现的方法getHTML()——基于调用处传入的文件名srcX构造出HTML文件的输出路径(其实此处的Callback就是一个闭包,文件名是一个自由变量)。大致代码如下:
parser.parse(srcX, new Callback() {
public FileWriter getHTML() {
return new FileWriter(outputPath(suffix(srcX, "html")));
private String suffix(String filename, String suffix) {
return Joiner.on(".").join(filename, suffix);
//这里假设输入和输出根路径地址已知
private File outputPath(String file) {
return new File(
file.replace(srcDir.getAbsolutePath(), //srcDir: File
outputDir.getAbsolutePath())); //outputDir: File
目前为止还没有任何问题。但若是运行时,这段程序很可能抛出异常java.io.FileNotFoundException: your-file-name (No such file or directory)。原因在于file的路径当中可能存在多级父级目录,例如:outputDir/p1/p2/srcX.html,那么当FileWriter尝试创建srcX.html就会失败。此时最简单的方法就是提前创建好所有的父级目录,于是outputPath()方法会变成下面这样:
private File outputPath(String file) {
File outputFile = new File(
file.replace(srcDir.getAbsolutePath(),
outputDir.getAbsolutePath()));
outputFile.getParentFile().mkdirs(); //创建可能不存在的父级目录
return outputF
似乎这段程序可以正常工作了,但是创建文件夹这样的操作是可能失败的。所以我们需要关注是否创建成功,若失败,则写入Log文件当中。修改程序如下:
private File outputPath(String file) {
File outputFile = new File(
file.replace(srcDir.getAbsolutePath(),
outputDir.getAbsolutePath()));
final File parentDirs = outputFile.getParentFile();
if (!parentDirs.exists()) {
if (!parentDirs.mkdirs()) {//创建可能不存在的父级目录
getLog().error("Cannot create parent dirs for {}", outputFile);
return outputF
这里我们需要先判断父级目录是否存在,即parentDirs.exists()?可是parentDirs.mkdirs()不是直接返回boolean值来表示是否创建成功吗?是这样么?这儿有mkdirs()方法的说明:
public boolean mkdirs()
Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories.
true if and only if the directory was created, along with all necessar false otherwise
也就是说只有当这个目录及其所有的父级目录都被创建时,才返回true,反之返回false。照这个推论,如果所有目录事先已经存在了,这个方法应该也会返回true,毕竟都被创建过了嘛。但是只要稍微看一眼源码,你就会发现事实并非如此:
//mkdirs源码
if (exists()) {
所以这里需要特别强调was created是一种操作,如果没有进行这个操作,那就不能算这个方法成功。
前面已经提到过,我需要写一个maven的插件,所以最好在这种导致程序崩溃的地方抛出一个maven中通用的异常MojoExecutionException。这样,更改代码如下:
private File outputPath(String file) {
File outputFile = new File(
file.replace(srcDir.getAbsolutePath(),
outputDir.getAbsolutePath()));
final File parentDirs = outputFile.getParentFile();
if (!parentDirs.exists()) {
if (!parentDirs.mkdirs()) {//创建可能不存在的父级目录
getLog().error("Cannot create parent dirs for {}", outputFile);
throw new MojoExecutionException("Cannot create parent dirs");
return outputF
此时,问题才显出端倪——异常MojoExecutionException是一个受检的异常(checked Exception),它间接继承自java.lang.Exception。可是我们的getHTML()方法并没有在签名中抛出任何异常,编译无法通过。那唯一的办法就是try...catch了,但是我不应该捕获自己刚刚抛出来的异常,否则抛出受检异常的意义何在?
这时,自然而然会想到,将方法签名改成getHTML() throws MojoExecutionException。确实可行,但是并不合适,因为MojoExecutionException只是Maven插件规定的异常,而getHTML()则是一个对外暴露的API,不应该依赖于某个具体的异常。所以我将异常扩大化:getHTML() throws Exception,这样做的好处很明显,坏处也很显眼。
牢记《Unix编程艺术》中的“宽收严发”原则。即子类实现父类、接口的方法,入参可以扩大,出参可以缩小。举个例子:父类、接口有个方法
public Object something(HashMap map) throws Exception
那么子类实现这个方法可以这样写
public String something(Map map)
throws ExecutionException, NoSuchMethodException
这里,入参是HashMap,出参是Object和Exception。入参扩大,所以子类出现了Map;出参缩小,所以子类出现了String和ExecutionException和NoSuchMethodException。同理,此处getHTML() throws Exception由子类实现的形式可以是getHTML() throws MojoExecutionException。
不管getHTML()是否需要抛出异常,你都得在实现代码中抛出异常;
由于对外表现的是抛出较宽泛的Exception,所以丧失了对于具体受检 (checked exception)异常进行检查的好处。
这里有个JDK中比较类似的例子,就是关于Runnable和Callable接口的设计问题:
public interface Runnable {
public void run();
public interface Callable&V& {
V call() throws E
它们就是两个极端,Runnable必须将受检的异常转换成非受检(unchecked exception)或者发明一种方式来将异常暴露给调用者;Callable就是无论如何都得抛出异常,而且迫使用户去捕获一个较宽泛的异常。
这个时候,泛型就派上用场了。
interface Callback&E extends Exception& {
FileWriter getHTML() throws E;
//interface parser
public &E extends Exception& void parse(String srcX, Callback&E& cb) throws E;
通过这种方式,我们可以捕获具体的异常:
parser.parse(srcX, new Callback&MojoExecutionException&() {
public FileWriter getHTML() throws MojoExecutionException {
return new FileWriter(outputPath(suffix(srcX, "html")));
} catch (MojoExecutionException e) {
getLog().error("Failed to execute. {}", e);
使用lambda表达式可以简化成下面的模样:
parser.parse(srcX, (Callback&MojoExecutionException&) () -& new FileWriter(outputPath(suffix(srcX, "html"))));
} catch (MojoExecutionException e) {
getLog().error("Failed to execute. {}", e);
我们解决了迫使用户去捕获一个较宽泛的异常的问题,但是无论如何都得抛出异常这个问题还是没有得到解决。或许我们需要一个像是throws Nothing一样的语法,表示什么也没有抛出来。我们知道RuntimeException是非受检的异常(unchecked exception),所以throws RuntimeException就表明这个异常跟没有抛出异常一样,不需要捕获。如下:
parser.parse(srcX, new Callback&Nothing&() {
public FileWriter getHTML() throws Nothing {
return new FileWriter(outputPath(suffix(srcX, "html")));
public abstract class Nothing extends RuntimeException {}
走到这一步,我们算是较为完全地解决了匿名内部类的异常处理问题。
异常透明化
With the throws type parameter on the Block interface, we can now accurately generify over the set of exceptions thrown by the B with the generic forEach method, we can mirror the exception behavior of the block in forEach(). This is called exception transparency because now the exception behavior of forEach can match the exception behavior of its block argument. Exception transparency simplifies the construction of library classes that implement idioms like internal iteration of data structures, because it is common that methods that accept function-valued arguments will invoke those functions, meaning that the library method will throw a superset of the exceptions thrown by its function-valued arguments.
interface Block&T, throws E& {
public void invoke(T element) throws E;
interface NewCollection&T& {
public&throws E& forEach(Block&T, throws E& block) throws E;
异常透明化,简单来讲,就是调用者的签名中的异常完全由它的函数值(function-valued)的参数决定,所有这些调用者最终的异常都会是该函数值所注异常的超集。
异常透明化就是用来解决我们常用的通过内部类模拟闭包调用时异常处理的手法了。
闭包的定义
一个包含了自由变量的开发表达式,和该自由变量的约束环境组合之后,产生了一种封闭的状态。
鄢倩 (lambeta), ThoughtWorks 软件开发工程师。执着对等、分散、开放、透明、共享的互联网精神。独立技术分析。
通俗编程——白话JAVA异常机制 - 代码之道,编程之法 - 博客频道 - CSDN.NEThttp://blog.csdn.net/dd/article/details/任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql.Connection conn ...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
转载自 作者:代码钢琴家www.cnblogs.com/lulipro/p/7504267.html 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:...
那一年我十七岁,在匆匆而过的青春里,留下了一道道伤痕。这时的我们,已经失去了年少时的勇气,却也渐渐的明白,那份曾被尘封的感情,始终陪伴在身边,时间终会告诉我们,有那么一个人会让你在心底,重新长出爱情。 由刘诗诗、郑恺联袂主演的电视剧《那年青春我们正好》即将于...
昨天是雲夏的姐姐kasia的生日,我们一起去了柏林的一家非洲餐馆。Kasia是一个超级搞笑的人,她自己认真的讲她生命中的事,都能把人逗死。我们在电台里录了一个关于她的故事,当然,她的故事不止这一个,我们可以做成一个系列的。今天还说到雲夏刚过完九十岁生日的外婆,她在二战前后也...
在大学里过得如何充实其实主要是看你自己的想法,你可以每天泡图书馆好好看书也可以当个文艺青年写写诗歌弹弹琴,谈个恋爱也是收获颇丰,或者是为了充实而作一些不想做的事...... 其结果得看你自己的想法,如果你喜欢融入学生会,那对你来说就是充实的,但是我觉得如果刚进入大学或者大二...
“桑子,门口有人找,帅哥呦~” 桑子用圆珠笔戳着下巴眨眨眼,抬头,皱眉,想想自己并不曾认识什么异性的朋友,但是小莲这样“阅人无数”的“花花姑娘”都称之为帅哥的人,那必然要出去看看的,哪怕是找错人呢?这样想着,桑子就往教室门口走去,教室门口果然没看到人,想着肯定是小莲在耍她,...

我要回帖

更多关于 匿名内部类是什么意思 的文章

 

随机推荐