Java核心技术----类的高级特效
一、Java类包
1、类名冲突
Java中每个接口或类都来自不同的类包,无论是Java API中的类与接口还是自定义的类与接口都需要隶属某一个类包,这个类包包含了一些类和接口。
2、完整的类路径
一个完整的类名需要包名与类名的组合,任何一个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效地避免同名类冲突的情况。
列如:Date类,Date有两种包类java.util和java.sql.,需要制定的包类来明确类的方向:
java.util.Date date=new java.util.Date();
java.sql.Date date1=new java.sql.Date();
3、创建类包
定义包类名:
package 包名;
package baolei;public class Demo1{ public static void main(String[] args) {System.out.println("Hello");}}/*输出结果:
Hello*/
4、导入类包
(1)使用import关键字导入包
import 包类;
import com.baolei.*; //导入baolei类包的所有类
import com.baolei.Demo1; //导入baolei类包的Demo1类
(2)使用import导入静态成员
import static 静态成员;
import static java.lang.Math.max; //导入baolei类包的Demo1类
二、final变量
final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。
final double PI=3.14;
三、final方法
final的方法不能被重写
将方法定义为final类型可以防止任何子类修改该类的定义与实现方式,同时定义为final的方法执行效率要高于非final方法。(private修饰符:父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法。private修饰符的方法隐式被指定为final类型)
四、final类
定义为final的类不能被继承。
final 类名{}
package bao;final class Demo1{ int a=3;void dit() {}public static void main(String[] args) {Demo1 f=new Demo1();f.a++;System.out.println(f.a);}}/*输出结果:
4*/
五、内部类
注:非内部类不能声明private或protected访问类型
1、成员内部类
(1)成员内部类
在一个类中使用内部类可以在内部类中直接存取其所在类的私有成员变量。
public class OuterClass{
//外部类
private class InnerClass{
//内部类
}
}
package bao;public class Demo1{ neibulei i=new neibulei(); //外部类实例化内部类对象引用public void aa() { //外部类成员方法i.bb(); //外部类调用内部类的成员方法}class neibulei { //定义内部类neibulei(){ //neibulei内部类的构造方法}public void bb(){ //内部类成员方法}int y=0; //内部类成员变量}public neibulei dot() { //外部类方法,返回值引用内部类的引用// y=4; //这行代码会报错,外部类不能直接访问内部类成员变量i.y=4;return new neibulei(); //返回内部类的引用}public static void main(String[] args) {Demo1 dem=new Demo1(); //内部类的对象实例化操作必须在外部类或外部类非静态方法中实现。Demo1.neibulei i= dem.dot();Demo1.neibulei i2=dem.new neibulei();}
}
(2)内部类向上转型接口
如果将一个private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中可以隐藏内部类的具体实现过程。
package bao;interface jiekou{ //定义一个接口public void f();
}
public class Demo1{ public static void main(String[] args) {Demo2 out=new Demo2(); //实例化一个Demo2对象jiekou jie=out.doit(); //调用doit()方法,返回一个jiekoujie.f(); //调用f()方法}}
class Demo2{private class Demob implements jiekou{Demob(String s){ //内部类构造方法System.out.println(s);}public void f() { //实现接口中的f()方法System.out.println("访问内部类中的f()方法");}} public jiekou doit() { //定义一个方法,返回jiekou接口return new Demob("访问内部构造方法");}
}/*输出结果:
访问内部构造方法
访问内部类中的f()方法*/
(3)this关键字获取内部类与外部类
使用在外部类定义的成员变量与内部类的成员之间名称相同时,可以运用this关键字。
package bao;public class Demo1{ private int a;private class beibulei{private int a=9;public void doit(int a) {a++; //调用参数athis.a++; //调用内部类的变量aDemo1.this.a++; //调用外部类的变脸a}}
}
2、局部内部类
局部内部类就是在类的方法中定义的内部类,它的作用范围也是在这个方法体内。
package bao;interface jiekou{ //定义一个接口}
public class Demo1{ public jiekou doit(final String x) { //doit()方法参数为final类型class Demo2 implements jiekou{ //在doit()方法中定义一个内部类Demo2(String s){ s=x;System.out.println(s);}}return new Demo2("doit");
}}
3、匿名内部类
在编写程序代码时,不一定要给内部类取一个名字,可以直接以对象名来代替。
return new A() {
...//内部类体
};
A:对象名
public class Demo1{
public Demo2 doit() { //定义doit()方法return new Demo2() { //声明匿名内部类private int i=0;public int getValue() {return i;}};
}}
4、静态内部类
在内部类前添加修饰符static,这个内部类就变为静态内部类。
package bao;public class Demo1{ int a=100;static class aa() {void doitlnner() { //这行代码报错,静态内部类不可以直接调用外部类的静态变量System.out.println("外部类"+a); //调用外部类的成员变量a}}}
5、内部类的继承
内部类也和其他普通类一样可以被继承,但是继承内部类比继承普通类要复杂一些,需要设置专门的语法进行继承。
package bao;public class Demo1 extends ClassA.ClassB{ //继承内部ClassBpublic Demo1(ClassA a) {a.super(); //super关键字表示对某个类的父类的引用。
}}class ClassA{ //定义外部类ClassAclass ClassB{ //定义内部类ClassB}
}
Java核心技术----类的高级特效相关推荐
- 新书推荐 | Java核心技术 卷II 高级特性(原书第11版)
新书推荐 <Java核心技术 卷II 高级特性(原书第11版)> 长按二维码 了解及购买 全新第11版!针对Java SE9.10.11全面更新!Java领域极具影响力和价值的著作之一,与 ...
- Java核心技术卷2 高级特性 学习笔记(5)
参考:Java核心技术卷2 高级特性 第九章 Java技术提供了三种确保安全的机制: 语言设计特性(对数组的边界进行检查,无不受检查的类型转换,无指针算法等). 访问控制机制,用于控制代码能够执行的 ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读
前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开 ...
- Java核心技术 卷II 高级特性 原书第9版pdf
下载地址:网盘下载 内容简介 · · · · · · Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想&g ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.6 为克隆使用序列化
2.4.6 为克隆使用序列化 序列化机制有一种很有趣的用法:即提供了一种克隆对象的简便途径,只要对应的类是可序列化的即可.其做法很简单:直接将对象序列化到输出流中,然后将其读回.这样产生的新对象是对现 ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入
2.2.2 如何读入文本输入 最简单的处理任意文本的方式就是使用在卷Ⅰ中我们广泛使用的Scanner类.我们可以从任何输入流中构建Scanner对象. 或者,我们也可以将短小的文本文件像下面这样读入到 ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
3.6.2 使用StAX解析器 StAX解析器是一种"拉解析器(pull parser)",与安装事件处理器不同,你只需使用下面这样的基本循环来迭代所有的事件: 解析器将产生下面的 ...
- java 比较器类_高级编程之(Java常用类(Java比较器))
1.使用背景: 说明:Java中的对象,正常情况下,只能进行比较 == 或 !=.不能使用 > 或 < 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小. 如何 ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7.5 使用StAX写出XML文档
3.7.5 使用StAX写出XML文档 在前一节中,你看到了如何通过写出DOM树的方法来产生XML文件.如果这个DOM树没有其他任何用途,那么这种方式就不是很高效. StAX API使我们可以直接将X ...
最新文章
- python模拟按键_python 模拟按键放在模拟器Python初学者的17个技巧
- 2018.09.01 poj3071Football(概率dp+二进制找规律)
- RH124 章1 访问命令行 笔记
- ​MySQL服务器调优思路图
- Vue中使用vue-croper插件实现图片上传裁剪并传到SpringBoot后台接口
- 预测大盘最准确的指标_上证指数11月23日走势预测
- Javascript学习笔记1 数论
- orange pi java_[中文]Orange Pi家族各大成员一览表
- 2022经营新增长第一课
- Node.js Path 模块
- Python for循环语句总结
- 下架77天后 小红书恢复上架安卓应用市场
- Android 图片圆角的设置
- ad09只在一定范围内查找相似对象_重磅!Excel更新了超级查找函数XLOOKUP,可以对VLOOKUP说拜拜了...
- MOVE降低高水位 HWM
- android 自定义加载动画效果,Android自定义加载动画-旋转的叶子
- IDL| 数据分割读取
- python身份证年龄计算_用python计算年龄
- 破解内网火狐所保存的邮箱账号和密码
- npoi Excel图表制作