包、内部类

2016/11/26 Java package

  • package语句必须在文件中的第一条有效语句
  • 在一个java文件中,只能有一个package
  • 如果没有package,默认就是无包名

权限修饰符

  public protect 默认 private
同一类中
同一包子类和同一包其他类  
不同包子类    
不同包其他类      

package,import,class有没有顺序关系

package > import > class

内部类

把类定义在其他类的内部,这个类就被称为内部类

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有。
  • 外部类要访问内部类的成员,必须创建对象。

实例化

  • 非静态
    • 外部类名.内部类名 对象名 = new 外部类对象.new 内部类对象;
      Outer.Inner oi = new Outer().new Inner();
  • 静态
    • 格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
      Outer.Inner oi = new Outer.Inner();

内部类分类

  • 成员内部类(成员位置)
    • 被静态修饰的成员内部类只能访问外部类的静态成员
    • 非静态的成员内部类,成员只能是非静态的
      • 如果非静态内部类使用静态成员,外部类没有加载时内部类也没有加载,违背了所有的静态变量必须在所有的非静态变量之前加载原则
  • 局部内部类(局部位置)
    • 局部内部类访问局部变量必须被final修饰
      • 因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用final修饰,这样,在堆内存里面存储的其实是一个常量值。
class Outer {
    public void method() {
        final int n = 100;//这里需要被final修饰 成员变量不需要
        class Inner {
            public void show() {
                System.out.println(++n);// 如果成员变量没有被修改,jdk8会自动增加final不用显式指定
            }
        }
        
        Inner i = new Inner();
        i.show();
    }
}

class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    } 
}

分别输出:30,20,10

class Outer {
    public int num = 10;
    class Inner {
        public int num = 20;
        public void show() {
            int num = 30;
            System.out.println(?);
            System.out.println(??);
            System.out.println(???);
        }
    }
}
class InnerClassTest {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }   
}
//num
//this.num
//Outer.this.num

匿名内部类

本质是一个继承了该类或者实现了该接口的子类匿名对象

abstract class Person {
    public abstract void show();
}

class PersonDemo {
    public void method(Person p) {
        s.show();
    }
}

class PersonTest {
    public static void main(String[] args) {
        //如何调用PersonDemo中的method方法呢?
        PersonDemo pd = new PersonDemo ();
        pd.method(new Person() {
            public void show() {
                System.out.println(show);
            }
        });
    }
}

以上概念总结于传智播客Java基础课程

Search

    Post Directory