PH4-Java核心技术·卷1
文章目录
- Java与C++不同
- java和c++同
- 第4章 对象与类
- 基本概念
- 类之间的关系
- 对象和对象变量
- 对象堆栈存储
- Java只有值传递
- Date类
- 一个Java文件中可以定义多个Class么?
- 访问器方法和更改器方法
- 拒绝NULL方法
- 方法可以访问调用这个方法的对象的私有数据
- final
- 静态字段与静态方法
- 静态变量
- 静态常量
- 静态方法
- 工厂方法
- 对象构造
- 重载
- 默认字段初始化
- 默认无参构造器
- 显式字段初始化
- 初始化块
- import与# include无关,与namespace有关
- 类的设计技巧
Java与C++不同
- 在java中,一个文件只能有一个public类,使用public声明的类名必须和文件名一致。c++的类没有public修饰,c++不需要类名和文件名一致,但推荐类名和文件名一致。
- 所有的Java对象都存储在堆中,java只有值传递。c++的对象可存储在堆或栈,c++有值传递和引用传递。
- 在C++在类的外面定义方法,如果在类的内部定义方法,这个方法将自动成为内联(inline)方法。
在Java中,所有的方法都必须在类的内部定义,但并不表示它们是内联方法。 - java返回一个对象,通过值传递,返回的还是这个对象的引用,应该用clone方法进行克隆获得对象副本。c++用对象作为函数参数或者返回值时,自动调用复制拷贝函数。
- C引入关键字static是为了表示退由一个块后依然存在的局部变量。在这种情况下,术语“静态”是有意义的:变量一直保留,当再次进入该块时仍然存在。随后,static在C中有了第二种含义,表示不能从其他文件访问的全局变量和函数。为了避免引入一个新的关键字,所以重用了关键字static。最后,c++第三次重用了这个关键字,与前面赋予的含义完全无关,它指 示属于类而不属于任何类对象的变量和函数。这个含义与Java中这个关键字的含义 相同。
- 在C/C++中static关键字是可以作用于局部变量的,但是在Java中是不允许使用static修饰局部变量的。
- 在c++中,不能直接显式初始化对象的字段。所有的字段必须在构造器中设 置。但是,C++构造函数有一个特殊的初始化器列表语法。在Java中没有这种初始化器列表语法,因为对象没有子对象,只有指向其他对象的指针。
- 在C++中,一个构造器不能调用另一个构造器。Java可以。Java有super关键字,C++没有,因为C++支持多重继承。
- C++有显式的析构器方法,回收分配给对象的存储空间。由于Java会完成自动的垃圾回收,不需要人工回收内存,所以Java不支持析构器。
java和c++同
- java和c++都:方法可以访问所属类任何对象的私有特性。
第4章 对象与类
基本概念
算法 + 数据结构=程序
封装:数据和方法组合在一个包中,并对对象的使用者隐藏具体的实现。提高重用性和可靠性。因为总是调用同一个方法处理数据,即使处理发誓发生了变化。
继承:所有属性与方法。
类之间的关系
- 依赖(“uses-a” );
- 聚合(“has-a” );
- 继承(“is-a” )
对象和对象变量
定义一个对象变量birthday,它引用了new出的Date类型的对象。
Date birthday = new Date();
变量deadline不是一个对象,也没有引用任何对象,不能使用方法。
Date deadline;
deadline和birthday引用同一个对象。
deadline = birthday;
对象堆栈存储
- 所有的Java对象都存储在堆中,java只有值传递。当一个对象包含另一个对象变量时,它只是包含着另一个堆对象的指针。
- 把Java中的对象变量看作类似于C++的对象指针。
- C++支持复制构造器和赋值运算符来实现对象的自动复制。例如,一个链表(linked list)的副本是一个新链表,其内容与原始链表相同,但是有一组独立的链接。在Java中,必须使用clone方法获得对象的完整副本。
- C++中对象的建立可以在堆(动态建立new、delete)和栈(静态建立)上。函数的传参和返回值可以是对象(对象的拷贝,C++在用类作为函数参数和返回值时调用了类的拷贝构造函数,而且该拷贝构造函数是在堆上分配存储空间。),或是对象的指针。
#include<iostream>
#include<string>
using namespace std;
class student
{public:string name;int age;void sayhello();
};
void student::sayhello()
{cout<<"my name is: "+this->name+" I am: "<<this->age;cout<<"\n";
}
student setname(string name)
{student stu;stu.age=12;stu.name=name;return stu;
}
int main()
{student stu=setname("jim");stu.sayhello();return 0;
}
Java只有值传递
详见
Date类
类库设计者决定将保存时间与给时间点命名分开。所以标准Java类库分别包含了两个类:一个是用来表示时间点的D a t e类;另一个是用大家熟悉的日历表示法表示日期的LocalDate类。
一个Java文件中可以定义多个Class么?
- 单独的java文件中可以声明多个class文件
- public的类不是必须的
- 在Java源文件中每定义一个class在编译的时候就会生成一个对应的class文件
- 在java源文件中只能有一个使用public声明的class 并且必须与文件名相同,
访问器方法和更改器方法
在C + +中,带有const后缀的方法是访问器方法;没有声明为const的方法 默认为更改器方法。但是,在Java语言中,访问器方法与更改器方法在语法上没有明 显的区别。
- 访问器方法:String类的toUpperCase方法。在一个字符串上调用toUpperCase时,这个字符串仍保持不变,会返回一个将字符大写的新字符串。
拒绝NULL方法
String strg="hellow";String nameString = Objects.requireNonNullElse(strg,"unknown"); //第二个参数为defaultObj
String nameString2 = Objects.requireNonNull(strg, "name can not be null"); //第二个参数为message,当strg为空,NullPointerException
方法可以访问调用这个方法的对象的私有数据
java和c++都:方法可以访问所属类任何对象的私有特性。
public class Main {private String name;/*** */public Main(String namestr) {this.name=namestr;// TODO Auto-generated constructor stub}public boolean equals(Main other) {// TODO Auto-generated method stubreturn this.name.equals(other.name); //other.name直接访问了private参数}public static void main(String[] args) {Main harryMain=new Main("harry");Main main = new Main("boss");System.out.println(harryMain.equals(main));}}
final
必须在构造对象时初始化,确保在每一个构造器执行之后,这个字段的值已经设置,并且以后不能再修改这个字段。
class Employee
{private final String name;
}
- final修饰符对于基本类型或者不可变类的字段尤其有用。(如果类中的所有方法
都不会改变其对象,这样的类就是不可变的类。例如,String类就是不可变的。) - final修饰可变类,如下例。final表示存储在evaluations变量中的对象引用不会再指向另一个不同的StringBuilder对象。不过这个对象可以更改。
final StringBuilder sb;sb=new StringBuilder("hhhh");sb.append("aaa"); //sb这个对象可更改// sb=new StringBuilder("nonono"); 报错,final修饰的sb不能更改指向
静态字段与静态方法
静态变量
每一个Employee对象都有一个自己的id字段,但这个类的所有实例将共享一个nextId字段。使没有Employee对象,静态字段nextId也存在。它属于类,而不属于任何单个的对象。
class Employee
{private static int nextId = 1;
private int id;
}
harry.id = Employee.nextld;
Employee.nextld++;
静态常量
public class Math
{public static final double PI = 3.14159265358979323846;
}
静态方法
静态方法不能访问任何非静态字段,因为它不能在对象上执行操作。但是,静态方法可以访问静态字段。
可以认为静态方法是没有隐式参数,即没有this参数的方法(在一个非静态的方法中,this参数指示这个方法的隐式参数,参见4.3.7节)。
public static int getNextldO
{return nextld; // returns static field
}
// 可以提供类名来调用这个方法:
int n = Employee.getNextldO;
工厂方法
NumberFormat类如下生成不同风格的格式化对象:
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x)); // prints $0.10
System.out.println(percentFormatter.format(x)); // prints 10%
为什么NumberFormat类不利用构造器完成这些操作呢?这主要有两个原因:
- 无法命名构造器。构造器的名字必须与类名相同。但是,这里希望有两个不同的名
字,分别得到货币实例和百分比实例。 - 使用构造器时,无法改变所构造对象的类型。而工厂方法实际上将返回DecimalFormat
类的对象,这是NumberFormat的一个子类
对象构造
重载
函数名相同,参数不同。
ps:返回类型要相同。
默认字段初始化
- 在类中,如果没有初始化类中的字段,将会自动初始化为默认值(数值为0、bool值为false、对象引用null)。
- 局部变量必须明确地初始化(否则Java会报错)。
public class Employee {double salary;boolean married;String nameString;char aChar;public Employee(){System.out.println(salary);System.out.println(married);System.out.println(nameString);System.out.println(aChar+"aChar");}public static void main(String[] args) {Employee employee=new Employee();}
}
默认无参构造器
仅当类没有任何其他构造器的时候,自动提供一个默认的无参数构造器。一旦写了一个你自己的构造器,必须自己写默认的无参数构造器。
显式字段初始化
- 可以在类定义中直接为任何字段赋值。在执行构造器之前先完成这个赋值操作。
- 方法调用初始化一个字段
public class Employee {private String school="PKU"; // 初始值都为PKU,除非在构造函数修改为NPUprivate static int nextId=0;private int id = assignld(); //初始值为初始化方法public Employee() {}public Employee(String sc) {school=sc;}private static int assignld() {int r = nextId;nextId++;return r;}public void getString() {System.out.println(school+" "+id);}public static void main(String[] args) {Employee employee2 = new Employee();employee2.getString();Employee employee = new Employee();employee.getString();Employee employee3 = new Employee("NPU");employee3.getString();}
}
初始化块
初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,而且也不是通过对象或类名显式调用,而是通过隐式调用。
优点:
当多个构造器中有重复的语句,可以将这些重复的语句往上提取到初始化块中,提高代码的重用性
- 初始化块有两种 : 普通初始化块 和 静态初始化块。
- 静态初始化块 是用 static 来修饰的。
- 一个类中可以有多个初始化块。
- 初始化块都是被隐式调用的。
- 静态初始化块 : 类加载到系统时执行一次。仅能初始化类变量。
6 .普通初始化块 :在每个对象创建时都会执行一次,且会在构造方法执行之前执行。 - 相同类型的初始化块的执行顺序是 : 谁先定义的,谁先执行。
- 不同类型的初始化块的执行顺序是 : 先执行 静态初始化块,后执行普通初始化块。
- 普通初始化块 在 构造方法之前执行。
import与# include无关,与namespace有关
类的设计技巧
一定要保证数据私有。
一定要对数据进行初始化。
不要在类中使用过多的基本类型。
不是所有的字段都需要单独的字段访问器和字段更改器。
分解有过多职责的类。
类名和方法名要能够体现它们的职责。
优先使用不可变的类。
PH4-Java核心技术·卷1相关推荐
- java12章_【有书共读】java核心技术卷1--第12章
==============java核心技术卷1第12章----Swing用户界面组件===========主要内容:1 swing和模型-视图-控制器设计模式2布局管理 3文本输入4选择组件 5菜单 ...
- 《Java 核心技术卷1 第10版》学习笔记------异常
异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器 . 7.1.1 异常分类 在 Java 程序设计语言中, 异常对象都是派生于 Throwable 类的一个实例 . 稍后还 ...
- java实现图形界面输入半径求圆面积_【读】Java核心技术卷1
阅读原文:[读]Java核心技术卷1 看到这本书时,我的内心是崩溃的,卷1就700多页,但是这本书是很多前辈所推荐的,想必其中必有精华所在,硬着头皮上吧. 如何阅读本书 拿到书的第一眼肯定去看目录,大 ...
- Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...
- Java编程思想+Effective Java+Java核心技术+Java核心技术 卷II+Java语言程序设计(中文+英文+源码)
Java四大名著(中文+英文+源码 ) 传说中的java四大名著,分享出来方便大家学习! 书名如下: Java编程思想 Effective Java(第2版) Java核心技术 卷I(第8版) Jav ...
- JAVA基础----终弄清java核心技术卷1中的int fourthBitFromRight = (n 0b1000 ) / 0b1000;是怎么回事了。。。
一个关于位与运算的问题 对于<JAVA核心技术 卷1>(第11版) page43 第三章 3.5.8一节中有个描述如下: 如果n是一个整数变量,而二进制表示的n从右边数第四位1,则 int ...
- 《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试
出现不可预计的问题时,需要进行如下处理: 报告错误 保存操作结果 允许用户退出 本章解决的问题: 验证程序正确性 记录程序错误 调试技巧 11.1 处理异常 程序出现错误时应该: 返回安全状态,能让用 ...
- java核心技术卷I 第1-3章 笔记
java核心技术卷I 第1-3章 本书将详细介绍下列内容: ● 面向对象程序设计 ● 反射与代理 ● 接口与内部类 ● 异常处理 ● 泛型程序设计 ● 集合框架 ● 事件监听器模型 ● 使用Swing ...
- Java核心技术 卷1-总结-11
Java核心技术 卷1-总结-11 Java 集合框架 将集合的接口与实现分离 Collection接口 迭代器 泛型实用方法 集合框架中的接口 Java 集合框架 将集合的接口与实现分离 Java集 ...
- Java核心技术 卷1-总结-16
Java核心技术 卷1-总结-16 线程属性 线程优先级 守护线程 未捕获异常处理器 同步 竞争条件的一个例子 竞争条件详解 锁对象 线程属性 线程的各种属性包括:线程优先级.守护线程.线程组以及处理 ...
最新文章
- Android应用程序键盘(Keyboard)消息处理机制分析(20)
- 福建师范大学计算机考研好考吗,福建师范大学考研难吗?一般要什么水平才可以进入?...
- Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...
- Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历
- 深度ip转换器手机版app_手机大师智能管家app下载-手机大师智能管家app官网版 v1.0.0...
- 硕博招生,土耳其Koç大学和商业银行合作的人工智能中心
- C语言之基本算法09—各位全是a的数列之和
- 鼠标点到某个位置出现手势的效果。
- 【CSS】【7】CSS的盒子模型
- Backbox Linux简介与配置内网IP
- wingdings字体符号在哪_出版社编辑对标点符号和专业术语的要求
- Java 输入输出流学习总结
- 什么是SOCKS5协议
- 《SEM长尾搜索营销策略解密》一一2.10 小领域文化进入红利期
- winhex查看mysql_使用WINHEX查看innodb的BTree高度
- 计算机运行但屏幕黑屏,电脑显示器黑屏,教您电脑主机运行正常显示器黑屏怎么办...
- .net 3des 解密
- 阶梯博弈(Staircase Nim)
- 包姓女孩清秀文雅的名字
- python数组内运算_Python数组介绍和操作运算详解