Java核心技术2:怎么学习类的高级特性
类除了具有普通的特性之外,还具有一些高级特性,如包、内部类等。本篇经验将向您介绍包的创建规则、在程序中导入其他类包、掌握final变量据、方法、类、掌握内部类。下面的经验每张图的代码都是一个字一个字地手输的,内容都是一个字一个字地打上去的,怎么不是原创的呢,搞不懂?
一、JAVA类包
- 01
在java中每定义好一个类,通过java编译器编译之后,都会生成一个扩展名为.class的文件,当这个程序的规模逐渐庞大之后,就会产生类重名的现象。那么JDK API中提供的成千上万的具有各种功能的类,又是如何管理的呢?java中提供了一种管理类文件的机制,那就是类包。
- 02
1、完整的类路径 一个完整的类名需要包名与类名的组合,每个类都属于一个类包,只要保证同一类包中的类不重名,就可以有效地避免同名类的情况。 例如:在程序中使用两个不同Date类的完整类路径,可以使用如下代码: java.util.Data data=new java.util.Data(); java.sql.Data data2=new java.sql.Data();
- 03
2、创建包 创建包的步骤如下: a、在项目的src节点上单击鼠标右键,选择“新建”/“包”;
- 04
b、弹出“新建java包”对话框,在“名称”文本框中输入新建的包名,单击“完成”
- 05
在类中定义包名的语法如下: package 包名; 在类中指定包名时需要将package表达式放置在程序第一行,它必须是文件中第一行非注释代码,当使用package关键字为类指定包名之后,包名将会成为类名的一部分。
- 06
3、导入包 a、使用import关键字导入包 import关键字的语法如下: Import 包名; 指定包名中的所有类都可以使用 Import包名.类名; 指定包名中的类名可以使用 在使用import关键字时,可以指定类的完整描述,如果为了使用包中更多的类,可以在使用import关键字指定时在包指定后加上*,这表示可以在程序中使用包中所有的类
- 07
b、使用import导入静态成员 使用import导入静态成员的语法如下: Import static 静态成员;
- 08
举例如下:
二、final变量
- 01
final可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。 例如,在类中定义PI的值可以使用如下语句: final double PI=3.14;
- 02
被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线连接,这是java中的编码规则。同时,定义为final的数据无论是常量、对象引用还是数组,在主函数中都不可以被改变
- 03
为了使一个常量真正做到不可更改,可以 将常量声明为static final。 举例如下:
- 04
下图中清晰地表明了在程序中哪些位置可以定义final数据
三、final方法
- 01
定义为final的方法不能被重写,将方法定义为final类型可以防止子类修改该类的定义与实现方式,同时定义为final的方法的执行效率要高于非final方法,在修饰权限中曾提到过private修饰符,如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为private的方法隐式被指定为final类型,这样无需将一个定义为private的方法再定义为final类型。 例如: private final void test(){ }
- 02
但是在父类中被定义为private final的方法似乎可以被父类覆盖, 举例如下:
- 03
从上面的例子中可以看出,final方法不能被覆盖,例如doit2()方法不能在子类中被重写,但是在父类中定义了一个private final的doit()方法,同时在子类中也定义了一个doit()方法,从表面上看,子类覆盖了父类,但必须满足一个对象向上转型为它的基本类型并调用相同方法这样一个条件。可见子类的doit()不是正常覆盖,而是生成了一个新的方法。
四、final类
- 01
定义为final的类不能被继承,如果允许一个类不被任何类继承,并且不允许任何人对这个类有改动,可以将这个类设置为final类。
- 02
final类语法如下: final 类名{}
- 03
如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式,但是final类中的成员变量可以被定义为final或非final类形式。 举例如下:
五、内部类
- 01
1、成员内部类 a、内部类成员介绍 成员内部类语法如下: public class 外部类{ private class 内部类{ } }
- 02
在内部类中可以随意使用外部类的成员方法及成员变量,尽管这些成员被修饰为private. 内部类的实例一定要绑定在外部类的实例上。如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。内部类初始化也使用关键字new.
- 03
举例说明:
- 04
b、内部类向上转型为借口 如果将一个修饰权限为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐藏内部类的具体实现过程,可以在外部提供一个接口,在接口中声明一个方法,如果再实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的同一个方法,而在一般的类中是不能多次实现接口中的同一方法的。
- 05
举例如下:
- 06
c、用this关键字获取内部类与外部类的引用 如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。
- 07
举例说明: 在内部类中使用this语句可以调用内部类的成员变量,而使用theSameName.this.x语句可以调用外部类的成员变量x。
- 08
2、局部内部类 内部类中不仅可以在类中进行定义,也可以在类的局部位置进行定义,如在类的方法或任意的作用域中均可以定义内部类。
- 09
3、匿名内部类 匿名内部类的语法如下; return new A(){ } A为类名
- 10
4、静态内部类 静态内部类具有以下两个特点: 如果创建静态内部类的对象,不需要其外部类的对象; 不能从静态内部类的对象中访问非静态外部类对象; 举例说明:
- 11
在静态内部类中定义主方法:
- 12
5、内部类的继承 内部类和普通类一样可以被继承,但需要比较复杂的专门设置的语法结构,在某个类继承内部类时,必须硬性给以这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类引用,同时在构造方法体重使用a.super()语句才为继承提供了必要的对象引用。