javaSE基础知识总结—基础部分

javaSE基础知识总结

java基本介绍
1、什么是java?
Java是由Sun公司于1995年推出的Java 面向对象程序设计语言和Java平台的总称。
2、java语言的主要特点/优点
1.简洁有效
Java语言是一种相当简洁的“面向对象”程序设计语言。Java语言省略了C++语言中所有的难以理解、容易混淆的特性,例如头文件、指针、结构、单元、运算符重载、虚拟基础类等。它更加严谨、简洁。
它对硬件的要求比较低,Java语言采用了特殊的软件构造方法,可以在很小的机器上独立运行。只要40K就可以容下一个最基本的解释器,即使加上基本标准库和线程支持,也仅需再加上175K就够的。这也是Java语言的一个成功秘诀。

2.高可移植性
使用Java语言编写的程序,只要做较少的修改,甚至有时根本不需修改就可以在不同平台上运行了,Java绝对是跨平台的一门编程语言。

举个例子,不同平台上对数据类型的大小有不同的规定。在有的平台上,整型(int)是用一个16位二进制数表示,而有的平台上则是使用一个32位二进制数表示的。C/C++语言并没有屏蔽掉这个由不同平台造成的不同。这样如果在一个使用16位二进制数表示整型的平台上开发的C语言源程序,要在一个使用32位二进制数表示整型的平台上运行,简直就是噩耗。

而在Java语言中,就屏蔽掉了这种由平台造成的不同。Java中的整型数是一定是由32位二进制表示的,Java虚拟机将这个差别消化了。当我们想将一个使用16位二进制数表示整型的平台上开发的Java语言源程序,移植到一个使用32位二进制数表示整型的平台上运行,就不用修改了。

Java语言具备这种高移植性是一种必然,因为它的设计理念就是“一次编写,到处运行”。

3.“面向对象”

4.解释型

解释型语言效率低,速度慢;编译型语言效率高,速度快。

Java语言是一种解释型语言。对,没看错,它是一种解释型语言,也就是说,相对于C/C++语言来说,Java语言写出来的程序效率低,执行速度慢。但它正是通过在不同平台上运行Java解释器,对Java代码进行解释,来实现“一次编写,到处运行”的宏伟目标的。为了达到目标,牺牲效率还是值得的,再说,现在的计算机技术日新月异,运算速度也越来越快,用户不会感到太慢的。

一些提示:

其实Java语言并不是象Basic语言那样完全的解释性,它是一种解释型与编译 型的折中。使用Java语言编写程序,首先用编辑软件或集成开发环境(IDE)编写源程序,然后使用Java编译器进行一次伪编译,将其编译成为中间码(也称字节码)。然后再使用Java解释器进行解释。

5.适合分布式计算

Java语言具有强大的、易于使用的连网能力,非常适合开发分布式计算的程序。Java应用程序可以象访问本地文件系统那样通过URL访问远程对象。

使用Java语言编写Socket通信程序十分简单,使用它比使用任何其它语言都简单。而且它还十分适合于开发公共网关接口(CGI)脚本的开发,另外还可以使用Java小应用程序(Applet)、Java服务器页面(Java Server Page,简称JSP)、Servlet等等手段来构建更丰富的网页。

6.拥有较好的性能

正如前面说到,由于Java是一种解释型语言,所以它的执行效率相对就会慢一些,但由于Java语言采用了两种手段,使得其性能还是不错的。

1) Java语言源程序编写完成后,先使用Java伪编译器进行伪编译,将其转换为中间码(也称为字节码),再解释;

2) 提供了一种“准实时”(Just-in-Time,JIT)编译器,在需要更快的速度时,可以使用JIT编译器将字节码转换成机器码,然后将其缓冲下来,这样速度就会更快。

一些提示:

这种JIT编译器,顾名思义,Just-In-Time,仅在运行时才进行,将其编译成为平台相关的机器码(由于现在已经运行了,无需再考虑可移植性)。这样处理后,可以带来10倍甚至20倍的速度提升。而且这个技术正在不断地得到改正,今后JIT编译器将更加智能,能够监测出哪些代码经常执行,从而对其进行适当的优化,进一步加快执行速度。

7.健壮、防患于未然

Java语言在伪编译时,做了许多早期潜在问题的检查,并且在运行时来做了许多相应的检查,可以说是最严格的一种“编译器”。它的这种“防患于未然”的手段将许多程序中的错误扼杀在摇蓝之中。经常有许多在其它语言中必须通过运行才会暴露出来的错误,在编译阶段就被发现了。另外,在Java语言中还提供了许多保证程序稳定、健壮的特性,有效地减少了错误,这样使得Java应用程序更加健壮。

