Java语言基础
一、Java语法基础
1、八大基本数据类型
首先介绍位的概念: bit(位/比特位) 度量信息的最小单位,存在0和1两种状态。N个比特的信息量可表现为 2N 种。
- byte(字节):一个字节存储8位,一个字节的值域为-128~127,封装类为Byte,一般表示为两个16进制如:
byte a = (byte)0x7f; // a = 127
byte b = (byte)0x80; // b = -128
0x或0X为常用十六进制表示前缀
- short(短整型): 16位,值域为 -215 ~ 215-1,封装类为 Short
- int(整型): 32位,值域为 -231 ~ 231-1,封装类为 Integer
- long(长整型): 64位,值域为 -263 ~ 263-1,封装类为 Long
- float(单精度浮点型): 32位,值域为 1.4E-45 ~ 3.4028235E38,封装类型为 Float
- double(双精度浮点型):64位,值域为 4.9E-324 ~ 1.7976931348623157E308,封装类型为 Double
由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。
- boolean(布尔型):默认值为 false,封装类为 Boolean
- char(字符型):默认值为 \u0000;,封装类为Character
2、三大引用数据类型
引用数据类型一般通过 类 或 接口 进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储。简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。
简单来说,所有的非基本数据类型都是引用数据类型。下面将引用数据类型归为三大类:
1.数组
数组详细解析至文章2.1(未完成) ←链接快速访问
2.类
比如我们常用的 字符串类String
等
3.接口
接口详细解析至本文第五节
3、基本数据类型 和 引用数据类型 的区别
主要区别:基本数据类型是分配在栈上的,引用类型是分配在堆上的
栈、堆、队列概念详细解析至文章2.1(未完成)
4、重写和重载
重写:Override 在子类中把父类本身方法修改/重写一遍
重载:Overload 在一个类中,同名的方法有不同的参数列表
class SuperClass{
public void fun(){System.out.println("super");}
}
class SubClass extends SuperClass{
public void fun(){System.out.println("sub");} //方法重写
public void fun(int i){System.out.println("sub" + i);} //方法重载
}
二、Java语言三大特性
1、封装
是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
优点:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
封装的实现:
public class Student{
// 1.修改属性的可见性来限制对属性的访问
private String sno;
private String sname;
// 2.对每个值属性提供对外的公共方法访问
public void setSno(String sno){this.sno = sno;}
public String getSno(){return sno;}
}
2、继承
从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
Java不支持多继承,一个类只能有一个父类,但一个父类可以有多个子类。
一个类可以实现多个接口,从而克服单继承的缺点。
优点:
- 简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
- 减小代码和数据的冗余度,大大增加程序的重用性。
- 通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
继承的实现:
public class SuperClass{
}
public class SubClass extends SuperClass{
}
继承的特性:子类继承所有非private的成员
class Animal{
private String name="animal";
protected String braying="undefined";
public Animal() { System.out.println("super");}
public void getName(){ System.out.println("Name: " + name);}
public void bray() { System.out.println(braying + braying);}
}
class Cat extends Animal{
public Cat(){
super();
this.name = "猫";
//此处报错:The field Animal.name is not visible
this.braying = "喵";
}
}
public class Test {
public static void main(String[] args) {
new Cat().bray(); //输出:喵喵
new Cat().getName(); //输出:animal
}
}
3、多态
使同一个行为具有多个不同表现形式或形态的能力
多态的优点:
- 扩展性强
- 父类的变量可以赋值不同的子类对象,而调用不同的子类重写的方法
多态形成的三个条件:
- 继承
- 重写(见上)
- 父类引用指向子类对象(向上转型),如:
SuperClass sc = new SubClass(); //向上转型
三、接口
接口 是抽象方法的集合,定义与类的定义相似,关键词是interface
接口特点:
- 接口是抽象类,不能实例化
- 接口不能拥有成员变量,只能有public、static、final修饰的常量,且必须要赋初值
- 一个类可以实现多个接口,一个接口可以继承多个接口
- 接口中的方法只能是public、abstract的,且不能有具体实现内容,接口中不能存在静态方法
- 类实现接口时,若该类
不是抽象类
,则必须实现接口中所有
抽象方法
JDK1.8 以后允许接口拥有静态方法和方法体,允许接口拥有具体实现方法
JDK1.9 以后允许拥有private方法
接口的定义:
public interface Animal{
public abstract void bray();
public abstract void eat();
}
接口的实现:
public class Cat implements Animal{
public void bray(){
System.out.println("喵喵喵");
}
public void eat(){
System.out.println("吃鱼");
}
}
四、容器
将若干性质相同或相近的类对象组合在一起而形成的一个整体 叫做容器
Java容器主要两大顶层集合接口: Collection和Map
Array(数组) 和 ArrayList 的区别
- 数组可以保存基本数据类型和对象,ArrayList只能保存对象
int[] i = new int[20];
Student[] s = new Student[20];
List<Integer> l = new ArrayList<Integer>();
↑
只能使用包裹类或对象
- 数组大小固定,而ArrayList大小可变
- 数组保存的必须是同种类型,而ArrayList可以保存Object
数组 和 链表 详解至文章2.1(未完成)
五、异常(未完成)
六、泛型
Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型类
如1.4节中的 ArrayList 就是泛型类:
ArrayList<T> arrayList = new ArrayList<T>();
如何定义一个泛型类:
在类名后加上类型参数,甚至可以是多个参数<T,K,V...>
↓
class Printer<T> {
private T t;
public Printer(T t){
this.t = t;
}
public void print(){
System.out.println(""+t);
}
}
泛型方法
定义如下
public <T> void print(T t){}
七、反射
反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。
简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法。