请问JAVA中匿名内部类有啥用,举个例子,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问JAVA中匿名内部类有啥用,举个例子,谢谢相关的知识,希望对你有一定的参考价值。
匿名内部类的特点:1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不需要知道其实际类型。
3,类名没有意义,也就是不需要使用到。
public class Outer
private static int i = 1;
private int j = 10;
public static void outer_f1()
public void outer_f2()
// 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
static class Inner
static int inner_i = 100;
int inner_j = 200;
static void inner_f1()
System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
void inner_f2()
// System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员
// outer_f2();//包括非静态变量和非静态方法
public void outer_f3()
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
public static void main(String[] args)
new Outer().outer_f3();
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。 参考技术A 内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。内部类可以访问外部类的属性和方法。你可以把内部类看作"方法"一样,在使用的时候调用执行。你也可以把内部类看作"属性"一样,在构造内部类对象的时候,也会在堆里为内部类的属性分配存储空间。所以内部类也有类似像修饰属性,方法那样的修饰符,比如:public,private,static 等等。当一个类没有用static 关键字修饰的时候,这个内部类就叫做成员类,类似属性,方法,作为类的成员。 内部类的特点总结:
两个或两个以上的类逻辑上紧密相连的时候,我们可以考虑使用内部类。如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。 参考技术B public class ExamFrame extends JFrame
public ExamFrame()
init();
public ExamFrame(ClientContext context)
this();
this.context = context;
public void init()
setSize(600, 500);
setTitle("在线评测");
setContentPane(createContentPane());
//这里就使用了匿名内部类
addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
context.exit(ExamFrame.this, "是否离开!");
);
匿名内部类其实也是类的一种,它的使用是减少资源占用的一种方法,他减少了对象的生成,在完成相应功能后会被Java垃圾回收机制直接回收减少内存资源的占用提高系统执行效率,同时使用比较简单,一般情况下,匿名类常用在线程上也就是Thread的声明上. 参考技术C import java.util.Arrays;
import java.util.Comparator;
public class AnnInnerClassDemo
public static void main(String[] args)
Xoo xoo = new Xoo()
public int getA()
return 2;
;//匿名类, 匿名内部类
System.out.println(xoo); //"2"
Yoo yoo = new Yoo()
public int getNum()
return 88;
;
System.out.println(yoo.getNum());//88
CharSequence cs = new CharSequence()
public int length()
return 10;
public char charAt(int index)
return 'A';
public CharSequence subSequence(
int start, int end)
return null;
;
StringBuilder str = new StringBuilder(cs);
System.out.println(str);
String[] strs = "abcff", "abc", "acde", "a";
Arrays.sort(strs, new Comparator()
public int compare(Object o1, Object o2)
String s1 = (String)o1;
String s2 = (String)o2;
return s1.length() - s2.length();
);
System.out.println(Arrays.toString(strs));
interface Yoo
int getNum();
class Xoo
public int getA()
return 1;
public String toString()
return Integer.toString(getA());
匿名内部类,匿名类:非常常见,可以写在任何地方,就行一般的语句。
语法更象是创建对象:
Date d = new Date();
匿名类是对原类的一个继承,同时创建了实例, 就是继承
以后的类体。类体中可使用所有类的语法。
匿名类不能写构造器。
匿名类可以从抽象类或者接口继承,
必须提供抽象方法的实现。
可以通过反射类访问的公共,私有,受保护类有啥用? [复制]
【中文标题】可以通过反射类访问的公共,私有,受保护类有啥用? [复制]【英文标题】:what is the use of public, private, protected class where it can be access via reflection class? [duplicate]可以通过反射类访问的公共,私有,受保护类有什么用? [复制] 【发布时间】:2014-09-14 04:35:36 【问题描述】:出于安全目的和封装我们有 Public,Private, Protected
类的东西,但一个问题仍然在脑海中浮现,如果我们仍然可以访问或知道这些类的所有成员,这意味着什么是Public, Private
还是Protected
??
例如:
<?php
class GrandPas // The Grandfather's class
public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier
protected $name2 = 'John ***'; // This grandpa is mapped to a protected modifier
private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier
#Scenario: Using reflection
$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)
echo "Printing members the 'reflect' way..<br>";
foreach($granpaNames as $k=>$v)
echo "The name of grandpa is $v and he resides in the variable $k<br>";
输出将是:
#Scenario Using reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John *** and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3
我们可以看到该类的所有成员是否为Private, Protected or Public
。那么这里的OOP是什么概念呢?
PS:示例来自 Shankar Damodaran。
【问题讨论】:
“反射通常用作软件测试的一部分,例如用于模拟对象的运行时创建/实例化。”来自wikipedia。 设计以后肯定会通过反射使用的类不是一种设计方式。您出于自己的应用程序的目的对类使用反射,例如一套测试服,而不是相反。 您说它们是出于“安全目的”,但事实并非如此。访问说明符旨在防止您在意外中做一些愚蠢的事情,而不是针对坚定的攻击者提供任何安全措施。 我需要同意@WaleedKhan ...任何可以实例化你的类的人,已经有了它的源代码并知道它的属性 为了好的设计、好看的代码和以后的重用。使用公共是不好的。想象一下,您的班级中有public $x
。稍后在您的应用程序中执行echo $yourClassObject->x
。稍后你去这个班,把$x
改成$y
。那么,回声不起作用。这就是为什么例如引入访问器并将字段设置为私有是更好的做法的原因
【参考方案1】:
TL;DR;
如果你可以做某事 - 这并不意味着你应该去做
反思
这是旨在提供有关实体的元信息的东西,但它的实际用例是有争议的,而且几乎总是可以用某些东西代替。重点不是说它不好,而是说——如果你想在你的架构中使用它,那么你可能有一个缺陷。
一种“去”的方式..
实际上,您可以在 PHP 中访问受保护/私有属性,而无需使用 Reflection
。例如,Closure::bindTo()
喜欢:
class Test
private $x = 'foo';
$z = new Test();
$y = function()
return $this->x;
;
$y = $y->bindTo($z, $z);
echo $y(); //foo
然后.. 那又怎样?每种语言功能都可能用于好或坏。我们称其为“良好实践”和“不良实践”(老实说,我很难记住 PHP 中 global
之类的“良好实践”,但这不在这个问题范围内)。此外,在 PHP 中,您可能会以错误的方式使用很多东西 - 这使得它成为 困难 语言 - 从某种意义上说,学习该语言并不难,但很难全部使用它的功能正确,因为这需要扎实的架构和良好实践知识。
您可能会想像一种访问隐藏属性的方法,甚至可以使用 var_dump()
+ ob_
函数之类的功能 - 但这只会说明使用某些不错的功能可能会有多么可怕。
以及如何处理
不要以这种方式使用Reflection
。在构建架构时当然不要指望这一点。这不是它应该被使用的东西。如果你想从外部访问你的属性——那么——很好,将它们声明为public
。
只要正确使用东西。这是唯一的出路。如果你不知道什么是正确的用法 - 然后学习。这是我们一直在做的事情。每天。
【讨论】:
非常感谢您在这里解决了我的疑问,真是一个很好的例子。【参考方案2】:public
、protected
和 private
令牌旨在为属性定义可见性,而不是以任何方式提供安全性。
可见性用于区分:
-
您的公共界面,
暴露给类扩展的接口,或者,
内部状态。
反射主要是为了帮助提供诸如 AOP、DIC、代理等好东西;具体来说,它并不是黑客的工具。使用您的代码的人可以简单地阅读它以获得他们想要的东西,不,为了他们自己的“邪恶”目的而对其进行编辑。
【讨论】:
那么在主要用于安全目的的OOP概念中,有一个关于public
private
或protected
的误解。
@SudhanshuSaxena 我很想知道哪篇文章提到了这样的事情;他们显然在提倡错误的想法:)
此外,许多文档生成器提供了隐藏私有字段和方法的选项。这对于制作只有 public
方法字段和类的公共 API 文档很有用。
@janek2012 对,这也是可见性如何有用的一个例子:)
我还要补充一点,反射用于 DI 容器实现(用于分析类的构造函数),它不依赖于配置。以上是关于请问JAVA中匿名内部类有啥用,举个例子,谢谢的主要内容,如果未能解决你的问题,请参考以下文章
Java语言中四种内部类(成员内部类,局部内部类,静态内部类,匿名内部类)在实际使用中有啥好处?