Java基础(一)
Java语言的特点
- 简单
- 面向对象(封装、继承、多态)
- 平台无关(JVM实现)
- 可靠
- 安全
- 支持多线程
- 支持网络编程
- 编译与解释并存
JVM、JDK和JRE
- JVM:Java虚拟机,是运行Java字节码的虚拟机。
- Java程序从源代码到运行一般有下面3步:
- .java文件–JDK中javac编译–>.class文件–JVM–>机器可执行的二进制码
- JDK:JavaDevelopment Kit,开发工具包。
- JRE:Java运行时环境。
Java基本类型所占存储空间大小
基本类型 | 大小 | 最小值 | 最大值 | 包装类 |
---|---|---|---|---|
boolean | ? | ? | ? | Boolean |
char | 16bit | 0 | 2^16-1 | Character |
byte | 8bit | -128 | +127 | Byte |
short | 16bit | -2^15 | +2^15 | Short |
int | 32bit | -2^31 | +2^31-1 | Integer |
long | 64bit | -2^63+2^63-1 | Long | |
float | 32bit | IEEE754 | IEEE754 | Float |
double | 64bit | IEEE754 | IEEE754 | Double |
void | ? | ? | ? | Void |
重载与重写的区别
- 重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
- 重写:子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围<=父类,抛出异常范围<=父类,访问修饰符范围>=父类,若父类方法是private,则子类不能重写。
Java面向对象的三大特性
- 封装
- 把对象的属性私有化,同时提供一些可以被外界访问属性的方法。
- 继承
- 使用已存在的类的定义作为基础类建立新的类。
- 子类拥有父类对象的所有属性和方法(包括私有的),但父类中的私有子类是无法访问的,只是拥有。
- 子类可以拥有自己的属性和方法,即对父类拓展。
- 子类可以用自己的方式实现父类的方法(重写)。
- 使用已存在的类的定义作为基础类建立新的类。
- 多态
- 一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
String、StringBuffer和StringBuilder
- 可变性:
String
使用final
关键字修饰char数组,所以String
对象是不可变的。而StringBuffer
和StringBuilder
没有使用final修饰,因此可变。 - 线程安全性:
String
对象不可变,安全。StringBuffer
对方法加锁,安全。StringBuilder
没有加锁,不安全。
自动装箱与拆箱
- 装箱:基本类型->包装类
- 拆箱:包装类->基本类型
接口和抽象类的区别
- 接口的方法默认
public
,不能有实现(Java 8接口方法有默认实现),抽象类可以有非抽象方法。 - 接口中除了
static
、final
变量,不能有其他变量,抽象类则不一定。 - 一个类可以实现多个接口,但只能继承一个抽象类。
- 接口方法默认修饰符是
public
,抽象方法可以有public
、protected
和default
。 - 抽象是对类的抽象,是一种模板设计,接口是对行为的抽象,是一种行为规范。
==与equals()
- ==:判断两个对象的地址是否相等,即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
- equals():判断两个对象是否相等。一般有两种情况:
- 类没有重写
equals()
,则通过equals()
比较两个对象时,等价于“==”比较这两个对象。 - 类重写
equals()
。重写一般是来比较两个对象的内容是否相等,相等返回true
。例子
1
2
3
4
5
6
7
8String a = new String("ab"); //a为一个引用
String b = new String("ab"); //b为另一个引用,对象的内容一样
String aa = "ab"; //放在常量池中
String bb = "ab"; //从常量池中查找
if(aa == bb) //true,同一个对象
if(a == b) //false,不是同一个对象
if(a.equals(b)); //true
if(42 == 42.0) //true说明
- 类没有重写
- String中equals()方法被重写过,Object的equals()比较的是对象的内存地址,String中的equals()比较的是对象的内容。
hashCode与equals
- hashCode():作用是获取哈希码,也称散列码。返回的是一个int,确定对象在哈希表中的索引位置。
- 具体作用:“以HashSet如何检查重复”为例,当把对象加入HashSet时,先计算对象的hashCode来判断对象的加入位置,同时也会与该位置其他已经加入的对象的hashCode作比较,如果没有相等的hashCode,HashSet会假设对象没有重复出现。但如果发现有相同hashCode的对象,这是会调用equals()来检查hashCode相等的对象是否真的相同(是否是同一个对象)。如果相同,就加入失败。如果不同,就会重新散列到其他位置,这样就减少了equals()的次数,提高了执行效率。
- hashCode()与equals()的相关规定
- 如果两个对象相等,则hashCode一定相同。
- 两个对象相等,对两个对象调用equals()返回true。
- 两个对象的hashC相同,它们不一定相等。
- 如果equals()被重写,则hashCode()也必须被重写。
- hashCode()默认对堆上的对象产生独特值,如果没有重写hashCode(),则该class的两个对象无论如何都不会相等。(即使两个对象内容相等)