内部类:声明在类的内部的类,也叫嵌套类(Inner Class)。
作用:可以访问外部类的所有属性和方法,内部类通常用于外部类实现辅助功能。换句话说,内部类和外部类联系较为紧密。
为什么使用嵌套类呢?
1.嵌套类对象可以访问创建它的外部类的使用属性和方法。
2.嵌套类通过在其外部类环境内的紧耦合嵌套声明,不为同一包的其他类所见,可以支持更高的封装性。(权限访问:仅在本类中)
3.方便运行时回调。(A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法)
4.嵌套类编写事件时很方便。(应用于GUI)
嵌套类定义的语法:
public class OuterClass{
...
public/protected/private static class NestedClass{
…
}
}
说明:
1.顶级类只能用公共的或默认的权限修饰符。(何为顶级类?外部类吗?当你在其它类的外面声明一个类时,Java就认为该类是一个顶级类。)
2.嵌套类和顶级类的区别在于,嵌套类分为静态类和非静态类两种。
内部类也是外部类成员的一种,与外部类的成员变量、成员方法并列。
/*内部类的使用*/ public class MemberInnerClassTest{ public static void main(String[] args) { Outer outer=new Outer(); outer.test(); outer.accessInner(); //外部类以外创建内部类的对象 Outer.Inner inner=outer.new Inner(); inner.display(); } } class Outer{ private int outer_i=100; private int j=123; public void test(){ System.out.println("Outer:test()"); } public void accessInner(){ //外部类中使用内部类也需要创建出它的对象 Inner inner=new Inner(); inner.display(); } public class Inner{ private int inner_i=100; private int j=789; //内部类中定义的这个属性与外部内的属性同名 public void display(){ //内部类中可直接访问外部类的方法 System.out.println("Inner:outer_i="+outer_i); test(); //内部类可以直接访问内部类的方法 //内部类可以用this来访问自己的成员 System.out.println("Inner:inner_i="+this.inner_i); System.out.println(j); //访问的是内部类中定义的同名成员,因为有个this /*通过“外部类.this.成员名”可以访问内部类中定义的同名成员, 有点不理解,this不是指向自身吗?它是指代当前对象,Outer用this指向内部类的变量j,就近原则*/ System.out.println(Outer.this.j); } } }
this关键字
1.在类的方法定义中使用的this代表使用该方法的对象的引用。
2.当必须指出当前使用方法的对象是谁时要使用this。
3.有时使用this可以处理方法中成员变量和参数重名的情况。
4.this可以看作是一个变量,它的值是当前对象的引用。
public class Leaf{
int i=0;
Leaf(int i){
this.i=i;
//后面的i是参数i,当前对象,this.i中的i是成员变量i
Leaf increament(){
i++;
return this;
//返回自身
}
void print(){
System.out.println("i="+i);
}
public static void main(String[] args) {
Leaf leaf=new Leaf(100);
/*Leaf构造方法中的参数i为100向成员变量中的i赋值;
对象leaf与类Leaf中的参数100指向堆内存中的成员变量i并赋值,
但是好像成员变量应该在栈内存啊??栈内存指向堆内存,引用对象指向本体类?!*/
Leaf.increament().increament().print();
}
}
}
还有特殊的内部类
1.局部内部类
局部内部类是在方法体内声明的类,像是局部变量一样,只在它的代码块内可见。但它可以在运行时访问它所在的方法中的final参数和final局部变量。
2.匿名内部类
匿名内部类是没有声明名称的内部类。
public class OuterClass{
…
new 已存在的类名(){
…
}
}
匿名内部类在声明时就直接创建出对象了,都是某个已存在类或接口的子类或具体的实现类。
3.静态嵌套类
用static修饰的嵌套类被称作为嵌套类。如果一个嵌套类用static修饰就相当于是在外部定义了一个类,即共享,静态嵌套类中可以声明static成员或非成员方法,但只能访问类中的静态成员。