内部类
内部类: 定义在一个类里面的类称为内部类,在一个类中可以定义一个或者多个内部类
例如: 在A类中定义了 二个类 一个 B类和C类
A-->外部类 B、C -->内部类
内部类对其封装类(外部类)的成员有访问权限
在外部类中可以定义普通类或者静态内部类
Class Outer{ Class Inner1{ }
Class Inner2{ }
Static Class Inner3{ }
} |
在在非静态的内部类中只能存在非静态的方法,不能存在静态方法.
在非静态方法中能够直接访问外部类的属性,包括 私有的 、受保护类型的。
package com.ibm.inner;
public class Outer { private Stringname; public int i; protectedfloatf;
//Inner就是内部类 class Inner{ //在内部类的非静态方法中可以直接访问外部类的属性 public void show(){ name="admin"; i=10; f=12.5f; }
//在内部类的静态方法中呢?能不能访问外部类的属性? // public static void show2(){ // // } }
} |
在一个外部类中定义一个静态的内部类
在静态内部类中可以有普通方法也可以有静态方法
//静态内部类 static class Inner2{ public void show3(){
}
public static void show4(){
} } |
在静态内部类中访问外部类的属性?
在静态内部类中不可以访问非静态的属性,反之,在静态内部类中可以直接访问外部类中静态属性。
static class Inner2{ public void show3(){ // name="admin"; pass="123"; }
public static void show4(){ pass="456"; } } |
如果外部类中有普通方法或者静态方法,那么在内部类中该怎么调用方法。在内部类中调外部类的方法。
在内部类的非静态方法中可以直接调用外部类的非静态方法。
在内部类的非静态方法中可以直接调用外部类的静态方法
在静态内部类中不管是静态方法还是非静态方法都不能直接调用外部类的非静态方法。
实例化内部类的二种方法:
1创建非静态的内部类的对象:
创建内部类的对象就是为了调用内部类中的属性或者方法
创建非静态的内部类的对象:
外部类.内部类 对象名=new 外部类构造器.new 内部类构造器; |
或者
外部类 外部类对象名=new 外部类构造器; 外部类.内部类 内部类对象名=new 外部类对象名.new 内部类构造器; |
public staticvoid main(String[] args) { //创建非静态的内部类的对象 Outer.Inner oi=new Outer().new Inner();
Outer outer=new Outer(); Outer.Inner oi2=outer.new Inner(); } |
如果创建的是一个静态内部类的对象:
外部类.内部类 内部类对象名=new 外部类名.内部类构造器; |
//创建静态内部类的对象 Outer.Inner2 oi3=new Outer.Inner2(); |
Inner类也可以定义在方法的内部。方法中final类型的局部变量,都可以被Inner类的方法访问。
public void show4(){ final String CW="ADMIN"; intk=12; //将一个类定义在一个方法里面 classInnerMethod{ public void show5(){ System.out.println(CW); // System.out.println(k);//如果不用final修饰,是不能够访问的 } } } |
内部类的特征:
1 Innerclass可以声明为抽象类 ,因此可以被其它的内部类继承。也可以声明为final的。
//创建一个抽象的内部类 abstract class Inner3{ abstract void show6(); }
//创建一个普通类来继承Inner3 class Inner4extends Inner3{
@Override void show6() {
}
}
//创建一个最终类 final class Inner5{ //最终类不能够被继承 }
// class Inner6 extends Inner5{ // // } |
2 内部类可以声明为private 或者protected,那么其他类不能直接访问内部类,要想访问就必须通过外部类类访问内部类
private class Inner6{
} protected class Inner7{
} |
3 Inner class 可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量
如果一个内部类声明为静态的,那么此时这个内部类就只能访问外部类中静态的属性,非静态的属性则访问不到。
4 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员
在非静态的内部类中不能定义静态的属性或者静态的方法。
小结:
内部类是定义在一个类中的类,如果你想讲某一个类中的信息不让其他类直接访问,只让某一个类直接访问,那么此时你就可以将此类定义成一个内部类。
定义一个内部类可以方便的直接调用外部类中的属性或者方法。内部类尽量不推荐使用。
一些修饰符的使用范围: