java小知识点总结( CS-Notes)

JAVA基础

1.数据类型

  1. 基本类型与包装类型之间的赋值使用自动装箱与拆箱
Integer x = 2;     // 装箱 调用了 Integer.valueOf(2)
int y = x;         // 拆箱 调用了 X.intValue()
  1. new Integer()与Integer.valueOf()区别
    • new Integer()每次都会新建一个对象
    • Integer.valueOf()会使用缓存池中的对象,多次调用会取得同一个对象的引用
    Integer x = new Integer(123);
    Integer y = new Integer(123);
    System.out.println(x == y);    // false
    Integer z = Integer.valueOf(123);
    Integer k = Integer.valueOf(123);
    System.out.println(z == k);   // true
    // 此处使用了自动装箱 valueOf()方法
    Integer m = 123;
    Integer n = 123;
    System.out.println(m == n); // true
    

2.String

  1. String Pool保存着所有字符串字面量,在编译时期就确定。可以使用String的intern()方法在运行过程中将字符串添加到String Pool中。

调用intern时,如果StringPool已经存在一个字符串和改字符串值相等(equals()方法确定)会返回改引用;否则添加新的字符串,并返回该新字符串的引用。

String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2);           // false
String s3 = s1.intern();
String s4 = s2.intern();
System.out.println(s3 == s4);           // true
// "bbb"这种字面创建字符串,自动放入StringPool中
String s5 = "bbb";
String s6 = "bbb";
System.out.println(s5 == s6);  // true
  1. new String(“abc”) 会创建两个字符串对象,(前提时StringPool还没有”abc“字符串对象)

3.运算

  1. java是值传递,不是引用传递。
    • 在方法中改变对象的字段值会改变原来对象该字段值,因为引用同一个对象
    • 在方法中将该指针引用了其他对象,方法里和方法外两个指针指向不同对象,原来对象无影响。
    public class Dog {
        String name;
        Dog(String name) {
            this.name = name;
        }
        String getName() {
            return this.name;
        }
        void setName(String name) {
            this.name = name;
        }
        String getObjectAddress() {
            return super.toString();
        }
    }
    // eg:对象属性被改变。
    class PassByValueExample {
        public static void main(String[] args) {
            Dog dog = new Dog("A");
            func(dog);
            System.out.println(dog.getName());          // B
        }
    
        private static void func(Dog dog) {
            dog.setName("B");
        }
    }
    // eg:方法外对象无影响
    public class PassByValueExample {
        public static void main(String[] args) {
            Dog dog = new Dog("A");
            System.out.println(dog.getObjectAddress()); // Dog@4554617c
            func(dog);
            System.out.println(dog.getObjectAddress()); // Dog@4554617c
            System.out.println(dog.getName());          // A
        }
    
        private static void func(Dog dog) {
            System.out.println(dog.getObjectAddress()); // Dog@4554617c
            dog = new Dog("B");
            System.out.println(dog.getObjectAddress()); // Dog@74a14482
            System.out.println(dog.getName());          // B
        }
    }
    
  2. java不能隐式向下类型转化。例如double不能直接赋给float,int不能直接赋值给short

使用+=、++可以执行隐式类型转化。

float f=1.1;  //错
short s1=1;   //错
s1 += 1; //对
s1 ++; //对
  1. switch不支持long、float、double,可以支持String

4.关键字

  1. final
    • 数据。基本类型->数值不变;引用类型->引用不变,不能引用其他对象,但是被引用的对象本身是可以修改的。
    • 方法。不能被子类重写
    • 类。类不允许被继承
    final int x = 1;
    // x = 2;  // cannot assign value to final variable 'x'
    final A y = new A();
    y.a = 1;
    
  2. static
    • 静态变量:类变量,属于类,类中所有实例都共享静态变量,可以直接通过类名来访问它。在那种也只存在一份。
      • 实例变量:每创建一个实例就会产生一个实例变量,与该实例同生共死。
    public class A {
    
        private int x;         // 实例变量
        private static int y;  // 静态变量
    
        public static void main(String[] args) {
            // int x = A.x;  // Non-static field 'x' cannot be referenced from a static context
            A a = new A();
            int x = a.x;
            int y = A.y;
        }
    }
    
    • 静态方法:类加载的时候就存在了,不依赖于任何实例。所以静态方法必须有实现,即不能为抽象方法。静态方法只能访问所属类的静态字段和静态方法,方法中不能有this和super关键字,因为这两个关键字与具体对象关联。
    • 静态语句块:在类初始化时运行一次。
    public class A {
        static {
            System.out.println("123"); // 123
        }
    
        public static void main(String[] args) {
            A a1 = new A();
            A a2 = new A();
        }
    }
    
    • 静态内部类:非静态内部类依赖于外部类的实例(需要先创建实例,才能用该实例去创建非静态内部类)。静态内部类不需要,可直接引用。静态内部类不能访问外部类的非静态变量和方法。
    public class OuterClass {
    
        class InnerClass {
        }
    
        static class StaticInnerClass {
        }
    
        public static void main(String[] args) {
            // InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context
            OuterClass outerClass = new OuterClass();
            InnerClass innerClass = outerClass.new InnerClass();
            StaticInnerClass staticInnerClass = new StaticInnerClass();
        }
    }
    
    • 静态导包:使用静态变量和方法时不用再指明ClassName。import static com.xxx.ClassName.*
    • 初始化顺序:静态变量和语句块优先于实例变量和普通语句块。静态变量和语句块的初始化顺序取决于他们在代码中的顺序。
    父类(静态变量、静态语句块)
    子类(静态变量、静态语句块)
    父类(实例变量、普通语句块)
    父类(构造函数)
    子类(实例变量、普通语句块)
    子类(构造函数)
    

