包和内部类
今日份学习完整类路径,导入包,成员内部类以及匿名内部类。
- 完整类路径 一个完整的类名需要包名与类名的组合,每个类都隶属于一个类包,只要保证同一个类中的类包不同名,就可以有效地避免同名类冲突的情况。
同一包中的类相互访问时,可以不指定包名。 - 导入包(import关键字)
- 使用import关键字导入包在使用import关键字时,可以指定类的完整描述,如果为了使用包中更多类,可以在使用import关键字指定时在包指定后加上*,这表示可以在程序中使用该包中的所有类。
(如果类定义中已经导入了一个类,那在类体中再使用其他包中的该类时就必须指定完整的带有包格式的类名。
在程序中添加import关键字时,就开始在CLASSPATH指定的目录中进行查找,查找子目录,然后从子目录下编译完成的文件中查找是否有名称符合者,最后找到需要文件。
当使用import指定了一个包中的所有类时,并不会指定这个包的子包中的类,如果用到这个包中的类,需要再次对子包进行单独引用。) - 使用import关键字导入静态成员
语法为:
import static 静态成员
在使用import static 导入后,可以在程序中直接引用静态成员。
- 成员内部类在成员内部类中可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private。
内部类的实例一定要绑定在外部类的实例上,而且初始化方式也与其他类的初始化方式相同,都是使用new关键字。
成员内部类在其他类中也可以使用,其语法为:
外部类=new 外部类()
外部类.内部类 inner=outer.new 内部类
(如果在外部类和非静态方法之外实例化内部类对象,需要使用“外部类.内部类”的形式指定该对象的类型。
内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。)
(直接this.→调用内部类
类名+this.→调用外部类) - 匿名内部类
匿名类只是在创建对象时编写的一种写法,“现用现写”,语法为:
New 父类/父接口(){
子类实现的内容
};
(最后一个大括号后才有分号)
【例】使用匿名内部类创建一个抽象狗类的对象
abstract class Dog{
String color;
public abstract void move();
public abstract void call();
}
public class Domo {
public static void main(String[] args) {
Dog maomao=new Dog(){
public void move() {
System.out.println("四腿狂奔");
}
public void call() {
System.out.println("汪汪汪");
}
};
maomao.color="灰色";
maomao.move();
maomao.call();
}
}
结果为:
从以上代码可以看出:
匿名类不能写构造方法。
匿名类不能定义静态成员。
如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被JAVA虚拟机销毁。
(匿名内部类编译以后,会产生以“外部类名$序号”为名称的.class文件,序号以~n排列,分别代表1~n个匿名内部类)