java内部类

来源:互联网 发布:淘宝店认证步骤如下 编辑:程序博客网 时间:2024/06/16 12:27

//内部类分为:静态内部类,成员内部类,局部内部类,匿名内部类

内部类的特征:

可以被定义在方法中,他可以访问外部类的final变量

可以被定义为abstract抽象类

可以作为一个接口,由另一个内部类去实现

非静态内部类不能声明任何static成员
//静态内部类(Static Nested Class)和内部类(Inner Class)有什么不同?
// Static Nested Class是被声明为静态的内部类,它可以不依赖于外部类实例被实例化
//而通常的内部类需要再外部类实例化后才能被实例化
/*//在类中创建一个内部类,内部类Talk可以直接调用外部类Outer中的name属性
class Outer{
 String name ="在类中创建一个内部类";
 void print(){
  Talk t = new Talk();
  t.talk();
 }
//创建内部类
 public class Talk{
  void talk(){
   System.out.println(name);
  }
 }
}
public class OuterClassTest {
 public static void main(String[] args) {
  Outer o = new Outer();
  o.print();//输出:在类中创建一个内部类
 }

}*/
//在方法中定义的内部类只能访问方法中final类型的局部变量
class User{
 String name="yoyo"; 
 void User(final String name){
  final int score = 98;
  class Inner{
   void print(){
    System.out.println(name + " score= "+score);
   }
  }
  Inner in = new Inner();
  in.print();
 }
}
public class InnerWaysTest{
 public static void main(String[] args){
  User s = new User();
  s.User("hoho");//输出: hoho score= 98
 }
}

 

 

匿名内部类

怎样判断java匿名类
悬赏分:20 - 解决时间:2009-11-19 02:54
怎样判断一个匿名类的存在啊?

看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。。。

不知道你们看懂我的疑问没。。。。
最佳答案
先看段伪代码

abstract class Father(){

....

}



public class Test{

Father f1 = new Father(){ .... } //这里就是有个匿名内部类

}

一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。

但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。

因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。

上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。

其实拆分上面的匿名内部类可为

class SonOne extends Father{

... //这里的代码和上面匿名内部类,大括号中的代码是一样的

}

public class Test{

Father f1 = new SonOne() ;

}


我得问题是,Comparator不是一个接口,为什么程序中还有这样的语句:
Comparator OrderIsdn = new Comparator(){
public int compare(Object o1, Object o2){
BookType b1=(BookType)o1;
BookType b2=(BookType)o2;
return (b1.getIdsn().hashCode()-b2.getIdsn().hashCode());
}
};

我觉得楼上说的和楼主想问的不是一个概念,楼主是知道怎么new一个已经实现了接口的类的,只是不太明白为什么能够直接new一个接口。

我给你个通俗易懂的解释,其实这一句:
Comparator OrderIsdn = new Comparator(){

相当于(不是标准语法,只是说明原理,帮助理解):
Comparator OrderIsdn = new (MyComp implements Comparator)(){

只是由于是匿名类没有名字,所以就变成你看到的那样了。

实际上,你问的这种写法是java的标准写法,它的意义是我将要实现这个接口并且由这个实现创建一个对象。注意并不是直接实例化接口(虽然看起来像),而是先实现(后面的一对大括号中的代码)再实例化。
我知道这是匿名类,但是接口可以通过new实例化吗?
原创粉丝点击