5.Object通用方法

public native int hashCode()
public boolean equals(Object obj)
protected native Object clone() throws CloneNotSupportedException
public String toString()
public final native Class<?> getClass()
protected void finalize() throws Throwable {}
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException
  1. equals()
    • 等价关系:自反性、对称性、传递性、一致性、与null比较(不是null与null比较都是false)
    • 等价与相等:
      • 基本类型:==判断值是否相等;
      • 引用类型:==判断是否引用同一对象,而equals()判断引用的对象是否等价。
  2. hashCode()
    • 返回哈希值。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价。
    • 在覆盖equals()方法时应道总是覆盖hashCode()方法,保证等价的两个对象哈希值也相等。
    • HashSet和HashMap等集合类都使用了hashCode()方法来计算对象应该存储的位置,如果要添加对应对象,需要让对应的类实现hashCode()方法
  3. toString() 默认返回ToStringExample@4554617c形式,后面为散列码的无符号十六进制表示
  4. clone()
    • cloneable clone()时Object的protected方法,不是public,一个类不显式去重写clone(),其他类就不能直接去调用该实例的clone()方法

    Cloneable接口只是规定,如果一个类没有实现Cloneable接口又调用了clone()方法,就会抛出CloneNotSupportedException。

    • 浅拷贝:拷贝对象和原始对象的引用类型引用同一个对象
    • 深拷贝:拷贝对象和原始对象的引用类型引用不同对象
    • clone()替代方案:可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。

6.继承

  1. privite、protected、public。
    • 不加修饰符,表示包可见
    • 类可见:其他类可以用这个类创建实例对象
    • 成员可见:其他类可以使用这个类的实例对象访问到该成员
    • protected用于修饰成员,对类没有意义。表示在继承体系中成员对于子类可见。
    • 子类重写父类方法,子类中改方法的访问接别不允许低于父类的访问级别
  2. 抽象类与接口
    • 抽象类抽象方法都使用abstract关键字进行声明。
    • 一个类中包含抽象方法,那么这个类必须声明为抽象类
    • 抽象类与普通类区别:抽象类不能被实例化,只能被继承。
    • 接口成员(字段和方法)默认为public,不允许定义为private或者protected。java9以后允许定义为private。
    • 接口字段默认都是stctic和final的
    • 设计层面:抽象类是 IS-A关系,满足里氏替换原则;接口时LIKE-A关系。
    • super:访问父类的构造函数;访问父类的成员。
  3. 重写和重载
    • 重写是在父子类之间,有三个限制:子权限>=父权限;子返回类型是父类返回类型或者子类型;子抛出异常是父异常或者子类型。
    • 方法调用优先级:
    this.func(this)
    super.func(this)
    this.func(super)
    super.func(super)
    
    • 重载:存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。

7.反射

  1. 编译的时候,会产生同名的.class文件,保存着Class对象。
  2. 类在第一次使用的时候才动态加载到JVM中,也可以使用Class.forName(“com.mysql.jdbc.Driver”) 这种方式来控制类的加载,该方法会返回一个 Class 对象。
  3. 反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加载进来
  4. reflect主要包含Field、Method、Constructor三个类。
Field :可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
Method :可以使用 invoke() 方法调用与 Method 对象关联的方法;
Constructor :可以用 Constructor 的 newInstance() 创建新的对象。
  1. getDeclaredMethods 方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
    getMethods 方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。
    getMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
    getFileds 和 getDeclaredFields 方法用法同上(参照 Method)。----获取类的成员变量信息
  2. invoke:获取了一个方法之后用该方法进行调用
 Class<?> klass = methodClass.class;
 //创建methodClass的实例
 Object obj = klass.newInstance();
 //获取methodClass类的add方法
 Method method = klass.getMethod("add",int.class,int.class);
 //调用method对应的方法 => add(1,4)
 Object result = method.invoke(obj,1,4);
 System.out.println(result);

8.异常

  1. Throwable分为Error和Exception。Error表示JVM无法处理的错误,Exception分为受检异常和非受检异常。
    • 受检异常:需要用try…catch…语句捕获并进行处理,并且可以从异常中恢复
    • 非受检异常:程序运行错误,例如除0会引发错误,此时程序崩溃并且无法恢复。
  2. 不受检查异常为编译器不要求强制处理的异常,检查异常则是编译器要求必须处置的异常
  3. 不受检查异常:包括RuntimeException及其子类和Error。要么使用try-catch语句进行捕获,要么用throws子句抛出,否则编译无法通过
  4. • throw – 用于抛出异常。
     • throws – 用在方法签名中,用于声明该方法可能抛出的异常

9.泛型

  1. 泛型是通过类型擦除来实现的。编译器在编译时擦输了所有类型相关的信息。
  2. 限定通配符
    • <? extends T>它通过确保类型必须是T的子类来设定类型的上界
    • <? super T>它通过确保类型必须是T的父类来设定类型的下界
  3. 非限定通配符 <?>
  4. Array不能使用泛型,List可以使用。

10.注解

1.java.lang.annotation 提供了四种元注解,专门注解其他的注解

   @Documented – 注解是否将包含在JavaDoc中
   @Retention – 什么时候使用该注解
   @Target – 注解用于什么地方
   @Inherited – 是否允许子类继承该注解
  1. 常见的标准注解:
Override 标记注解,标注方法重写父类方法
Deprecated 编译器不鼓励使用这个被标注的程序元素
SuppressWarnings 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值