目录
一、类包
在Java中,我们可以使用class关键字来进行定义一个类,在程序被编译后就会产生一个.class文件;类的定义是规定类名不能重复的,如果程序内只定义了少量的类,那自然不用担心这个问题;
随着类的数量增多,那么难免会出现这个问题,如果根据需求需要定义两个名字相同但是程序逻辑不同的类时,那么该如何解决呢,最好的方法就是将这个两个类放置在不同的包下面。
1、类路径
如果一个程序内存在多个同名不同包的max类,那么该如何使用指定包的类呢?
在使用该类时使用该类的类路径,也成为绝对路径。
java.util.Date date=new java.util.Date(); // 选择Java.util包下的Date类
java.sql.Date date2=new java.sql.Date(100) // 选择Java.sql包下的Date类
指定包名(package)
在进行创建包的时候需要注意的是,Java包的命名规则建议使用全小写字母进行命名。
需要了解的是如果一个类没有被定义在一个指定的包内,那么该类就被归纳到默认包(default package)中;
在某个包下面创建一个类的话,需要在这个类的开头加上表达式 package 包名,该表达式需要放置在程序的第一行,使用package关键字指定包名之后,包名也会成为类名的一部分,在不同包下使用该类的话,需要使用 import 包名.类名 的格式。
package test; //指定包名,表示该类在本包内
public class dome{
}
2、创建包:
1.双击eclipse弹出路径对话框,并复制路径
2.复制路径到文件夹中查找
3.查找后,可以看见在Eclipse里的Java代码,选择一个项目,打开src
4.新建一个项目,在里面创建一个包,右击选择package;返回文件夹就能看新建的包
5.同时创建包并在包里创建一个类
6.创建包,存储域名
7.在创建包存储域名时,把域名一次性打上去
3、导入包
在Java中,如果需要使用到其它包内的类的话,除了使用该类的绝对路径之外,我们还可以使用Java中 import 关键字来指定。例如,如果在其它包内也定义了一个Math,那么假如我们只想使用该Math类的话,那么我们可以使用import关键字进行导包。
package test;
import Number_5.Math; //导包,导入其它包内的Math类
public class Demo_4 {
public static void main(String[] args) {
int max = Math.max(4, 6); // 进行导包后,再使用时,直接使用包名.类名的方法进行使用
System.out.println(max);
}
}
在进行导包后,我们在使用该包下的Math类后,可以看到,java.lang包下有一个Java给定的Math类,还有一个我们刚刚进行导的包下的Math类;
需要注意的是,如果使用import导入某个包下的所有类时,这些类并不包括该包下的子包的类。如果需要使用子包中的类时,需要对子包进行单独引用。
import 包名.子包名.*; //导入所有类
import 包名.子包名.类名; //导入指定类
导入静态方法或静态成员
使用import关键字还可以对静态方法与静态变量进行导包。
import java.lang.max;
import java.lang.System.out;
public class Demo{
public static void main(String[] args){
out.println("较大值为:"+(max(1,4))); // 导入后可直接使用
}
}
二、内部类
内部类就定义在一个类内部的类;
1、成员内部类
定义在一个类成员位置的内部类,称为成员内部类,在成员内部类中可以使用外部类的的任意成员变量与成员方法,即使该外部类成员变量被private所修饰。
class OuteruClass{ //外部类
class InnerClass{ //内部类
}
}
例题代码:
public class Car { //创建汽车类
//成员变量
private String brand; //汽车品牌
public Car(String brand) { //汽车类的构造方法,参数为汽车品牌
this.brand = brand; //给汽车品牌赋值
}
//成员内部类
class Engine{ //发动机类(内部类)
//成员变量
String model; //发动机型号
//构造方法
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关键字获取内部类与外部类的引用
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
}
}
}
2、匿名内部类
匿名内部类本质是一个隐藏了名字的内部类。匿名类是只有在创建时才会编写类体的一种写法。
语法格式:
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();
}
}
运行结果:
使用匿名类时应该遵循以下几点原则:
1、匿名类不能写构造方法。
2、匿名类不能定义静态的成员。
3、如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就会被java虚拟机销毁。
说明:匿名内部类编译以后,会产生以“外部类名$序号”为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类。