一:java类包
1.因为类名容易冲突的问题,引入了包
2.类的完整路径应该是 包名.类名,如java.lang.Math。java.lang是包名字,Math是类名。
3.创建包:涉及eclipse的使用,省略。。。
4.在java中包名的涉及应该与文件系统结构对应,如包名com.lzw,那么该包中的类,应该位于lzw子文件夹下。没有定义包的类会被归纳在默认包中。
5.在类中定义包名的语法:package 包名,必须放在第一行
6.为了避免包冲突,java中使用创建者的internet域名的反序。
7.导入包:import 包名(或包中的类,或者包中的静态成员)
二:final变量
1.final定义的变量为常量,不能再更改。final double PI = 3.14;
2.被final定义的变量并不是恒定不变的,如:在类中定义一个final int x = rand.nextInt();将随机数赋值给他。那么每次实例化对象,每个对象中的x变量不一样。
3.要想每个对象中的x一样,那就在前面加一个static
三:final方法
1.定义为final方法的类,该子类不能重写这个方法。
2.父类中定义了一个private final x()方法。在子类中也可以定义一个x()方法。但是这不是正常的重写。因为正常的重写情况下,子类向上转型,调用该方法,会调用到子类的方法,但是如果定义了private final,调用该x方法,就会报错。
四:final类
1.定义为final的类不能被继承。
五:内部类
1.成员内部类,类中定义的类。
(1)内部类可以访问该类中的所有成员,包括private声明的。外部类不能直接访问内部类的成员。但可以通过内部类对象访问。
(2)内部类的实例化,必须建立在外部类的实例化之上(先实例化外部类,才能根据外部类实例出内部类)
例:内部类:o1,外部类o2
o2 oo2 = new o2();
o2.o1 = oo2.new o1();
2.局部内部类,在方法或者某作用域范围内中定义的类。
(1)在方法/某作用域的外部不能访问这个内部类,该内部类能访问外部的成员。
(2)在方法体中定义的内部类只能访问方法体重定义为final的方法体成员。
3.匿名内部类
(1)匿名内部类没有名称
(2)例:某方法放回值为某接口的对象,但是接口没有对象,需要靠内部类转型。
所以在该方法中必须返回一个内部类。
但是没有定义内部类,那么可以使用匿名内部类。具体使用案例如:
public OutInterface2 doit(){ //该方法返回值是一个名字为OutInterface2 的接口对象
return new OutInterface2{ //直接return ,然后new一个该接口,后面大括号中为该内部类的类体。
private int i = 0;
public int getValue(){
return i ;
}
}; //return 后记得加分号;
}
(3)匿名内部类在编译后,会产生以“外部类名$序号”为名称的.class文件。序号1-n排列。
4.静态内部类
(1)在内部类前面添加修饰符static这个内部类就变成了静态内部类了
(2)静态内部类可以声明static成员。非静态内部类中不能声明static成员。
(3)如果要创建静态内部类对象,那么不需要外部类的对象,也能创建。
(4)不能再静态内部类中访问外部类的非静态成员。
(5)静态内部类的使用:在经常程序测试的时候,如果在每一个Java文件中都设置main方法,那将出现很多额外的代码,二程序并需要这么多的main方法。为了解决这个问题马呢么可以将main方法写入静态内部类中。
(6)编译后,静态内部类会生成一个名词为 外部类类名$内部类类名 的.class文件,那么只要我们
运行 java 外部类类名$内部类类名 就可以运行该静态内部类中主方法的内容。完成这个main方法的测试。
当测试完所有的程序,需要打包的时候,只需要删除这个 外部类类名$内部类类名 的类就可以打包了。
5.内部类的继承
内部类可以像其他类一样可以被继承。只是有专门的继承的规定。
例:public class OutputInnerClass extends ClassA.ClassB{
public OutputInnerClass(ClassA a){ //必须定义一个带参数的构造方法,并且参数必须是内部类的外部类对象
a.super(); //该构造方法中必须使用a.super();
}
}