一、八种数据类型

  • 4种整数类型:byte、short、int、long
  • 2种浮点类型:float、double
  • 字符类型:char
  • 布尔类型:boolean

(一)赋值

  1. 没有超出变量的取值范围可直接赋值,否则出错。
  2. 将数字类型转换成字符类型时,只使用整数的低 16 位(浮点数类型将整数部分转换成字符类型)。
  3. 布尔类型不能与其他基本数据类型进行转换。
int a = (int) 800000000000L; //没加L出错,L表示其为long类型!
byte b = 30; 
short s = (short) '\u8000';
long l = 123323;
float f = (float) 3.14; //小数默认是double类型,float要转换!

(二)参数传递方式

Java只有值传递!

传递的类型无论是值类型还是引用类型,Java 都会在调用栈上创建一个副本,不同的是,对于值类型而言,这个副本就是整个原始值的复制;而对于引用类型而言,由于引用类型的实例存储在堆中,在栈上只有它的一个引用,指向堆的实例,其副本也只是这个引用的复制,而不是整个原始对象的复制。

二、一些关键字、方法、接口

(一)static

public class StaticTest {
    public static void main(String[] args) {
        // 静态初始化块的优先级最高,会最先执行,在非静态初始化块之前执行。
        // 静态初始化块只在类第一次被加载时执行,非静态初始化块在每次创建对象时执行一次,
        // 因此创建了多少个对象,就会执行多少次非静态初始化块。
        Son son = new Son(1);
        System.out.println("--------");
        Son son1 = new Son(2);
    }
}

class Parent {
    {
        System.out.println("Parent非静态代码块");
    }
    static {
        System.out.println("Parent静态代码块");
    }
    public Parent() {
        System.out.println("Parent构造函数");
    }
}

class Son extends Parent {
    private int num;
    private static int id = 2;

    static {
        System.out.println("Son静态代码块");
    }

    {
        num = 2;
        System.out.println("Son非静态代码块");
    }

    public Son(int num) {
        System.out.println("Son构造函数");
        this.num = num;
    }

    //静态方法只能访问静态的类成员,这里访问不到num
    public static void print_id() {
        System.out.println(id);
    }

    //实例方法既可以访问实例的类成员,也可以访问静态的类成员。
    public void print_Info() {
        System.out.println(num);
        System.out.println(id);
    }
}
/*
结果为:
Parent静态代码块
Son静态代码块
Parent非静态代码块
Parent构造函数
Son非静态代码块
Son构造函数
--------
Parent非静态代码块
Parent构造函数
Son非静态代码块
Son构造函数
*/

(二)final

// 修饰普通基本类型变量时,final能使变量的值无法改变,变量的值无法再被赋值。
// 下面无法进行a的赋值了。
final int a = 0;
// 修饰对象引用的变量时,final能保证变量不能再引用其他的对象,
// 不能保证当前引用对象内部的值不被修改。
final int[] b = new int[5];
b[0] = 1;

(三)equals

判断两个对象内容是否相同,应使用 equals 方法,而不能使用 ==,因为 == 作用于对象时判断的是两个对象是否具有相同的引用值。

(四)Comparable

public class OoTest {
    public static void main(String[] args) {
        List<People> list = new ArrayList<People>();
        list.add(new People("11",2,1));
        list.add(new People("22",4,2));
        list.add(new People("33",9,3));
        list.add(new People("44",1,4));
        Collections.sort(list);
        for (People l : list) {
            System.out.println(l);
        }
    }
}

class People implements Comparable<People> {
    private String name;
    private int age;
    private int id;

    public People(String name, int age, int id) {
         = name;
        this.age = age;
        this.id = id;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }

    @Override
    public int compareTo(People o) {
        if (this.age > o.age) {
            return 1;
        }
        return -1;
    }
}

三、面向对象的特征

封装、继承、多态

  • 封装:private,隐藏了类的内部实现机制,便于修改,增加代码可维护性;
  • 继承:extend,从已有的类中派生出新的类,增强代码的复用性;
  • 多态:三要素,增加了代码的可移植性、健壮性。
  • 继承
  • 重写
  • 父类引用指向子类对象

四、内部类

分为:静态内部类,成员内部类,局部内部类,匿名内部类四种

abstract class Inner4 {
    public String name;
    public Inner4(String name) {
         = name;
    }
    public abstract void print();
}

public class TestClass {
    private int a;
    private static int b;

    //静态内部类
    public static class Inner {
        //静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。
        //静态内部类可以访问外部类所有的静态变量和方法
        private static int c = 1;
        public static void print() {
            System.out.println(b);
            System.out.println(c);
        }
    }

    //成员内部类
    public class Inner2 {
        //成员内部类不能定义静态方法和变量
        public void print() {
            System.out.println(a);
            System.out.println(b);
        }
    }

    //局部内部类
    public void print() {
        class Inner3 {
            public void print() {
                System.out.println(a);
            }
        }

        new Inner3().print();
    }

    public void testInner4(Inner4 inner4) {
        System.out.println(inner4.name);
    }

    public static void main(String[] args) {
        TestClass testClass = new TestClass();
        testClass.print();
        TestClass.Inner.print();
        //匿名内部类
        testClass.testInner4(new Inner4("555") {
            @Override
            public void print() {
                System.out.println();
            }
        });
    }
}

五、拷贝

Student类如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class Student implements Cloneable{
    public String name;
    public Birth birth;

    @Override
    protected Student clone() {
        try {
            return (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    public Student clone2() {
        Student s = null;
        try {
            s = (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        s.birth = (Birth) birth.clone();
        return s;
    }
}

@AllArgsConstructor
@Data
@ToString
class Birth implements Cloneable{
    int year;
    int month;

    @Override
    protected Birth clone() {
        try {
            return (Birth) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

(一)直接复制

复制的是引用,即指向同一个对象

public static void directCopy() {
    Student s1 = new Student("A",new Birth(1999,10));
    Student s2 =  s1;
    System.out.println(s1.equals(s2));
    s1.setName("B");
    System.out.println(s2);
}

(二)浅拷贝

深浅拷贝可以通过构造函数,也可以通过实现Cloneable接口实现,这里采用继承Cloneable接口实现。
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

public static void shallowCopy() {
    Student s1 = new Student("A", new Birth(1999,10));
    Student s2 = s1.clone();
    s1.setName("B");
    s1.birth.setYear(1998);
    System.out.println(s2);
}

(三)深拷贝

深复制把要复制的对象所引用的对象都复制

public static void deepCopy() {
    Student s1 = new Student("A",new Birth(1998,2));
    Student s2 = s1.clone2();
    s1.setName("B");;
    s1.birth.setYear(2000);
    System.out.println(s1);
    System.out.println(s2);
}