Java基础 | 包和内部包
所有知识点均来源于《Java从入门到精通》(第六版)。
Java类包
Java每定义一个类就会生成一个.class的文件,但会很容易出现类名称冲突的现象,可以用类包来管理类文件的机制。
类名的冲突
java每个接口或者类都来自不同的包类。一个包类里包含一些类和接口。编译器不会允许存在同名的类文件,所以需要把这两个类放在不同的包里。
类包的名字
组成一般是包名.类名。
java.lang.String
java.lang
是包名,String
是类名。同一个包中的类互相访问时可以不指定包名。
比如说一个包命名为com.mr
意思是位于com文件夹下的mr子文件夹下。没有定义包的类会被放在默认包(default package)下。
下面语法必须放在代码的第一行,java包的命名规则是全部使用小写字母。
package 包名
导入
用import导入包
*可以导入包里所有的类
import java.util.*
用import导入静态成员
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 内部类();
- 可以使用this关键字获取内部类与外部类的引用,如果外部类中定义的成员变量和内部类中的成员变量名字相同,可以用this,例子:
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 父类/父类接口(){
子类实现的内容;
};//有分号
- 可以使本来没有办法创建对象的抽象类用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就是没有具体的品种但是是一只狗,而且抽象方法都被重新定义过的狗。