一 Java包
1.1类名冲突
Java中每个接口或类都来自不同的类包,无论是Java API中的类与接口还是自定义的类与接口,都需要隶属于某一个类包,这个类包包含了一些类和接口。如果没有包的存在,管理程序中的类名称将是一件非常麻烦的事情。如果程序只由一个类组成,自然不会出现类名重叠的问题,但是随着程序的类的数量增多,难免会出现这一问题。
例如,在程序中定义一个Login类,因业务需要,还要定义一个名称为Login的类,但是这两个类所实现的功能完全不同,于是问题就产生了——编译器不会允许存在同名的类文件。解决这类问题的办法是将这两个类放置在不同的类包中。
1.2完整的类路径
编写Java程序经常用到String类,其实String类并不是它的完整名称,就如同一个人需要有名有姓一样,String类的完整名称如图所示。可以看出,一个完整的类名需要包名与类名的组合,每个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效地避免同名类冲突的情况。
在java中我们经常用:
import.java.lang.String的语法导入包。
举个例子:
没有import语句时会报错,加入后:
当要创建多个对象时,我们是不是也要写多个import语句?当然可以但这样显得太麻烦,只需要导入:
import Java.util.*
在程序中使用两个不同Data类的完整路径,可以使用如下代码:
java.util.Data data=new java.util.Data();
java.sql.Data data2=new java.sql.Data(100);
1.3创建包
1.在这里我们新建了一个包texT,在此包中创建了一个类Te.注意包的命名要全部为小写字母。(开头必须小写)我这里为了区分其他的,最后一个字母用了大写。
package texT;
public class Te {
public void show() {
System.out.println("我没K,我没K,我没K");
}
}
2.我们再到默认包中创建一个同名的类Te:
public class Te {
public void show() {
System.out.println("恐龙抗狼抗狼抗");
}
}
3.最后来创建对象,运行一下:
(1)它运行的是默认的包的结果。
(2)我们导入包以后,它运行的是texT包里面的结果。
(3)使用完整路径来运行出两种结果。
1.4导入包
1.使用import关键词导入包
import关键词语法如下:
import com.mt*; //导入com.mt包中所有的类
import com.mt.Math //导入com.mt中的Math类
2.使用import导入静态成员
import关键字除导入包外,还可以导入静态成员。
语法如下:
import static 静态成员
二 成员内部类
2.1成员内部类简介
成员内部类的语法如下:
class Outerclass{ //外部类
class innerclass{ //内部类
}
}
在成员内部类中可以随意使用外部类的成员方法以及成员变量。
public class Demo {//外部类
inclass in=new inclass();//外部类不可以直接调用内部类的方法,要先创建内部类的对象
public void out() {//外部类方法
in.show();
}
class inclass{//内部类
int y=0;
public inclass(){//也可以构造内部类的构造方法
}
public void show() {//内部类方法
System.out.println("内部类方法y="+y);
}
}
public static void main(String[] args) {
Demo d=new Demo();//创建外部类对象
d.out();
Demo.inclass in=d.new inclass();//创建内部类对象
in.show();
}
}
2.2使用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
}
}
public static void main(String[] args) {
}
}
三 匿名内部类
匿名类是只在创建对象时才会编写类体的一种写法。匿名类的特点是现用现写,语法如下:
new 父类/父类接口(){
子类实现的内容
};
public class Demo {
public outinterface2 action() {//创建一个方法返回接口的对象
return new outinterface2() {//没有对象,直接创建一个接口,接口并不是具体的类,这里我们可以用匿名的类
/*类体*/
private int i=0;
public int getvalue() {
return i;
}
};//匿名的内部类
}
}
interface outinterface2{//创建了一个接口
}
上面匿名内部类的效果相当于:
public class Demo1 {
public outinterface2 action() {
return new interface2();
}
class interface2 implements outinterface2{
private int i=0;
public int getvalue() {
return i;
}
}
interface outinterface2{
}
}
这两个效果是等价的。