问题
我试图了解Sun如何实现HashMap类的entrySet,keySet和values方法,但我遇到的代码对我来说没有意义.
我从概念上理解这些方法返回的视图直接链接到HashMap中的map.entry列表,并且它们使用自己的迭代器(引用中央HashMap迭代器)来完成大部分工作.我的问题在于理解这些视图究竟是如何被实例化的(因为它们不是副本,而是位于实际HashMap列表之上的东西).
参考
我正在查看本网站上的源代码:http://developer.classpath.org/doc/java/util/HashMap-source.html
这是给我带来麻烦的一个片段:
157: private transient Set<Map.Entry<K, V>> entries;
594: public Set<Map.Entry<K, V>> entrySet()
595: {
596: if (entries == null)
597: // Create an AbstractSet with custom implementations of those methods
598: // that can be overridden easily and efficiently.
599: entries = new AbstractSet<Map.Entry<K, V>>()
600: {
601: public int size()
602: {
603: return size;
604: }
605:
606: public Iterator<Map.Entry<K, V>> iterator()
607: {
608: // Cannot create the iterator …
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
public class Bar {}
public class FooBar {}
public class Foo {
public void method() {
new Bar() {
void otherMethod() { }
void barMethod() {
new FooBar() {
void fooBarMethod() {
Bar.this.otherMethod(); // not compiles
}
};
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
所以我有一个匿名内部类,其中有另一个匿名内部类.问题:有没有办法Bar
从内部内部类访问外部内部类的方法FooBar
?
abstract class Person {
abstract void eat();
}
class TestAnonymousInner {
public static void main(String args[]){
Person p=new Person() {
void eat(){System.out.println("nice fruits");}
};
p.eat();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成的内部类
static class TestAnonymousInner$1 extends Person
{
TestAnonymousInner$1(){}
void eat()
{
System.out.println("nice fruits");
}
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器将匿名类创建为静态?如果它是非静态会发生什么?
我举一个例子来设置一些上下文,所以我有两个接口,每个接口继承相同的父接口并定义它们自己的父接口的抽象方法的实现.
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在一个名为的接口中D
,该实现创建了一个匿名内部类,然后需要调用超类型(B
和C
)a()
实现.
interface D extends B, C
{
@Override
default Set a()
{
return new HashSet()
{
{
final int totalSize = D.this.B.super.a().size() + D.this.C.super.a().size();
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
问题是表达式D.this.B.super.a()
并D.this.C.super.a()
没有成功编译,所以是什么?
谢谢你的努力.
我有这个代码:
public class Home extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
//at some point I have
s.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
ContextNotionLevel ctnl=new ContextNotionLevel(this);
// <-- how can I reference Home class here to replace **this**, which as it is points to OnSeekBarChangeListener
}
}
}
Run Code Online (Sandbox Code Playgroud) 以下面的例子为例.有一个我想要使用的对象,称之为Doodad
.Doodad
元素处理浏览器事件的能力很差.a的典型实例化Doodad
将是Doodad someDoodad = new Doodad();
.显然,由于事件处理不当,这不符合我的需要.我是否适合覆盖该onBrowserEvent()
方法,如下所示:
Doodad someDoodad = new Doodad() {
@Override
public void onBrowserEvent(Event event) {
switch (DOM.eventGetType(event)) {
case Event.ONDBLCLICK:
case Event.ONFOCUS:
case Event.ONCLICK:
if (!isEnabled()) {
return;
}
break;
}
super.onBrowserEvent(event);
}
};
Run Code Online (Sandbox Code Playgroud)
显然,这是一个简单的例子,但我当可能不希望使用匿名内部类?这是明确禁止还是不可能?
我看到第一个问题有很多答案,但到目前为止,答案都没有回答第二个问题:是否明确禁止或不可能使用匿名内部类?
我以为我很清楚自己在做什么,但每当我觉得自己能够很好地掌握某些东西时,我就证明错了:)
有问题的代码就是这个
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mButton = (Button)findViewById(R.id.m_button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的困惑在于new Intent()
和startActivity
方法.
我假设只要我们在匿名课程View.OnClickListener
中工作,我就必须做类似的事情
MainActivity.this.startActivity(intent);
当我不在匿名课堂内时,我可以做到
new Intent(this,SecondActivity.class);
有人可以解释为什么我能够调用该startActivity();
方法,但不能只this
在intent参数中使用?
我遇到了以下java代码,我不确定它是什么意思.我们可以在实例化一个类之后在'{'中编写代码,例如新的TestClass {*/code goes here*/}
但是当我尝试运行代码时,我没有在输出中看到"Z是10".有人可以给我一些链接,我可以得到一些与java的这个功能相关的更多信息.
class TestClass {
int z;
public TestClass(){
z=10;
}
public int getZ(){
return z;
}
public void setZ(int z){
this.z=z;
}
}
class A
{
public static void main (String[] args) throws java.lang.Exception
{
TestClass TC = new TestClass() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
}
}
Run Code Online (Sandbox Code Playgroud) 所以我通过创建了一个匿名的内部类
obj.addMouseListener(new MouseListener()
Run Code Online (Sandbox Code Playgroud)
但是因为它给了我一个错误(它希望我实现至少4个方法,如mouseReleased,mouseClicked等等.因为我假设类没有正确扩展/实现MouseListener,我偶然发现了另一篇SO文章(怎么能一个匿名类使用"extends"或"implements"?)我明白匿名内部类总是扩展/实现一个超类(对吧?).所以我继续搜索答案,偶然发现另一篇SO文章(我有麻烦选择何时使用MouseListener对象)这与我的问题没有关系,但我看到线程的所有者写了这些代码行
@Override public void mouseExited(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
@Override public void mousePressed(MouseEvent e) {}
Run Code Online (Sandbox Code Playgroud)
这是我一直缺少的吗?我已经尝试立即@override整个类,但这只是给了我另一个错误.我可以看到这将如何解决问题,但它对我来说看起来非常混乱.
它基本上归结为2个问题; 是我刚刚编写/发现的真实,这是解决我的问题的方法,如果这是解决方案,还有另一种(更清洁的)解决方案吗?
我已经看过很多次,但是我有点困惑这是否会被称为匿名类?
public class Test {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("##");
}
}.start();
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑的原因是因为匿名类没有名称,但是这显然我们已经在Java API中有一个"Thread"类,所以这意味着它有一个名称,如果它有一个名称,那么它是如何匿名的如果它不是一个匿名类,那么它是什么.
我知道这有点愚蠢,但我无法推理自己的确定性 - 因为我看到双方都有有效的论据.
另外,在上面我可以清楚地覆盖类的run
方法Thread
,现在如果我创建自己的类,让我们说MyClass
,在其中定义一些方法,然后尝试做同样的事情,然后为什么我不能覆盖方法MyClass
,他们的方式我能够覆盖类的run
方法Thread
.
public class MyClass {
private void myMethod1() {
}
private void myMethod2() {
}
}
public class Test {
public static void main(String[] args) {
new MyClass(){
// why I cannot override "myMethod1" and "myMethod1" of `MyClass`, they way …
Run Code Online (Sandbox Code Playgroud)