内部类:
总的来说内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类 成员之间可以相互访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。
内部类分为非静态内部类、静态内部类、匿名内部类。
1.非静态内部类
可以任意设置访问控制。如private,protected、public和默认。
非静态内部类里面不能有静态方法、静态属性、静态初始化块。
根据静态成员不能访问非静态成员的原则,外部类的静态方法、静态代码块都不能访问非静态内部类。
2.静态内部类(类内部类)
属于外部类本身。
静态内部类可以包含静态成员,也可以包含非静态成员。
静态内部类不能访问内部类的实例成员,只能访问外部类的非实例成员(static)。
外部类的成员可以通过内部类实例.内部类成员访问内部类成员。(包括属性、方法)
例:
private static class BinaryNode<AnyType>{
AnyType element;
BinaryNode<AnyType> left;
BinaryNode<AnyType> right;
BinaryNode(AnyType element){
this(element,null,null);
}
BinaryNode(AnyType element,BinaryNode<AnyType> left,BinaryNode<AnyType> right) {
this.element = element;
this.left = left;
this.right = right;
}
}
//是否包含该元素
public boolean contains(AnyType x){
return contains(x,root);
}
private boolean contains (AnyType x, BinaryNode<AnyType> t){
if(t==null)
return false;
int compareResult = myCompare(x,t.element);
if(compareResult<0)
return contains(x, t.left);
else if(compareResult>0)
return contains(x,t.right);
else
return true;
}
使用内部类:
1.在外部类使用内部类
禁止在外部类的静态成员中使用非静态内部类。
在外部类使用非静态内部类的方法:
package Test;
public class OutTest{
class Test{
Test(){
System.out.println("test");
}
public void info() {
System.out.println("info");
}
}
public void test(){
Test tt = new Test();
tt.info();
}
public static void main(String[] args) {
new OutTest().test();
}
}
静态类使用方法与平时类使用方法类似。2.在外部类以外使用非静态内部类
语法:Out.In in = new Out.new In();
3.在外部类以外使用静态内部类
语法:StaticOut.StaticIn in = new StaticOut.StaticIn();