还是和往常一样,我以提问的方式回顾复习,今天回顾下Java小白入门应该知道的一些基础知识
Java语言有哪些特点呢?
- Java语言的特点有:
- 面向对象,主要是封装、继承、多态;
- 平台无关性,“一次编写,处处运行”,因此采用Java语言编写的程序具有很好的移植性;
- 支持多线程。C++没有内置的多线程机制,因此必须调用操作系统的API来完成多线程设计,而Java却提供了封装好多线程支持;
- 支持JIT编译,也就是即时编译器,它可以在程序运行时将字节码转换为热点机器码来提高程序的运行速度;
那么,刚刚提到了C++,Java语言和C语言有哪些区别呢?
- Java语言是一种跨平台的编程语言,通过在不同操作系统上安装对应版本的JVM以实现“一次编译,处处运行”的目的。而C语言需要在不同的操作系统上重新编译;
- Java实现了内存的自动管理,而C语言需要使用malloc和free来手动管理内存;
Java有哪些数据类型呢?
- Java的数据类型可以分为两种:基本数据类型和引用数据类型;
- 基本数据类型有:
- 数值型:
- 整数类型 byte、short、int、long
- 浮点类型 float、double
- 字符型-- char
- 布尔型-- boolean
- 数值型:
- 他们的默认值和占用大小如下所示
数据类型 | 默认值 | 大小 |
---|---|---|
boolean | false | 1字节或4字节 |
char | ‘\u0000’ | 2字节 |
byte | 0 | 1字节 |
short | 0 | 2字节 |
int | 0 | 4字节 |
long | 0L | 8字节 |
float | 0.0f | 4字节 |
double | 0.0 | 8字节 |
- 引用数据类型有:
- 类 class
- 接口 interface
- 数组 [ ]
再问个有趣的问题,Integer类型应该有数据范围,那么如果给Integer最大值+1,会是什么结果呢?
-
当给Integer.MAX_VLUE加1时,会发生溢出,变成Integer.MIN_VALUE;
-
这是因为Java 的整数类型采用的是二进制补码表示法,溢出时值会变成最小值。
-
Integer.MAX_VALUE 的二进制表示是 01111111 11111111 11111111 11111111(32 位)。
加 1 后结果变成 10000000 00000000 00000000 00000000,即 -2147483648(Integer.MIN_VALUE)。
-
Java面向对象编程有哪些特性呢?
- 面向对象编程有三大特性:封装、继承、多态
封装是什么?
- 封装是指将数据(属性,或者叫字段)和操作数据的方法(行为)捆绑在一起,形成一个独立的对象(类的实例)。
class Nvshen {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
}
- 可以看的出,女神类对外没有提供 age 的 getter 方法,因为女神的年龄要保密。
所以,封装是把一个对象的属性私有化,同时提供一些可以被外界访问的方法;
继承是什么呢?
- 继承允许一个类(子类)继承现有类(父类或者基类)的属性和方法。来提高代码的复用性,建立类之间的层次关系;
同时,子类还可以重写或者扩展从父类继承来的属性和方法,从而实现多态。
class Person {
protected String name;
protected int age;
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person {
private String school;
public void study() {
System.out.println("学习");
}
}
- Student 类继承了 Person 类的属性(name、age)和方法(eat),同时还有自己的属性(school)和方法(study)。
什么是多态呢?
- 多态允许不同类的对象对同一对象做出响应,但表现出不同的行为(即方法的多样性);
- 多态其实是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java 在运行时能根据对象类型的不同产生不同的结果。
- 多态的前置条件有三个:
- 子类继承父类
- 子类重写父类的方法
- 父类引用指向子类对象
//子类继承父类
class Wangxiaoer extends Wanger {
public void write() { // 子类重写父类方法
System.out.println("记住仇恨,表明我们要奋发图强的心智");
}
public static void main(String[] args) {
// 父类引用指向子类对象
Wanger wanger = new Wangxiaoer();
wanger.write();
}
}
class Wanger {
public void write() {
System.out.println("沉默王二是沙雕");
}
}
那么多态解决了什么问题呢?
- 多态指同一个接口或方法在不同的类中有不同的实现,比如说动态绑定,父类引用指向子类对象,方法的具体调用会延迟到运行时决定。
举例,现在有一个父类 Wanger,一个子类 Wangxiaoer,都有一个 write 方法。现在有一个父类 Wanger 类型的变量 wanger,它在执行 wanger.write()
时,究竟调用父类 Wanger 的 write()
方法,还是子类 Wangxiaoer 的 write()
方法呢?
//子类继承父类
class Wangxiaoer extends Wanger {
public void write() { // 子类覆盖父类方法
System.out.println("记住仇恨,表明我们要奋发图强的心智");
}
public static void main(String[] args) {
// 父类引用指向子类对象
Wanger[] wangers = { new Wanger(), new Wangxiaoer() };
for (Wanger wanger : wangers) {
// 对象是王二的时候输出:勿忘国耻
// 对象是王小二的时候输出:记住仇恨,表明我们要奋发图强的心智
wanger.write();
}
}
}
class Wanger {
public void write() {
System.out.println("勿忘国耻");
}
}
答案是在运行时根据对象的类型进行后期绑定,编译器在编译阶段并不知道对象的类型,但是 Java 的方法调用机制能找到正确的方法体,然后执行,得到正确的结果,这就是多态的作用。
多态的实现原理是什么呢?
- 多态是通过动态绑定实现的,Java使用虚方法表存储方法指针,方法调用时根据对象实际类型从虚方法表查找具体实现;