内部类分为四种:
1.一般内部类
2.方法内部类
3.静态内部类
参见代码:
package practice;
/**
* Created by fangjiejie on 2016/11/26.
*/
public class InnerCla { //为什么要把a定义为final呢?
/********方法内部类********/
void go(final String a){//该方法会跟随类一起被释放
class In{//此类不会随着go方法的结束而变成垃圾
// 类都是在变量的后面被释放掉的
void bark(){
System.out.println(a);//想要在方法内部类中调用局部变量,只能将该变量声明为常量,使该常量跟随类一起被释放
}
}
}
/*******一般内部类********/
class In{
void go1(){
System.out.println("In go~");
}
}
/*******静态内部类*********/
static class staC{
void go2(){
System.out.println(" staC go~");
}
}
class D1{//多层嵌套内部类调用方法
void d1(){
class D2{
void bark(){
System.out.println("我想被输出~");
}
}
new D2().bark();//在内部类的同级位置实例化 来实现对方法的调用
}
}
void go2(){
new D1().d1();
}
}
class tes{
static class AA{
static void Am(){
System.out.println("Am go~");
}
}
public static void main(String[] args) {//静态类才可以不用实例化直接调用
InnerCla.In h=new InnerCla().new In();//两个类都要进行实例化
h.go1();
InnerCla.staC h1=new InnerCla.staC();//静态内部类不需要实例化
h1.go2();
AA.Am();//静态类中的静态方法可以直接调用无需实例化
InnerCla h2=new InnerCla();//调用嵌套内部类方法的方案一
h2.go2();
new InnerCla().new D1().d1();//方案二
}
}
4.匿名内部类
使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口
我们需要在什么情况下使用内部类呢?
1.只用到一个类的实例
2.类在定义后马上用到
3.类非常小
4.给类命名并不容易导致你的代码容易理解
使用匿名内部类要注意什么问题呢?
1.匿名内部类没有构造方法
2.匿名内部类不能定义任何静态成员。静态方法和静态类
3.匿名内部类不能是public protected private static
4.只能创建匿名内部类的一个实例
参见代码:
package practice;
/**
* Created by fangjiejie on 2016/11/27.
*/
public class CC {
public static void main(String[] args) {
/********实例化匿名内部类********/
new C(){//匿名内部类的名字由JDK控制
public void go(){
System.out.println("C go~");
}
}.go();
C h=new C(){//如果自己命名 可用多次
public void go(){
System.out.println("C go~");
}
};
h.go();
/*******匿名内部类作形参*******/
test(new C(){//匿名内部类作形参
@Override
public void go() {
System.out.println(" CC---- C go~");
}
},"我是第二个普通形参");
/*******返回值匿名内部类******/
new CC().back().go();
}
static void test(C c,String c1){//用test方法来测试形参为匿名内部类
c.go();//调用当前匿名内部类的go 方法
System.out.println(c1);
}
//做形参的要求:1.符合多态特性 2.符合自动转换 3.等效
C back(){//返回值为匿名内部类
return new C(){
@Override
public void go() {
System.out.println("bark go~");
}
};
}
}
interface C{
void go();
}