1、Java语言的特点
(1)简单易学,有丰富的类库。
(2)面向对象 (Java最重要的特性,让程序耦合度更低,内聚性更高)
(3)与平台无关性 (JVM是java跨平台使用的根本)
(4)可靠安全
(5)支持多线程
2、面向对象和面向过程的区别
- 面向过程: 是分析解决问题的步骤,然后用函数将这些步骤一个一个地实现,然后在使用的时候一一调用即可,性能高,所以单片机、嵌入式开发等一般采用面向过程开发。
- 面向对象: 是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述一个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护,易复用,易扩展。可以设计出低耦合的系统,但性能较面向过程差。
3、八种基础数据类型、大小、封装类
基本数据类型 | 大小(字节) | 默认值 | 封装类 |
---|---|---|---|
byte | 1 | 0 | Byte |
short | 2 | 0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0 | Long |
float | 4 | 0.0f | Float |
double | 8 | 0.0 | Double |
char | 2 | \u0000(null) | Character |
boolean | - | false | Boolean |
注意:
(1)基本数据类型与引用数据类型的差异:
int 是 基础数据类型,Integer 是 int 的封装类,属于引用数据类型。int 的默认值为 0 , Integer的默认值为 null,所以Integer能够区分出 0 和 null,当Java检测到null 时,就知道这个引用没有指向某个对象,在引用前必须指定一个对象,否则报错。
(2)关于数组对象赋值给另一个数组对象后,发生引用传递现象的原因:
基本数据类型在声明时系统会自动分配空间,而引用数据类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后可以赋值。数组对象赋值,也是将自己的地址,复制给另一个数组对象到引用空间,所以才会产生引用传递现象。
(3)boolean数据类型在Java中的特点
Java虽然定义了boolean这种数据类型,但是只对它提供了很有限的支持,在JVM中没有任何供boolean专用的字节码指令,Java语言表达式所操作的boolean值,在编译后使用JVM的 int 值代替,而 boolean 数组会被编码成JVM的 byte 数组,每个 boolean 元素占 8 位(1字节),这样我们能得出boolean 类型单独使用是 4个字节(int),在数组中使用则为 1 个字节(byte)。使用int的原因是对于 32 位CPU来说,一次处理数据是 32 位,具有高效存取的特点。
4、标识符的命名规则
- 标识符的含义: 是指程序中,自定义内容,例如类名,方法名,变量名等等都是标识符。
- 命名规则(必须): ① 标识符可以包含英文、数组、下划线以及美元符号。② 不能以数字作为开头。 ③ 标识符不能是关键字。
- 命名规范(非必须): 类名规范: 每个单词的首字符都大写(大驼峰模式);变量名规范: 首字符小写,其它单词首字符大写(小驼峰模式);方法名规范: 同变量名规范相同。
5、instanceof关键字的作用
- instanceof是什么?
interfaceof 严格来说是Java的一个双目运算符,用来测试一个对象是否为一个类的实例。 - 如何使用interfaceof?
boolean reasult = obj instanceofClass;
其中 obj 是对象,Class表示一个类或接口,当 obj 为 Class 的一个对象,或者是直接或间接子类,或者是接口的实现类,结果 reasult 都会返回为 true,否则返回 false。
注意: 编译器会检查obj是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行而定。
int i = 0;
//编译不通过,说明int不能直接转换为Integer
i instanceof Integer;
//编译不通过,因为int是基本数据类型,并不是引用数据类型
i instanceof Object;
Integer integer = new Integer(1);
//编译通过,说明integer能直接转换为Integer
integer instanceof Integer; //true
//编译通过,因为integer是引用数据类型,引用数据类型就是一个对象,是Object类的子类。
integer instanceof Object; //true
返回值为false的情景: JaveSE规范中对 intstanceof 运算符的规定就是:如果obj 为null,则返回false。
null instanceof Object; //false
6、Java的自动封箱与拆箱
- 装箱: 自动将基本数据类型转换为包装类型(int -> Integer);调用
Integer.valueOf(int)
实现。 - 拆箱: 自动将包装类型转换为基本数据类型(Integer -> int);调用
Integer.intValue()
实现。
在Java SE5 之前,如果要生成一个数值为 10 的 Integer 对象,必须使用 new 关键字实例化 Integer 对象。
Integer i = new Integer(10);
从Java SE5 之后,提供了自动装箱的特性,如果要生成一个数值为 10 的 Integer 对象,直接使用赋值进行生成。
Integer i = 10;
相关笔试题:
(1)以下代码会输出什么?
public class Main{
public static void main(String[] args){
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
}
运行结果
true
false
产生的原因: i1 与 i2 引用的对象是同一个,i3 与 i4 引用的对象是不同的。
Integer.valueOf 源码实现
当参数 i 的值在 [-128 , 127 ]内,则会返回一个指向IntegerCache.cache中已经存在的对象引用;否则创建一个新的Integer对象。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
(2)以下代码会输出什么?
public class Main{
public static void main(String[] args){
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
}
运行结果
false
false
Double.valueOf 源码实现
无论参数是多少,Double都会实例化一个Double对象。
public static Double valueOf(double d) {
return new Double(d);
}
7、重载与重写的区别
(1)重写(Override)
从字面上看,重写就是“ 重新写一遍 ”的意思。其实就是子类将父类的方法重新写一遍。
子类继承了父类原有的方法,但有时子类想要修改父类的方法,所以在方法名,参数列表,返回类型(除子类方法的返回值是父类方法返回值的子类)都相同的情况下,对方法进行修改或重写。
在重写时,应当注意子类函数的访问权限不能低于父类。
public class Father {
public static void main(String[] args) {
Son son = new Son();
son.sayHello();
}
public void sayHello(){
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
System.out.println("hello by son");
}
}
总结:
- 重载发生在父类与子类之间
- 方法、参数列表、返回类型(父类方法与子类方法的返回值必须是相同或有继承关系)必须相同
- 子类方法访问权限必须相同或大于父类
- 重写方法一定不能抛出新的Exception或使用更宽泛的Exception(例如直接抛出Exception)
(2)重载(Overload)
在一个类中,同名方法有不同的参数列表(类型不同、个数不同、顺序不同)则被视为重载。
public class