内部类
含义:内部类是指在一个类里面在定义一个类,叫做内部类。类名不需要和文件名相同。
内部类可以是静态static的,也可以是public、private、protected和default修饰的。(外部类类名必须和文件名相同)
- 内部类是编译时的概念,一旦编译成功就会成为两个不同的类。例如定义一个名Outer的外部类,内部类定义为Inner。编译后就会出现outer.class和outer$inner.class两个类,所以,内部类的成员和方法名可以和外部类相同。
内部类可以直接访问外部类的成员,外部类访问内部类需要先new对象。
内部类可以分为:成员内部类、 静态内部类,匿名内部类和局部内部类四种。
1、成员内部类:
成员内部类,就是作为外部类的成员,可以直接使用外部类所有的成员和方法,即使外部类的成员用private修饰的,也仍然可以使用。同时,外部类访问内部类的成员和方法,需要通过内部类的对象去获取。具体操作Outer.Inner inner=new Outer().new Inner()
代码实例:
public class Outer{
public staitc void main(String[] args){
Outer outer = new Outer(); //创建外部类对象
Outer.Inner inner = outer.new Inner();//外部类访问内部类方法
inner.print("外部类调用内部类");
inner = outer.getInner();
inner.print("内部类使用外部类方法");
}
public Inner getInner(){
return new Inner();
}
public class Inner{//定义内部类
public void String(Str){
System.out.println(str);
}
}
}
输出结果:
外部类调用内部类
内部类使用外部类方法
2、静态内部类:
被static修饰的内部类称为静态内部类。
- 静态内部类不需要有外部类对象。(静态内部类创建不需要有外部类)
- 静态内部类不能访问非静态成员。
代码实例:
public class Outer { //外部类
private String sex;
public static String name = "张三";
static class Inner{ //静态内部类
public static String name1 = "李四"; //在静态内部类中可以存在静态成员
public void display(){ //静态内部类不能访问非静态的方法。不过可以和外部类方法同名。
System.out.println("外部类 name :" + name);
}
}
public void display(){
System.out.println("内部类 name: "+Inner.name1);//外部类访问静态内部类:内部类.成员属性
new Inner().display(); //静态内部类 可以直接创建实例不需要依赖于外部类
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.display();
}
}
输出结果:
内部类 name: 李四
外部类 name: 张三
3、匿名内部类:
匿名内部类,从字面意思上说,匿名就是没有名字,没有名字的类。
- 匿名内部类只使用一次的类,通常定义成匿名内部类。
- 匿名内部类不能有构造方法。
- 匿名内部类不能有public、static、default和protected修饰,也就是说没有访问修饰符。
- 匿名内部类不能定义任何静态成员,静态方法。
代码实例:
public class Outer { //定义外部类
public Inner getInner(final int num){
return new Inner(){ //匿名内部类写法
int number = num + 3;
public int getNumber(){
return number;
}
};
}
public static void main(String[] args) {
Outer out = new Outer();
Inner inner = out.getInner(2);
System.out.println("和为:"+inner.getNumber());
}
class Inner { //定义内部类
int getNumber() {
return 0;
}
}
}
输出结果:
和为:5
4、局部内部类:
局部内部类:在方法、构造方法或者静态代码块等内部定义的类成为局部内部类。
- 局部内部类不能加任何权限修饰符,因为他只对局部有效。
- 局部内部类可以用final、abstract修饰。
- 访问局部内部类必须先有外部类对象。
- 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量,
用this.变量名访问的是内部类变量,用外部类名.this.内部类变量名访问的是外部类变量。
代码实例:
public class Parcel {
private void internalTracking(boolean b) {
if (b) {
class TrackingSlip {
private String id; //局部内部类的成员属性
TrackingSlip(String str) { //局部内部类构造方法
id = str;
}
String getSlip() { // 局部内部类的成员方法
return id;
}
}
TrackingSlip ts = new TrackingSlip("局部内部类被调用了");
String string = ts.getSlip(); //调用局部内部类的方法:对象.方法名(局部内部类里面的)
System.out.println(string); // 测试打印语句
}
}
public void track() {
internalTracking(true);
}
public static void main(String[] args) {
Parcel parcel = new Parcel();
parcel.track();
}
}
输出结果:
局部内部类被调用了