Java零散知识点
基本程序设计结构
数据类型
int
无穷大: Integer num = Integer.MAX_VALUE
char
char
对应的引用类型是 Character
.
boolean
boolean
对应的引用类型是 Boolean
.
Java 的真值是 true
和 false
.
float
无穷大: Float.POSITIVE_INFINITY
无穷小: Float.NEGATIVE_INFINITY
double
无穷大: Double.POSITIVE_INFINITY
无穷小: Double.NEGATIVE_INFINITY
String
对象和类
1. 如何理解Java只有值传递?
java的基本数据类型会传递形参给一个实参的拷贝, 修改形参并不能修改实参.
java的引用类型也是传递给形参一个实参的地址的拷贝, 但是可以通过此地址修改实参对象状态(通过对象自己的方法, 而不能通过重新赋值)
比如,下面可以修改
//可以修改
public test(){
Person p = new Person();
canChange(p);
canNotChange(p);
}
public void canChange(Person p) {
p.setName("zhangsan"); //传递给形参p, 可以通过p自己的方法修改p的属性
}
//不可以修改p
pulic void canNotChange(Person p) {
p = new Person();
p.setName("zhangsan");
}
接口
1. 接口和类有什么不同?
接口不是类, 不可以用 new
运算符实例化一个接口, 但是可以声明接口的变量.
不提 倡在同一行定义多个变量,而是分行逐一定义以提高可读性.
方法的签名只有方法名和参数类型,返回类型不是方法签名的的一部分.
对于数组类型的域,可以使用静态的 Arrays.equals 方法检测相应的数组元素是否相等.
集合
Java和C++的区别
概述
java和C++相同之处
- 都是面向对象类型的语言(继承, 封装, 多态)
- 都可以跨平台, 但是有很大差别
java和C++不同之处
- Java不提供指针让程序员管理内存, 而是自动内存管理机制, C++则是用指针管理内存.
- java的类是单继承的, 多态可以用多重继承接口实现, 而C++可以多重继承.
JAVA的基本程序设计结构
java所有的函数都是属于某个类的方法,所以main
方法必须有一个类的外壳.java的main
方法必须是静态的.
Java 没有任何无符号(unsigned ) 形式的 int、long、short 或 byte 类型。
java的int,short等类型实际的大小与目标平台有关,java无关.int四字节,long八字节,short二字节.
java中,整型值和布尔值之间 不能进行相互转换,但是在C++中,数值甚至指针可以代替 boolean 值。值0相当于布尔值 false, 非 0 值相当于布尔值 true.
java中的布尔类型为boolean,c++为bool.
在 Java 中,不区分变量的声明与定义,而C++int i = 10
为定义, extern int i
为声明.
java中使用final
定义常量,C++使用const
,不过java中const
为保留字,但目前没有使用.
在 C/C++ 中,不能保证》 是完成算术移位(扩展符号位)还是逻辑移位(填充 0 )。,实现者可以选择其中更高效的任何一种做法。这意味着C/C++»运算符对于负 数生成的结果可能会依赖于具体的实现。Java 则消除了这种不确定性.使用>>来进行算数移位扩展符号位,使用>>>来进行逻辑移位填充0.
Java 没有内置的字符串类型,而是在标准 Java类库中提供了 一个预定义类,很自然地叫做 String。
C++ 字符串是可修改的,也就是说,可以修改字 符串中的单个字符,但是java,String类型是不可变字符串,如果想改变,可以用字串加拼接再赋值给原变量来改变.
java字符串的相等要用s.equals(t)来比较,其中s和t可以为""
包裹的字符串,这和C++的==
不一样.java中的字符串==
是比较两个字符串是否在同一个位置而不是比较他们的字面量.
javaSE5沿用了C++的printf函数来控制格式化输出.
Java 的控制流程结构与 C 和C++ 的控制流程结构一样, 只有很少的例外情 况。没有 goto语句,但 break 语句可以带标签,可以利用它实现从内层循环跳出的目的(这种情况C语言采用 goto语句实现)。另外,还有一种变形的 for 循环,在 C 或 C++ 中 没有这类循环。它有点类似于 C# 中的 foreach 循环.
在 C++ 中,可以在嵌套的块中重定义一个变量。在内层定义的变量会覆盖在 外层定义的变量。这样,有可能会导致程序设计错误,因此在 Java 中不允许这样做。
与 C++ 不同,Java 没有提供运算符重载功能。程序员无法重定义 + 和 * 运算 符,使其应用于 Big丨nteger 类的 add 和 multiply 运算。Java 语言的设计者确实为字符串 的连接重栽了 + 运算符,但没有重载其他的运算符,也没有给 Java 程序员在自己的类中 重栽运算符的机会 ,
java允许声明一个长度为0的数组,但是C++不允许.
Java数组与 C++ 数组在堆栈上有很大不同,但基本上与分配在堆(heap) 上 的数组指针一样,Java 中的 [ ]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过 a +1得到数组的下一个元素。
在 C 语⾔中,字符串或字符数组最后都会有⼀个额外的字符‘\0’来表示结束。但是,Java 语言中没有结束符这⼀概念。
对象和类
很多人错误地认为 Java 对象变量与 C++ 的引用类似。然而,在 C++ 中没有 空引用,并且引用不能被赋值。可以将 Java 的对象变量看作 C++ 的对象指针.也就是如下是等价的:
Date birthday; // Java 实际上,等同于
Date* birthday; // C++
在 C++ 中,带有 const 后缀的方法是访问器方法;默认为更改器方法。但是, 在 Java 语言中,访问器方法与更改器方法在语法上没有明显的区别.
Java 构造器的工作方式与 C++ 样。但是,要记住所有的 Java 对象都是在 —
堆中构造的,构造器总是伴随着 new操作符一起使用。C++ 程序员最易犯的错误就是忘 记 new 操作符.
Employee number007("]anie5 Bond", 100000, 1950, 1, 1); // C++, not Java
在 C++ 中,通常在类的外面定义方法,如果在类的内部定义方法,这个方法将自动地成为内联(inline ) 方法.在 Java 中,所有的方法都必须在类的内部定义,但并不表示它们是内联方法。是否将某个方法设置为内联方法是 Java 虚拟机的任务。即时编译器会监视调用那些简洁、经 常被调用、没有被重载以及可优化的方法。
Java 中的静态域与静态方法在功能上与 C++ 相同。但是,语法书写上却 稍有所不同。在 C++ 中,使用::操作符访问自身作用域之外的静态域和静态方法,如 Math::PI.
术语“ static” 有一段不寻常的历史。起初,C 引入关键字 static 是为了表示退出一 个块后依然存在的局部变量在这种情况下,术语“ static” 是有意义的:变量一直存在,当再次进入该块时仍然存在。随后, static 在 C 中有了第二种含义,表示不能被其他文件 访问的全局变量和函数。为了避免引入一个新的关键字,关键字 static 被重用了。最后, C++ 第三次重用了这个关键字,与前面赋予的含义完全不一样,这里将其解释为:属于 类且不属于类对象的变量和函数。这个含义与 Java 相同。
Java 程序设计语言总是采用按值调用。C++ 有值调用和引用调用。 引用参数标有 & 符号。例如, 可以轻松地实现 void tripleValue(double& x) 方法或 void swap(Employee& x, Employee& y) 方法实现修改 它们的引用参数的目的。
在 C++ 中,经常用下划线或某个固定的字母(一般选用 m 或 x ) 作为实例域 的前缀例如,salary 域可能被命名为 salary、mSalary 或 xSalary Java 程序员通常不 这样做.
在 Java 中,this 引用等价于 C++ 的 this 指针。但是,在 C++ 中,一个构造 器不能调用另一个构造器 ,在 C++ 中,必须将抽取出的公共初始化代码编写成一个独立 的方法。
有些面向对象的程序设计语言,特别是 C++, 有显式的析构器方法,其中放置一些当对 象不再使用时需要执行的清理代码。在析构器中,最常见的操作是回收分配给对象的存储空 间。由于 Java有自动的垃圾回收器,不需要人工回收内存,所以 Java 不支持析构器。
C++ 程序员经常将 import 与 #include 弄混。实际上,这两者之间并没有共同 之处。在 C++ 中,必须使用 include 将外部特性的声明加栽进来,这是因为 C++ 编译器 无法查看任何文件的内部,除了正在编译的文件以及在头文件中明确包含的文件。Java 编译器可以查看其他文件的内部,只要告诉它到哪里去查看就可以了」 在 Java 中,通过显式地给出包名, 如java.util.Date, 就可以不使用 import ; 而在C++ 中,无法避免使用 include指令。
在 C++中, 与包机制类似的是命名空间(namespace)。在 Java 中,package 与 import 语句类似于 C+H 中的 namespace 和 using 指令。
继承
Java 与 C++ 定义继承类的方式十分相似。Java 用关键字 extends 代替了 C++ 中的冒号(:)。在 Java 中,所有的继承都是公有继承, 而没有 C++ 中的私有继承和保 护继承
.
已存在的类称为超类( superclass )、 基类( base class ) 或父类(parent class) ; 新类称为子类(subclass )、派生类 ( derived class ) 或孩子类(child class )。超类和子类是 Java 程序员最常用的两个术语.
在 Java 中使用关键字 super调用超类的方法,而在 C++ 中则采用超类名加 上::操作符的形式。例如,在 Manager 类的 getSalary 方法中,应该将 super.getSalary 替 换为 Employee::getSalary.
在 C++ 的构造函数中,使用初始化列表语法调用超类的构造函数,而不调用 super.
Java类之间并不允许多继承,只可以单继承和实现多接口。 一直以为接口也是,但是发现了下面这个(接口继承多接口) 查了一下发现:相对于C++ 一个接口则可以同时extends多个接口,却不能implements任何接口。
在 Java 中,不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。如 果不希望让一个方法具有虚拟特征,可以将它标记为 final (本章稍后将介绍关键字 final.
在C++中,有一种在尾部用 =0 标记的抽象方法,称为纯虚函数,例如:
class Person // C++
{
public:
virtual string getDescriptionO = 0;
}
只要有一个纯虚函数,这个类就是抽象类。在 C++ 中,没有提供用于表示抽象类的
特殊关键字.
事实上,Java 中的受保护部分对所有子类及同一个包中的所有其他类都可见, 这与 c++ 中的保护机制稍有不同,Java 中的 protected 概念要比 C++ 中的安全性差.
ArrayList 类似于 C++ 的 vector 模板。ArrayList 与 vector 都是泛型类型。但 是 C++ 的 vector 模板为了便于访问元素重栽了 [ ]运算符。由于 Java 没有运算符重栽, 所以必须调用显式的方法。此外,C++向量是值拷贝。如果 a 和 b 是两个向量,賦值 操作 a = b将会构造一个与 b 长度相同的新向量a, 并将所有的元素由 b拷贝到 a, 而在 Java 中,这条赋值语句的操作结果是让 a 和 b 引用同一个数组列表.
接口, lambda表达式与内部类
有些程序设计语言允许一个类有多个超类,例如C++。我们将此特性称为多重继承( multiple inheritance )。而Java 的设计者选择了不支持多继承,其主要原因是多继承会让语言 本身变得非常复杂(如同C++),效率也会降低如同 Eiffel )。 实际上,接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。
泛型
与 java— 样,在C++中,模板也是最先被添加到语言中支持强类型集合的。但是,多年之后人们发现模板还有其他的用武之地。学 习完本章的内容可以发现 Java中的泛型在程序中也有新的用途。
从表面上看,Java 的泛型类类似于 C++ 的模板类。唯一明显的不同是 Java 没 有专用的 template 关键字。但是,在本章中读者将会看到,这两种机制有着本质的区别。
在 C++ 中将类型参数放在方法名后面,有可能会导致语法分析的歧义。例如, b>(c)) 可以理解为“ 用 f<a, b>(c) 的结果调用 g”,或者理解为“ 用两个布尔值调用 g”.
在 C++ 中不能对模板参数的类型加以限制。如果程序员用一个不适当的类型 实例化一个模板,将会在模板代码中报告一个(通常是含糊不清的)错误消息, 但是java可以.
类型擦除:java泛型无论何时定义都自动提供一个相应的原始类型, 原始类型名就是删去类型参数后的泛型类型名, 擦除后的泛型将类型变量替换成Object(无限定的变量)或者限定类型, 就这点而言, Java 泛型与 C++ 模板有很大的区别。C++ 中每个模板的实例化 产生不同的类型,这一现象称为“ 模板代码膨账”, Java 不存在这个问题的困扰.
集合
C++ 注释:C++ 中的 bitset 模板与 Java 平台的 BitSet 功能一样
欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。