Java基础(搬砖整理,侵权删文)
一、Java概述
1、JVM、JRE、JDK的关系
JVM是Java虚拟机,Java程序要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
JRE是Java虚拟机和Java程序所需要的核心类库等。核心类库主要是java.lang包:包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。如果想运行一个开发好的Java程序,计算机只需安装JRE即可。
JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包含JRE。所以安装了JDK就无需再安装JRE了。其中的开发工具:编译工具、导包工具等。
2、跨平台性及原理
是指Java语言编写的程序,一次编译之后,可以在多个系统平台上运行。实现原理:Java程序是通过Java虚拟机在系统平台上运行的,只要该系统装载相应的JVM,该系统就可以运行Java程序。
3、Java语言的特点
简单易学(语法与C、C++相近)、面向对象(封装、继承、多态)、平台无关性(JVM实现)、支持网络编程且很方便(本身就是为简化网络编程设计的)、支持多线程(多线程机制使应用程序在同一时间执行多项任务)、健壮性(强类型机制、异常处理、垃圾自动回收)、安全性等。
4、字节码及其好处
Java源码经过虚拟机编译器编译后产生的文件(.class文件),他不面向任何特定的处理器,只面向虚拟机。
好处:Java语言通过字节码的方式,在一定程度解决了传统解释性语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且由于字节码不专对一种特定的机器,因此Java程序无需重新编译便可在多种不同的计算机上运行。
5、解释器与编译器
Java中引入虚拟机的概念,即在机器与编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码,java源程序经过编译器编译成字节码,字节码再由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器的机器码,在特定机器上执行。
Java源码->编译器->jvm可执行的字节码->jvm->jvm解释器->机器可执行的二进制机器码->程序运行。
6、Java中的主类?应用程序与小程序的主类有何不同?应用程序与小程序有何不同?
一个程序可以有多个类,但只有一个类是主类,在Java应用程序中,主类是指包含main方法的类,而在Java小程序中,主类是一个继承自系统类JApplet或Applet的子类,应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口。
简单说应用程序时从主线程启动(也就是main方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash小游戏类似。
7、Java与C++的区别
1、都是面向对象语言,都支持封装、继承、多态
2、Java不提供指针来直接访问内存,程序内存更加安全
3、Java类是单继承的,C++的类是多重继承的;Java中的接口可以实现多继承
4、Java有自动内存管理机制,不需要程序员手动释放无用内存。
二、基础语法
1、Java中的数据类型
1、基本数据类型:
数值型:整数类型(byte,short,int,long) 浮点类型(float,double)
字符型:char
布尔型:boolean
2、引用数据类型:
类class 接口interface 数组[]
2、一些关于数据类型的问题
1、switch能否作用在byte上,能否作用在long上,能否作用在string上?
在Java5以前,switch(expr)中expr只能是byte、short、char、int。Java5之后引入了人枚举类型,expr也可以是enum类型,从Java7开始,expr还可以是字符串,但是长整型long在所有的版本中都是不可以的。
2、用最有效率的方法计算2*8
2<<3(2左移3位相当于乘以2的三次方,右移三位相当于除以2的三次方)
3、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
12和-11,四舍五入的原理是在参数上加0.5然后向下取整。实际上,Math.round参用的是国际通行的banker算法,四舍六入五取偶,概括为:四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一。
4、float f = 3.4是否正确
不正确,3.4是双精度数,将双精度数double赋值给浮点型float属于向下转型,会造成精度损失,因此需要强制类型转换float f = (float)3.4,或这写成float f = 3.4F。Java中浮点数在没有声明的情况下,都默认为double。
5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1也是int类型,需要强制类型转换才能赋值给short型。而对于short s1 = 1; s1 += 1;可以正确编译,因为s1+=1其中隐含了强制类型转换。
6、运算符&和&&的区别
&有两种用法:1、按位与 2、逻辑与。&&运算符是短路与运算,逻辑与和短路与的差别非常大,虽然二者都是要求运算符两侧的布尔值为true整个表达式才为true。&&之所以称为短路与运算,是因为如果&&左边的表达式的值是false,右边的表达式会直接被短路,不会进行计算。逻辑或|和短路或||的差别也是如此。
3、编码及注释
Java中采用Unicode(标准码)编码标准,他为每一个字符制定了一个唯一的数值,因此在任何语言和平台,程序都能放心使用。
注释是用于解释说明程序的文字。有单行注释“//注释文字”,多行注释“/注释文字/”,文档注释“/注释文字/”。作用:在程序中,尤其是复杂的程序中,适当的田间注释可以增加程序的可读性,有利于对程序的修改、调试和交流。注释的内容在程序编译的时候会被忽略,不会产生目标代码,注释部分不对程序执行产生任何影响。注意事项:多行注释和文档注释都不能嵌套使用。
4、访问修饰符
Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。
private:在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)。
default:(即缺省,不使用任何关键字)在同一包内可见,不使用任何修饰符。适用对象:类、接口、变量、方法。
protected:对同一包内的类和所有子类可见。适用对象:变量、方法。注意:不能修饰类(外部类)。
public:对所有类可见。适用对象:类、接口、变量、方法。
5、关键字
1、Java中有没有goto
goto是Java中的保留字,在目前版本的Java中没有使用。
2、final的作用
用于修饰类、属性、方法。
1、被final修饰的类不可以被继承。
2、被final修饰的方法不可以被重写。
3、被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的。
3、final、finally、finalize的区别
final可以修饰类、变量、方法,修饰的类不能被继承,修饰的方法不能被重写,修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码放在finally代码块中,不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc()方法时,由垃圾回收器调用finalize()回收垃圾,一个对象是否可回收最后判断。
4、this关键字的用法
this自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。用法有三种:
1、普通的直接引用,this相当于是指向当前对象本身。
2、形参与成员名字重名,用this来区分。
public Person(String name, int age) {
this.name = name;
this.age = age;
}
3、引用类本身的构造函数。
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
}
5、super关键字的用法
super可以理解为是指向自己超类(父类)对象的一个指针,而这个超类指的是离自己最近的一个父类。super也有三种用法:
1、普通的直接引用:与this类似,super相当于是指向当前对象的父类引用,这样就可以用super.xxx来引用父类对象的成员。
2、子类中的成员变量或方法与父类中的成员或方法同名时,用super区分。
class Person{
protected String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person{
private String name;
public Student(String name, String name1) {
super(name);
this.name = name1;
}
public void getInfo(