黑马程序员-java中内部类知识点总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


内部类:将一个类定义在另一个类里面。内部类可以直接访问外部类中的成员,包括私有成员。

格式 Outer.Inner in=new Outer().new Inner();

成员内部类:就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。外部类访问内部类成员必须先建立内部类对象。外面的其他类要访问内部类时,需要实例化,格式 Outer.Inner in=new Outer().new Inner();

这里需要内部类不是private。之所以可以可以直接访问外部类中的成员,是因为内部类中持有并隐藏了一个外部类的引用,格式 外部类名.this.成员 。如

class Outer{
	int x=1;	
	class Inner{
		int x=2;
		public void a(){
			int x=3;
			System.out.println(x);
			System.out.println(this.x);
			System.out.println(Outer.this.x);
		}
	}
}

输出结果为321

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
当内部类被static修饰后,它只能访问外部类的静态成员。
注意:当内部类中有静态成员,该内部类必须是static的。当外部类中的静态方法访问内部类时,内部类也必须是static的。

局部内部类:是指内部类定义在方法和作用域内。

内部类定义在局部时,1不可以被成员修饰符修饰。
    2可以直接访问外部类中的成员,因为还持有外部类的引用。但是不可以访问它所在局部中的变量。只能访问被final修饰的局部变量。

public class Parcel4 { 
    public Destination destination(String s) { 
        class PDestination implements Destination { 
            private String label; 
 
            private PDestination(String whereTo) { 
                label = whereTo; 
            } 
 
            public String readLabel() { 
                return label; 
            } 
        } 
        return new PDestination(s); 
    } 
 
    public static void main(String[] args) { 
        Parcel4 p = new Parcel4(); 
        Destination d = p.destination("Tasmania"); 
    } 
} 

public class Parcel5 { 
    private void internalTracking(boolean b) { 
        if (b) { 
            class TrackingSlip { 
                private String id; 
                TrackingSlip(String s) { 
                    id = s; 
                } 
                String getSlip() { 
                    return id; 
                } 
            } 
            TrackingSlip ts = new TrackingSlip("slip"); 
            String s = ts.getSlip(); 
        } 
    } 
 
    public void track() { 
        internalTracking(true); 
    } 
 
    public static void main(String[] args) { 
        Parcel5 p = new Parcel5(); 
        p.track(); 
    } 
} 
局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

 匿名内部类:
1匿名内部类其实就是内部类的简写格式。
2定义匿名内部类的前提:内部类必须是继承一个外面的类或者接口,甚至可以继承自己所在的类。
如:
class Inter2{
			void method2() {
			}
			static Inter2 in2=new Inter2(){//定义Inter2的子类
				void method3(){}
				void method2(){}
			};
		} 


		abstract class Inter3{
			abstract void method();
			Inter3 in3=new Inter3(){//定义Inter3的子类
				void method(){}
			};
		}

3匿名内部类的格式: new 父类或者接口(){定义子类的内容}.方法();实在没有父类了,就new一个Object作 为此类的父类。
4其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
5匿名内部类中定义的方法最好不要超过3个。

在实际开发时候,会大量用到匿名内部类,因为它简单方便。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值