黑马程序员_内部类

来源:互联网 发布:通话变声的软件 编辑:程序博客网 时间:2024/04/29 00:32

------- android培训java培训、期待与您交流! ---------- 

 

           内部类,顾名思义就是在内部的类。它的定义是:一个类的定义放在另一个类的内部,这个类就叫做内部类。你觉得呢。

For instance:

  1. public class First {   
  2. public class Contents{   
  3.     public void f(){   
  4.     System.out.println("In Class First's inner Class Contents method f()");   
  5.     }   
  6. }   
  7.  }  

2-6行定义的就是内部类。

为什么需要内部类?
java内部类有什么好处?为什么需要内部类?
首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
不过你可能要质疑,更改一下方法的不就行了吗?
的确,以此作为设计内部类的理由,实在没有说服力。
真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

那么内部类有什么特性呢?

1 程序中创建外部类对象是并没有创建内部类的对象;
2 内部类对象可以访问其外部类的任何成员
3 内部类对其他外部是不可见的

    内部类是Java语言一个重要的基本特性,在Java开发的许多领域都会经常用到。内部类的定义说简单一点就是将一个类定义在另外一个类的内部。内部类允许你把一些逻辑相关的类组织在一起,控制内部类代码的可视性,它和类的组合是完全不同的概念。内部类主要还有有以下比较关键的特性:

1.  普通的非内部类不能被声明为private或protected,否则就失去了创建该类的意义。但是内部类通常可以被声明为private或protected类型,因为这样可以防止他人对该内部类实现的功能进行修改,达到隐藏实现细节的目的。例如:

class Fruit {

  private class Weight {

private String i;

private Weight(String j) {

  i = j;

}

public String read() {

  return i;

}

}

}

class test {

  public static void main(String[] args) {

Fruit f = new Fruit();

f.Weight w = f.new Weight(); //不能访问private类,如果Weight为protected类型则可以

}

}

2.  在方法或某控制语句(if/for/while等)的作用域内定义内部类,将只能在该范围内调用内部类的方法和成员变量。

3.  匿名内部类是一种特殊的内部类,如果希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。

public class Fruit {

  public Tea cont(final int j) {

return new Tea() {

  private int i = j;

  public int read() {

    return i;

}

}; //注意这里的分号

}

public static void main(String[] args) {

  Fruit f = new Fruit();

  Tea t = f.cont;

}

}

而当方法cont(final int j)中的参数j只是被传递到匿名类中的构造器时,可以不用被声明为final类型,如return new Tea(j)。这里提到了匿名内部类的构造器,那么它是怎么被初始化的呢?

public class Fruit {

  public Tea cont(int j) {

return new Tea(j) {

System.out.println(j);

};

}

}

         还可以这样初始化匿名内部类:

public class Fruit {

  public Tea cont(final int j) {

return new Tea(j) {

  int i;

  // 初始化匿名内部类

  {

  i = j;

  System.out.print(i);

}

};

}

}

         方法cont()可以被称为实例初始化方法,使得匿名内部类通过构造器而被初始化,在实际应用中,我们不能重载实例初始化方法,因为匿名内部类只能有一个构造方法。

           如何?

 

原创粉丝点击