包和内部类
一、java类包
1、类名冲突
java中每一个接口或类都来自不同的类包,这个类包包含了一些类和接口,为了使两个同名的类文件的功能使用,需要将两个类放置在不同的类包中
2、完整的类路径
一个完整的类名需要包名和类名的组合,每个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效的避免同名类冲突的情况
在java中采用类包机制非常重要,类包不仅可以解决类名冲突问题,还可以在开发庞大的应用程序时,帮助开发人员管理庞大的应用程序组件,方便软件复用。
3、创建包
新建一个名为Ecilpse的文件,在Ecilpse中创建包,在项目src上右击,新建,选择package(包)命令
取包名
在 package1下创建一个类
4、导入包
使用import关键字导入包
语法:import com.mr*; //导入com.mr包中的所有类
import com.mr.Math //导入com.mr包中的Math类
在使用import关键字时,可以加上指定类的完整描述,如果为了使用包中更多的类,可以在使用import关键字指定时在包指定后加上*,这表示可以在程序中使用该包的所有类。
使用import导入静态成员
import关键字除导入包外,还可以导入静态成员
语法:import static静态成员
作用:导入静态成员变量可以使编程更为方便
package Packages2;
import java.util.Scanner;//创建扫描器
import static java.lang.System.out;
public class Test2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("输入一个整数:");
int a=sc.nextInt();
//输入一个整数
out.print(a);
//输出整数
sc.close();//关闭扫描器
}
}
二、内部类
1、成员内部类
a、成员内部类简介
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量。
语法:
class OuterClass{ //外部类
class lnnerClass{ //内部类
}
}
在成员内部类中可以随意使用外部类的成员方法及成员变量,尽管这些类成员被修饰为private。
内部类的实例一定要绑定在外部类对象的实例,如果从外部类中初始化一个内部对象,那么内部类对象 就会绑定在外部类对象上。
内部类初始化方方式与其他类的初始化方法相同,用new关键词。
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 内部类();
b、使用this方法关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
public class Car{
private int x=7;//外部类的x
private class lnner{
private int x=9;//内部类的x
public void doit() {
int x=11;//局部变量x
x++;
this.x++;//调用内部类的x
Car.this.x++;//调用外部类的x
}
}
}
如果在内部类与外部类的成员变量重名的情况,可以使用this关键字进行处理
2、匿名内部类
匿名内部类是只在创建对象时才会编写的一种写法,其特点是“现用现写”
语法:
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();
}
}
使用匿名类时应遵循以下原则:
- 匿名类不能写构造方法
- 匿名类不能定义静态的成员
- 如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被java虚拟机销毁