8.具有多线程处理能力

线程,是一种轻量级进程,是现代程序设计中必不可少的一种特性。多线程处理能力使得程序能够具有更好的交互性、实时性。Java在多线程处理方面性能超群,具有让你惊喜的强大功能,而且在Java语言中进行多线程处理很简单。

注意:

要注意的是,各主流平台在线程的实现上千差万别,所以Java语言也暂时无法在这方面做到“与平台无关”,所以Java为不同的操作系统各实现了一套多线程机制。并且对于程序员来说,不同的机器上,调用多线程机制的代码还是相同的。

9.具有较高的安全性

由于Java语言在设计时,在安全性方面考虑很仔细,做了许多探究,使得Java语言成为目前最安全的一种程序设计语言,至今所发现的安全隐患都是很微不足道的问题。

10.是一种动态语言

Java是一种动态的语言,这表示在以下两个方面:

1) 在Java语言中,可以简单、直观地查询运行时信息;

2) 可以将新代码加入到一个正在运行的程序中去。
11.中性的对象语言
“Java编译器生成的是一种中性的对象文件格式。”也就是说,Java编译器通过伪编译后,将生成一个与任何计算机体系统无关的“中性”的字节码。这种中性结构其实并不是Java首创的,在Java出现之前UCSD Pascal系统就已在一种商业产品中做到这一点,另外在UCSD Pascal之前还有这种方式的先例,那就是Niklaus Wirth实现的Pascal语言中就采用了这种降低一些性能,换取更好的可移植性和通用性的方法。Java的这种字节码经过了许多精心的设计,使得其能够很好地兼容于当今大多数流行的计算机体系统,可以在任何机器上易于解释,易于动态翻译成为机器代码。

3、java(面向对象)的三大特性/四大特性(多了一个抽象)

· 抽象

o 忽略一个主题中与当前目标无关的东西,专注的注意与当前目标有关的方面.(就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口).抽象并不打算了解全部问题,而是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一个数据抽象,而是过程抽象.

o 数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)

o 过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)

· 封装

o 封装就是把过程和数据包围起来,对数据的访问只能通过特定的界面.如私有变量,用set,get方法获取

· 继承

o 一种联结类的层次模型,并且允许和鼓励类的重用,提供一种明确表达共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),原始类称为新类的基类(父类).派生类可以从它的父类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要.因此可以说,继承为了重用父类代码,同时为实现多态性作准备.

· 多态

o 多态是指允许不同类的对象对同一消息做出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活/抽象/行为共享/代码共享的优势,很好的解决了应用程序函数同名问题.总的来说,方法的重写,重载与动态链接构成多态性.java引入多态的概念原因之一就是弥补类的单继承带来的功能不足.

o 动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接.

注意继承与重载:子类与父类的关系,重载方法的调用问题

子类对象可以直接当成父类对象用,但是反过来就不行.比如:人是父类,学生是人的子类,所以学生对象一定具备人对象的属性,但是人对象就未必具有学生对象的特性.但是子类对象当做父类来用,将失去子类所有特性,只保留与父类同名的属性和方法,此时可以对父类方法进行重写.

一个类中如果定义了重载的方法,则系统在调用方法时,会根据参数的类型自动选择调用合适的方法

4、java如何保证跨平台性?
JVM: Java 编译器可生成与计算机体系结构无关的字节码指令,字节码文件不仅可以轻易地在任何机器上解释执行,还可以动态地转换成本地机器代码,转换是由 JVM 实现的,JVM 是平台相关的,屏蔽了不同操作系统的差异。

语言规范: 基本数据类型大小有明确规定,例如 int 永远为 32 位,而 C/C++ 中可能是 16 位、32 位,也可能是编译器开发商指定的其他大小。Java 中数值类型有固定字节数,二进制数据以固定格式存储和传输,字符串采用标准的 Unicode 格式存储。

5、jdk,jre,jvm的联系
简单的说,
JDK包含了JRE,JRE包含了JVM

详解
JDK: java development kit, java开发工具包,用来开发Java程序的,针对java开发者。
JRE: java runtime environment, java运行时环境,针对java用户
JVM: java virtual machine,java虚拟机 用来解释执行字节码文件(class文件)的。
)
JVM 是什么
JVM:Java Virtual Machine(Java 虚拟机)JVM是JRE的一部分,它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

JVM是Java实现跨平台最核心的部分,所有的Java程序会首先被编译为.class的类文件,JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。Java面对不同操作系统使用不同的虚拟机,依次实现了跨平台。JVM对上层的Java源文件是不关心的,它关心的只是由源文件生成的类文件。

