Java学习笔记-20211127
🏟️

Java学习笔记-20211127

Property
notion image
一直想学Java,但是从来也没有系统性地学过,现在就开始系统性地学习一下吧。

0. 基本数据类型

byte:
  • byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最小值是:-128(-2^8);
  • 最大值是:127(2^8 - 1);
  • 默认值是:0;
  • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
  • 例子:byte a = 100, byte b = -50;
short:
  • short 数据类型是 16 位、有符号的以二进制补码表示的整数;
  • 最小值是:-32768(-2^16);
  • 最大值是:32767(2^16 - 1);
  • 默认值:0;
  • short 数据类型也可以像 byte 那样节省空间,一个 short 变量是 int 型变量所占空间的二分之一;
int:
  • int 数据类型是 32 位、有符号的以二进制补码表示的整数;
  • 最小值是:-2,147,483,648(-2^31);
  • 最大值是:2,147,483,647(2^31 - 1);
  • 一般地整型变量默认为 int 类型;
  • 默认值是:0;
long:
  • long 数据类型是 64 位、有符号的以二进制补码表示的整数;
  • 最小值是:9,223,372,036,854,775,808(-2^63);
  • 最大值是:9,223,372,036,854,775,807(2^63 -1);
  • 这种类型主要是用在需要比较大整数的系统上;
  • 默认值是:0L;
float:
  • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • float 在存储大型浮点数组的时候可节省内存空间;
  • 默认值是:0.0f;
  • 浮点数不能用来表示精确的值,如货币;
  • 例子:float f1 = (float) 234.5f;
double:
  • double 数据类型是双精度、64位、符合IEEE 754 标准的浮点数;
  • 浮点数的默认类型为 double 类型;
  • double 类型同样不能表示精确的值,如货币;
  • 默认值是:0.0d;
boolean:
  • boolean 数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是:false;
char:
  • char 类型是一个单一的 16 位 Unicode 字符;
  • 最小值是:\u0000(十进制等效值位0);
  • 最大值为:\uffff(即为65535);
  • char 数据类型可以储存任何字符;

1. 变量类型

在 Java 语言中,所有的变量在使用之前必须声明,声明变量的格式:
// type identifier [= value] [, identifier [= value]];
int a = 2;
double b = 1.2, c = 3.4;
char d;
Java 语言支持的变量类型有:
  • 类变量:独立于方法之外的变量,用 static 修饰;
  • 实例变量:独立于方法之外的变量,不过没有 static 修饰;
  • 局部变量:类的方法中的变量。
public class Variable{
    static int allClicks=0;    // 类变量
    String str="hello world";  // 实例变量
    public void method(){
        int i =0;  // 局部变量
    }
}
Java 类变量(静态变量):
  • 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外;
  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝;
  • 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变;
  • 静态变量存储在静态存储区,经常被声明为常量,很少单独使用 static 声明变量;
  • 静态变量在第一次被访问时创建,在程序结束时销毁;
  • 与实例变量具有相似的可见性,但为了对类的使用者可见,大多数静态变量声明为 public 类型;
  • 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化;
  • 静态变量可以通过:Classname.VariableName 的方式访问;
  • 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
Java 局部变量
  • 局部变量声明在方法、构造方法或语句块中;
  • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
  • 访问修饰符不能用于局部变量;
  • 局部变量只在声明它的方法、构造方法或者语句块中可见;
  • 局部变量是在栈上分配的;
  • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用;

2. 变量访问修饰符

Java 中可以使用访问控制符来实现对 类、变量、方法和构造方法的访问。Java支持四种不同的访问权限:
default(默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法;
private:在同一类内可见,使用对象:变量、方法。注意:不能修饰类(外部类);
public:对所有类可见。使用对象:类、接口、变量、方法;
protected:对同一包内的所有类和所有子类可见。使用对象:变量、方法。注意:不能修饰类(外部类);
 
图片:
notion image
 
访问继承与控制:
  • 父类中声明为 public 的方法在子类中也必须为 public;
  • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private;
  • 父类中声明为 private 的方法,不能够被继承;
 

3. 非访问修饰符

static 修饰符:可以修饰变量与方法,静态变量也称为类变量,局部变量不能被声明为 static 变量;静态方法不能使用类的非静态变量;
final 修饰符:被 final 修饰的变量一旦被赋值,将不可被改变,被 final 修饰的实例变量必须显式制定初始值;final 修饰的方法可以被子类继承,但是不能被子类重写,声明该方法的主要目的是防止该方法的内容被修改;final 类不能被继承,没有类可以继承 final 类的任何特性;
abstract 修饰符:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
synchronized 修饰符:该关键字声明的方法同一时间只能被一个线程访问。该修饰符可以用于四个访问修饰符;
transient 修饰符:序列化的对象包含被 transient 修饰的实例变量时,Java 虚拟机(JVM)跳过该特定的变量;该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型;
volatile 修饰符:volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值;

4. Java 中不常用的运算符

位运算符:
notion image
赋值运算符:
notion image
三元运算符:
variable x = (expression) ? value if true : value if false
Instanceof 运算符:
该运算符用于检测左侧变量所指的对象,是否是操作符右侧类或者一个接口的一个对象。
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
如果被比较的对象兼容于右侧类型,该运算符仍然返回true。
class Vehicle {}
 
public class Car extends Vehicle {
   public static void main(String[] args){
      Vehicle a = new Car();
      boolean result =  a instanceof Car;
      System.out.println( result);
   }
}

5. Java 基本数据类型 类封装

偶尔可能用到 基本数据类型 的类来创建对象,因此:
notion image
Math 类用以提供常见的数学运算的属性和方法,如初等指数、对数、平方根和三角函数等。Math 类的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
Math 类及 Number 类常用的类方法:
notion image
notion image
notion image
Math 类的 floor,round和ceil方法实例对比:
notion image

6. Java String 类

字符串广泛用在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串;
注意:String 创建的字符串存储在公共池上,而 new 创建的字符串对象在堆上;
notion image
String 类是不可改变的,一旦创建,值无法变化,如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
字符串长度:使用length方法获取字符串对象包含的字符数;
连接字符串:String类提供了连接两个字符串的方法,concat;
notion image
notion image
notion image
notion image

7. StringBuilder与StringBuffer类

相比于 String 类,StringBuilder 与 StringBuffer 类主要是 String 类的动态版本;
String类由Finial修饰,创建之后无法很好地更改,因此每次拼接字符串时都需要重新进行分配空间,比较消耗内存;
StringBuilder 修改字符串时不会使用新的内存,而是在原有的对象上进行操作;
StringBuffer 与 StringBuilder 的区别是,前者线程安全,后者速度更快;
notion image
notion image
 
评论指出,StringBuffer 的线程安全没有必要,还浪费了不少性能:
notion image

8. Java 数组

声明数组一般有两种方法,首选第一种,第二种是来自于C/C++,方便其他语言的程序员快速熟悉Java语言:
dataType[] arrayRefVar;

dataType arrayRefVar[];
数组的长度通常使用 length 获取,处理数组元素通常使用基本循环或者 For-Each 循环:
public class TestArray {
   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};
 
      // 打印所有数组元素
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] + " ");
      }
      // 计算所有元素的总和
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println("Total is " + total);
      // 查找最大元素
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println("Max is " + max);
   }
}
JDK 1.5 之后使用了一种新的循环类型,被称为 For-Each 循环或者加强型循环,可以在不使用下标的情况下遍历数组;
for(type element: array)
{
		System.out.println(element);
}
多维数组的动态初始化:
type[][] typeName = new type[typelength1][typelength2];
notion image

9. Java 日期时间

java.util 包提供了 Date 类来封装当前的日期和时间,提供两个构造函数来实例化 Date 对象;