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

来源:互联网 发布:小米盒子刷linux 编辑:程序博客网 时间:2024/03/29 12:44

---------------------- 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
原创粉丝点击