知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

java核心卷1

发表时间:2022-03-25来源:网络

第一章:java程序设计概述

白皮书术语

简单性:摒弃了c++难以理解的一些特性,可以说是c++的“纯净版”,另外一个方面的简单是小,解释器加上一些基础的类库,和对多线程的支持,大概需要175kb,这在当时来说已经是很大的成就了。面向对象:面向对象他是一种程序设计的技术,很显然java已经非常成熟的运用了这门技术,重点是对象,和对象的接口。制造一辆汽车,关心的是零件,而不是零件怎么制作的,java将c++的多继承转换为接口的方式更加容易让人理解,还有丰富的运行时自省的功能。分布式:java有丰富的例程库,用于处理http这样的协议,能够通过url访问打开网络上的对象,就像在本地打开一样健壮性:java采用的指针模型可以消除重写内存和数据损坏的可能,java编译器能够检测出其他语言在运行时才能检测的错误。安全性:一开始,java就设计成能够防范各种攻击,例如,运行时,堆栈溢出(蠕虫和病毒常用的手段),破坏自己进程之外的内存,未经授权读写文件。体系结构中立:生成与平台无关的字节码文件(经过编译的文件格式),可以通过特定的jvm在不同的平台生成不同的机器码,但是这种通过“虚拟机”生成代码的思路并不是新的,在之前的pascal,lisp,smalltalk早已采用这种技术,jvm有一个选项,就是将执行最为频繁的字节码序列翻译成机器码,这一过程叫做即时编译。可移植性:相对于c++或者c来说,其数据类型占用字节数是确定的,例如c的int可能是16位也可能是32位,但是java所有的平台都是32位高性能:java字节码可以(运行时)动态的翻译成运行这个应用的的特定cpu的机器码,java的即时编译技术已经非常成熟,甚至有时候超过了传统的编译器,还可以监控经常执行哪些代码并对他们加以优化,更为复杂的优化是使用内联(消除函数调用),即时编译知道哪些类已经被加载,基于已加载的类集,如果特定的函数不会被覆盖,就可以使用内联,必要时,还可以撤销优化。多线程:java是第一个支持并发编程的主流语言,而且在并发编程方面十分的出色
10.动态性:将一些代码添加到正在运行中的程序中,动态性是十分重要的,如在网上下载一段代码,然后再浏览器中打开这段代码,如果使用c或者c++是很难实现的

java applet

对于在internet上下载java字节码文件,并在本地运行(在网页中运行的java程序)称为applet,每次访问都能得到最新的applet,刚开始诞生的时候感觉会很流行,但是网景公司的浏览器和微软的ie浏览器因为使用的java版本不同,有些版本已经过时,难以将最新的Java版本开发的applet应用,随着后来adobe的falsh出场,和java的安全问题(就是访问一个applet,浏览器和java浏览器插件的限制变得越来越多),所以现在要想在浏览器中使用applet不仅要一定的水平而且要付出很大的努力,applet逐渐淘汰

java发展史


这张图片是不同的jdk版本出现的功能。

第二章:java环境

Java程序
Java图形程序
Javaapplet程序

第三章:java基本程序结构

一个简单的java程序

java从1.4开始,就强制要求主函数修饰符是publicjava没有为操作系统返回“退出代码”,如果main正常运行,程序的退出代码为0,如果想返回其他的代码需要调用Sytem.exit()方法

java注释

Java提供三种注释://,/* */这两种是单行和多行注释还有一种是/** */文档注释,可以用来自动生成文档,不能进行注释嵌套,一位只会和末尾的第一个 */进行匹配

数据类型

java提供了固定得数据范围,不像c++那样为了在特定平台得到更好得性能而采用不同范围,这样就会在移植平台的时候可能出现溢出的情况,而java提供的固定范围,可以很好的实现跨平台

java提供了八种基本数据类型

四种整数类型(int,short,long,byte):长整型后面可以添加一个L或者l,十六进制有一个前缀0x或者0X,八进制有0,二进制0b或者0B(从java7开始,可以用_下划线分割,这样更易读,编译器会将下划线去掉)

两种浮点型(float,double):
float有一个F或者f的后缀,double有D或者d的后缀,因为float精度很小,大多数情况都是double,所以一个小数不加任何后缀的情况下是double类型的。(double还有十六进制的表示方式例如0.125=2^-3,就可以表示为0x1.0p-3,这里的1.0是十六进制数,-3是十进制但是基数是2,所以表示就是1* 2的-3次方,还有常规的aeb表示形式)
浮点型数据不适合表示四舍五入的情况,因为java采用二进制系统保存,不能精确的还原二进制数,所以会和预想的结果可能不太一样,最好使用BigDecimal类。

一种表示unicode编码的char:
可以表示为十六进制值,范围从\u0000到\uffff,\u这个转义字符还可以出现在引号之外,其他的转义字符则只能在引号中间

unicode和char
char描述的是一个utf-16的代码单元(16位)

一种表示真值的Boolean
注意:java没有提供unsigned的修饰的类型
所有数值都遵守IEEE 754规范,Double.positive_infinity正无穷大,Double.negative_infinity负无穷大,Double.NaN不是数字

变量

java变量可以用字母和数字定义,但是必须由字母开头,java的数字和字母范围更加大,字母包括原来的字母还有_,$ ,以及本地语言的字母,在项目开发中因该避开使用$ ,因为这是留给一些工具产生的,或者编译器产生的

变量初始化

使用未初始化变量,编译器就会报错

常量

在java中,使用final代表常量
final修饰的常量只能被赋值一次, 而且不能修改,不然就会报错,习惯上把常量大写

运算符