JRE是什么?
JRE:Java Runtime Environment(Java运行环境)。在Java平台下,所有的Java程序都需要在JRE下才能运行。只有JVM还不能进行class的执行,因为解释class的时候,JVM需要调用解释所需要的类库lib。JRE里面有两个文件夹bin和lib,这里可以认为bin就是JVM,lib就是JVM所需要的类库,而JVM和lib合起来就称为JRE。

JRE包括JVM和JAVA核心类库与支持文件。与JDK不同,它不包含开发工具—-编译器、调试器和其它工具。

JDK是什么?
JDK:Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java的运行环境(Java Runtime Environment)、一堆Java工具(javac、java、jdb等)和Java基础的类库(即Java API包括rt.jar)。

Java API是Java的应用程序接口,里面有很多已经写好的Java Class,包括一些重要的语言结构以及基本图形,网络和文件I/O等等,我们可以直接调用使用。

现在已经有很多版本的JDK,除了Sun公司,还有很多公司都开发了属于自己的JDK,如IBM、淘宝等。据说IBM的JDK运行效率比Sun的还要高,但是不管怎么说还是先把基础的Sun JDK学好。
总结:

有JVM就可以解释执行字节码文件(.class).
JVM解释执行这些字节码文件的时候需要调用类库,如果没有这些类库JVM就不能正确的执行字节码文件,JVM+类库=JRE,
有了JRE就可以正确的执行java程序了,但是光有JRE不能开放Java程序,所以JRE+开发工具=JDK,有了JDK,就可同时开发,执行JRE.
两个JRE,都有什么作用?
我们平时开发Java程序的时候,都会同时安装JDK和JRE:
JDK和JRE

JDK里面的JRE安装路径:D:\dev\java\jdk1.8.0_91\jre
JDK外面的JRE安装路径:D:\dev\java\jre1.8.0_91
JDK里面的JRE是JDK自带的为其开发工具提供运行环境的JRE,在JDK中有很多用Java编写的开发工具(如: javac.exe、jar.exe),这些工具的实现代码在JDK下面的lib目录下的tools.jar中,也就是路径:D:\dev\java\jdk1.8.0_91\lib\tools.jar里面。

JDK外面JRE用于为Java程序提供运行环境。

两个JRE的异同
相同点:这两个JRE都可以作为开发Java程序的运行环境。
不同点:JDK自带的开发工具只能使用JDK自己目录下的JRE,不能使用JDK外面的JRE。
实际开发情况
我们开发的实际情况是:我们利用JDK(调用本地的API)开发属于自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解释这些字节码,映射到CPU指令集或OS的系统调用。

6、java是按值调用还是按引用调用?
按值调用指方法接收调用者提供的值,按引用调用指方法接收调用者提供的变量地址。
Java 总是按值调用,方法得到的是所有参数值的副本,传递对象时实际上方法接收的是对象引用的副本。方法不能修改基本数据类型的参数,如果传递了一个 int 值 ,改变值不会影响实参,因为改变的是值的一个副本。可以改变对象参数的状态,但不能让对象参数引用一个新的对象。如果传递了一个 int 数组,改变数组的内容会影响实参,而改变这个参数的引用并不会让实参引用新的数组对象。

7、浅拷贝和深拷贝的区别?
浅拷贝: 只复制当前对象的基本数据类型及引用变量,没有复制引用变量指向的实际对象。修改克隆对象可能影响原对象,不安全。
深拷贝: 完全拷贝基本数据类型和引用数据类型,安全。

8、类和类之间,接口和接口之间都是extends关系,只有类和接口之间是implements关系

9、基本数据类型,基本数据类型参考1基本数据类型参考2 ,引用数据类型分为class类型,interface类型,array类型,null类型在这里插入图片描述
10、&与&&

11、数组参考

12、string字符串常量池占坑,可以看jvm的视频复习。

13、static详解

14、写java的时候,遇到long跟float的转换会比较少见,但遇到的时候可能会遇到一个小坑,那就是明明float是4个字节的,而long是8个字节的,可是范围确实float大。也就是说float转long需要强制类型转换,而long转float可以直接隐式转换。

这个情况的原因在于,float占的4个字节,也就是32位二进制中,1位是符号位,23位是尾数位,剩下的8位是指数位,8位代表0~255,根据IEEE 754规定,0代表0,255代表无穷大,剩下1254,每个减去127,代表-126127这个指数范围,也就是说float的幂级数大致范围是2的-126次幂到127次幂之间,而long是8个字节,也就是64位,除去符号位,范围在只有2的63次幂,远远小于float。参考了https://blog.csdn.net/u014044032/article/details/84935239
15、java中的fail-fast机制(快速失败机制)
16、hashcode详解
17、java中的异或运算符为:^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值