8.1 Java类包
8.1.1 类名冲突
Java中每个接口或类都来自不同的类包,无论是Java API中的类与接口,都需要隶属于某一个类包,这个类包包含了一些类和接口。如果没有包存在,管理程序中的类名称将是一件麻烦的事情。为了避免类名重叠的问题,则需创建新的类。
8.1.2 完整的类路径
一个完整的类名需要包名和类名的组合,每个类都隶属一个类包,只要保证同一类包的类不同名,就可以有效避免同名类冲突的情况。
8.1.3 创建包
(1)在项目的src节点上右击,选择“新建”/“包”命令(英文为New/Package)。
(2)弹出“新建Java包”(New java Package)对话框,在“名称”(Name)文本框中输入新建的包名,然后单击“完成”(Finish)按钮。
(3)在Eclipse中创建类时,可以在新建立的包上右击,选择“新建”(New)命令,这样新建的类会默认保存在该包中。另外也可以在New Java Class对话框中指定新建类的所在包。
在Java中包含设计应与文件系统结构相对应。没有定义包的类会被归纳在默认包(defaul package)中。在类中定义包名的语法为:**package 包名**
例8.1 创建自定义Math类
package com.mr; //指定包名
public class Math {
public static void main(String[] args) {
System.out.println("不是java.lang.Math类,而是com.mr.Math 类");
}
}
结果为:
8.1.4 导入包
1.使用import关键字导入包语法如下:
**import com.mr.*; // 导入com.mr包中的所有类。** **import com.mr/Math //导入com.mr包中的Math类**
2.使用import导入静态成员语法:import static 静态成员
例8.2 使用Import导入静态成员
package com.mr;
import static java.lang.Math.max; //导入静态成员方法
import static java.lang.System.out; //导入静态成员变量
public class ImportTest {
public static void main(String[] args) {
out.println("1和4的较大值为:"+ max(1,4));
}
}
结果为:
8.2 内部类
在一个文件中定义两个类,则其中任何一个类都不在另一个类的内部,如果在类中再定义一个类,则将在类中再定义的那个类称为内部类。
1.成员内部类简介
在一个类中使用内部类,可以在内部类中直接存取其所在类的语法如下:
class OuterClass{
class InnerClass{
}
}
例8.3 使用成员内部类模拟发动机点火
代码为:
public class Car {
//成员变量
private String brand;
//构造方法
public Car(String brand) {
this.brand = brand;
}
//成员方法
//成员内部类(发动机类)
class Engine{
String model;
private String brand;
public Engine(String model) {
this.model = model;
}
public void ignite() {//点火方法
System.out.println("发动机"+ this.model +"点火");
}
}
public void start() {//启动汽车方法
System.out.println("启动" + this.brand);
}
public static void main(String[] args) {
Car car = new Car("大众郎行");//创建汽车对象并为汽车品牌赋值
car.start(); //汽车类对象调用启动汽车方法
//创建内部类对象,并为发动机型号赋值
Car.Engine engine = car.new Engine("EA211");
engine.ignite();//发动机类对象调用点火方法
}
}
结果为:
成员内部类不止可以在外部类中使用,在其他类中也可以使用。语法如下:
外部类 outer = new 外部类();
外部类.内部类 inner = outer.new 内部类();
注意:(1)如果在外部类和非静态方法之外实例化内部类对象,需要使用“外部类.内部类”的形式指定该对象的类型。
(2)内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。
2、使用this关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。
例8.4 在内部类中调用外部类对象
代码为:
public class TheSameName {
private int x = 7;
private class lnnre{
private int x = 9;
public void doit() {
int x = 11;
x++;
this.x++;
TheSameName.this.x++;
}
}
}
8.2.2 匿名内部类
匿名类是只在创建对象时才会编写类体的一种写法。匿名类的特点是“现写现用”,其语法如下:
new 父类/父类口(){
子类实现的内容
};
例8.5 使用匿名内部类创建一个抽象狗类的对象
代码为:
abstract class Dog{//抽象类
String color;
public abstract void call();//抽象方法
public abstract void move();//抽象方法
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog wenin = new Dog() {
//匿名内部类
public void move(){
System.out.println("四腿狂奔");
}
public void call() {
System.out.println("汪汪汪");
}
};
wenin.color = "灰色";
wenin.move();
wenin.call();
}
}
结果为:
使用匿名类时应该遵循以下原则:
1、匿名类不能写构造方法。
2、匿名类不能定义静态的成员。
3、如果匿名类创建的对象没有赋值给任何应用变量,会导致该对象用完一次就会被Java虚拟机销毁。