除法运算/,当两边都是整数时,结果也会是整数,否则就会是浮点型(double)类型,整数除以0会报异常,浮点型除以0则会是正无穷大,或者是NaN
对于实现跨平台,想要实现浮点型的结果一致是有难度的,double是64位的存储一个数值,而 有些处理器是使用80位的寄存器,这些寄存器会进行中间结果的计算精度,这个结果会和64位的结果可能会不一样,所以java一开始是始终进行截断操作的,但是后来受到了反对,所以修改了,默认的话是不进行截断的,只有加了strictfp关键字的方法才会进行截断操作

数学函数和运算符

double Math.sqrt(double a)计算a的平方根
double Math.pow(double a,double b)计算a的b次方
Math.floorMod(int a,int b)
三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2

Math.log
Math.log10
Math.exp
Math.round(float) 四舍五入
常量π和E
Math.PI Math.E
为确保在所有平台上都有相同的数值,可以使用StrictMath类

数值类型之间的转换

如果一种位数多的类型向位数少的类型转换就会造成精度的丢失,有大类型的都会向大类型的转换,如int+double,double大一些,就会向double转换

虚线表示精度会有丢失,实线表示不会造成精度丢失
当超过转换的目标的范围,就会高位截断,例如(byte)300会转换成44(低八位)

强制类型转换

除了上面的自动类型转换,还有强制的,有些时候需要将大类型转换为小类型就需要在类型前面(目标类型),就可以强制类型转换

结合赋值和运算符

相当于两个赋值操作,如果最终赋值类型不等于左边的就会进行强制类型转换,例如,int x; x+=1.4;等价于x = (int)(x+1.4)

自增自减运算符

跟C语言一样,提供自增自减的运算符,有前缀和后缀的区别
注意:在表达式中尽量不要使用++运算符,可读性不高

关系运算符和Boolean运算符

用于检测相等或不等,值为true或者false

逻辑运算符

&& || !
前两个有短路的效果
!后面只能接boolean值

位运算符

& | ^ ~
按位与,按位或,按位异或
> >>>
左移位,右移位,无符号右移位
左移位会在右边补0
右移位会在高位补符号位
无符号右移位会在高位补0

移位运算符会在达到位数范围后从头开始,例如1仅对本类可见
public—>对所有类可见
protected–>对子类和同一个包的可见
default–>默认,仅对同一个包中的可见。

Object类

这是所有类的超类
使用Object类型可以引用任何类型的对象

在java中只有基本类型不是对象所有的数组类型,不管是对象数组还是基本类型类型数组都扩展了Object类。

equals方法

Object中的equals方法只会比较两个对象是否是同一个,这并没什么意义。一般进行重写比较状态是否相等。
为了防止隐式参数为空的情况,可以调用Objects.equals(object a,object b)方法,如果两个都是空返回true,否则调用String.equals

getClass方法返回一个对象所属的类

相等检测和继承

父类 instanceof 子类返回的是false,也就是说父类不是子类的实例。
如果equals比较的不是同一个类,则java规范要求equals方法具有以下特点

自反性:x.equals(x)返回true对称性:x.equals(y)和y.equals(x)应该返回相同结果传递性:x.equals(y)和y.equals(z)应该和x.equals(z)是相同结果一致性:对于反复测试x.equals(y)结果应该是一样的对于非空引用x,则x.equals(null)返回false

对于一个良好的equals方法应该是下面这样
6. 显示参数命名为otherObject
7. 检测this == otherObject(优化语句,这样比计较域付出的代价小很多)
8. 检测otherObject 是否为null(返回false)
9. 比较this和otherObject是否是同一个类(如果equals在每个子类中都有所改变就用getClass比较)getClass!=otherObject.getClass 返回false,如果在子类中都拥有统一的语义,那么久使用instanceof检测
10.将otherObject转化成other(强转)。
10. 比较域

注意:如果重写方法时,参数不一样,就不是重写,可以用@Override检测

hashCode方法

String类重写了hashCode方法

默认的hashcode方法返回的是对象存储的地址(native底层实现)
注意:如果重写了equals方法,那就必须重新定义hashcode方法,已便将对象插入到散列表中

Objects.hashCode方法提供安全的hashCode方法,如果参数为null则会返回0,否则就会调用hashCode方法
Objects.hash(…)可以组合多个散列值

如果存在数组类型的域,就可以使用Arrays.hashCode计算散列码,这个散列码是由数组元素的散列码组成的。

toString方法

使用getClass().getName()可以使得子类也能调用父类的toString方法。
只要让对象名加上一个字符串就能自动调用他的toString方法
Object类的toString方法是类名加上@和十六进制的散列码

java.lang.getClass()
java.lang.getSuperClass()

泛型数组列表

ArrayList类似数组,但是在删除和添加的时候能够自动调整数组容量。

声明数组列表

将new 和列表结合起来,赋值给一个变量,编译器会检查这个变量,并且将类型放到里面。
数组列表中管理着一个对象引用数组,如果这个数组的空间用完了,数组列表会自动创建一个更多的数组,并将所有的对象从较小数组拷贝到大数组中
add(E obj)总是返回true,在末尾添加元素obj
size返回数组列表元素个数
ensureCapacity(int capacity)确保数组列表在不重新分配内部存储数组的情况下有足够的容量存储给定数量的元素。
trimToSize()将列表存储容量消减到元素个数。

访问数组列表元素

使用get方法获取到第i个元素
set(i,ele) 用lel替换i位置

add(int i,E ele)后移元素,将i位置放为ele
E remove(int index)删除指定位置元素,返回被删除元素

自动包装器和自动拆箱

可以将自动装箱和拆箱应用到算术运算符,他会先进行拆箱,然后就行计算,再进行装箱。
数值类的包装类都继承自Number类。
自动装箱规范要求boolean,byte,char

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