Java每定义一个类就会生成一个.class的文件,但会很容易出现类名称冲突的现象,可以用类包来管理类文件的机制。
java每个接口或者类都来自不同的包类。一个包类里包含一些类和接口。编译器不会允许存在同名的类文件,所以需要把这两个类放在不同的包里。
组成一般是包名.类名。
java.lang.String
java.lang
是包名,String
是类名。同一个包中的类互相访问时可以不指定包名。
比如说一个包命名为com.mr
意思是位于com文件夹下的mr子文件夹下。没有定义包的类会被放在默认包(default package)下。
下面语法必须放在代码的第一行,java包的命名规则是全部使用小写字母。
package 包名
*可以导入包里所有的类
import java.util.*
import除了可以导入包以外还可以导入静态成员
导入静态成员方法
import static java.lang.Math.max
导入静态成员变量
import static java.lang.System.out
导入之后,主方法就可以直接用out.println()和max(),代替写全称。
如果在类中再定义一个类,那将在类中再定义的那个类称为内部类。内部成员类和匿名类为常见的内部类。
class OuterClass{
private int i = 0;
private void g(){
}
class InnerClass{
都可以直接用
g();
i++;
}
}
在成员内部类中可以随意使用外部类的成员方法以及成员变量,即使是private修饰的。
内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么外部类对象就会绑定在外部类对象上。内部类初始化方式和其他类的初始化方式都是一样的用new
关键字。
例子:Car.Engine engine = car.new Engine("EA211");
public class Car{
private String brand;
public Car(String brand){
this.brand = brand;
}
//内部类
class Engine{
String model;
//Engin类的构造方法
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 内部类();
public class TheSameName{
private int x = 7; //外部类x
//内部类
private class Inner{
private int x = 9; //内部类x
public void doit(){
int x = 11; //局部变量x
x++;
this.x++; //调用内部类的x
TheSameName.this.x++; //调用外部类的x
}
}
}
匿名类是只在创建对象的时候才会编写的一种写法。匿名类的特点是“现学现用”:
new 父类/父类接口(){
子类实现的内容;
};//有分号
abstract class Dog{
String Color;
public abstract void move();
public abstract void call();
}
public class Demo{
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();
}
}
得到结果:
四脚狂奔
汪~
这里的maomao就是没有具体的品种但是是一只狗,而且抽象方法都被重新定义过的狗。