Java 点滴

2022-06-10  本文已影响0人  内蒙小猿

[toc]

== 和 equals 的对比

== 是一个比较运算符

1、== : 既可以判断类型,又可以判断引用类型
2、== :判断基本类型,判断的是值是否相等
3、== :如果是引用类型,判断的是地址是否相等,即判定是不是同一个对象

equals

1、equals :是object 类中的方法,只能判断引用类型,
2、equals :默认判断的是地址是否相等,子类中往往重写该方法(public boolean equals(object obj) ) 用于判断内容是否相等,

Java hashCode

1、提高具有哈希结构的效率
2、两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3、两个引用,如果指向的是不同对象,则哈希值是不一样的
4、哈希值主要根据地址号来的!,不能完全将哈希值等价于地址
5、集合中hashCode 按需重写

Java 的动态绑定机制

B 是 A 的子类 , A a = new B()
a 在编译类型是 A (等号左边) ,运行类型是 B (等号右边)

视频地址

1、当调用对象的方法的时候,该方法会和该对象的内存地址进行绑定
2、当调用对象属性时,没有动态绑定机制,哪里有声明,哪里使用

接口

implements 实现接口
extends 继承

1、JDK 7.0 以前,接口里的所有方法都没有方法体,即都是抽象方法
2、JDK 8.0 后,接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现(default 关键字修饰)
3、一个类可以实现多接口 implements A ,B
4、接口中的属性,只能是final的。而且是 public static final
5、接口中属性的访问形式 : 接口明. 属性名
6、接口不能继承其他类,但是可以继承多个别的接口
7、接口的修饰符 只能是 public 和 默认,这点和类的修饰符是一样的

代码块

1、static 代码块也叫静态代码块,作用就是对类进行初始化,而且他随着类的加载而执行,并且只会执行一次。如果是普通代码块,没创建一个对象,就执行一次。
2、类什么时候被加载【需要背】

3、普通代码块,在创建累的实例时,会被隐式调用。被创建一次,就会被调用一次。如果只是使用类的静态成员时,普通代码块并不会被调用
note:
1、staitc 代码块是在类加载时执行,且只会执行一次
2、普通代码块是在创建对象时调用的,创建一次就会调用一次
3、类加载的三种情况,需要记住!!!

创建一个类时,在一个类 调用的顺序是:(重点,难点)

1、调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级是一样的,如果有多个静态代码块和多个静态变量初始化,则按着他们的定义顺序进行调用)

2、调用普通代码块和普通属性初始化方法(注意:普通代码块和蒲绒属性调用的优先级是一样的,按定义顺序调用)

3、调用构造方法

创建一个子类(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:

1、父类的静态代码块和静态属性,按顺序执行
2、子类的静态代码块和静态属性,按顺序执行
3、父类的普通代码块和普通类属性,按执行顺序执行
4、父类的构造方法
5、子类的普通代码块和普通类属性,按顺序执行
6、子类的构造方法

静态、非静态 方法调用

静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员

内部类

一个类内部又完整嵌套了另一个类结构。被嵌套的类称为内部类,嵌套其他类的类称为外部类。使我们类的第五大成员【五大成员:
属性、方法、构造器、代码块、内部类
】,内部类最大特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系

class Outer { // 外部类
    class Inner{ // 内部类
    }
}

class Other{  // 其他类
}

内部类分类

定义在外部类局部位置上(比如方法上)

package com.zhao.smallchange;

public class Outer {

    private int age = 23;

    public static void main(String[] args) {
        new Outer().innerAction();
    }

    public void innerAction(){
        class innerClass{
            private int age = 12;

            public void sayAge(){
                System.out.println("内部类age:" + age + "外部类age:" + Outer.this.age );
            }
        }

        innerClass innerClass = new innerClass();
        innerClass.sayAge();

    }
}

2、匿名内部类(没有类名,重点!!)

new 类或者接口(参数列表){
    类的相关实现 
};
// 实际使用

package com.zhao.smallchange;

public class Outer {

    public static void main(String[] args) {
        new Outer().innerAction(new OuterInterface() {
            @Override
            public void sayHello() {
                System.out.println("我是匿名内部类");
            }
        });
    }

    public void innerAction(OuterInterface subInterface){
        subInterface.sayHello();
    }


}

interface OuterInterface{
    public void sayHello();
}

定义在外部类的成员位置上

package com.zhao.smallchange;

public class Outer {

    private int n1 = 10;
    public String name = "张三";

    public static void main(String[] args) {
        new Outer().t1();
    }


    class InnerClass{
        public void say(){
            System.out.println("n1 = " + n1 + " name =" + name);
        }
    }

    public void t1(){
        InnerClass innerClass = new InnerClass();
        innerClass.say();
    }

}

1、成员内部类(没有static修饰)

-7、如果内部类成员变量 和 外部类成员变量 冲突,外部类还是 外部类.this.成员变量

2、静态内部类(使用static修饰)

class Outer10{

    private int n1 = 10;
    private static String name = "张三";

    static class Inner10{
        
    }

}

1、放在外部类成员位置
2、使用 static 修饰
3、可以访问外部类的所有成员变量,包含私有的,但不能直接访问非静态变量
4、可以添加任意访问修饰符 (public、protected、默认 、private),但是不能直接访问非静态成员变量

// 第一种: 对象调用
package com.zhao.smallchange;

public class StaticInnerClass01 {

    public static void main(String[] args) {

        Outer10.Inner10 inner10 = new Outer10.Inner10();
    }

}

class Outer10{

    private int n1 = 10;
    private static String name = "张三";

    static class Inner10{

    }

}
// 第二种: 普通方法暴露
package com.zhao.smallchange;

public class StaticInnerClass01 {

    public static void main(String[] args) {

        Outer10.Inner10 staticInnerClass = new Outer10().getStaticInnerClass();

    }

}

class Outer10{

    private int n1 = 10;
    private static String name = "张三";

    static class Inner10{

    }

    public Inner10 getStaticInnerClass(){
        return new Inner10();
    }

}

// 第三种:static 方法
package com.zhao.smallchange;

public class StaticInnerClass01 {

    public static void main(String[] args) {

        Outer10.Inner10 staticInnerClass = Outer10.getStaticInnerClass();

    }

}

class Outer10{

    private int n1 = 10;
    private static String name = "张三";

    static class Inner10{

    }

    public static Inner10 getStaticInnerClass(){
        return new Inner10();
    }

}


5、作用域 整个类
6、如果外部类和静态内部类的成员重名是,静态内部类访问的时候,默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类.成员)去访问

String、StringBuilder、StringBuffer 选择

random 随机数

返回的是 0 <= x < 1 之间的随机小数

    public static void main(String[] args) {
        // 思考:请写出获取 a, b 之间的一个随机整数,a = 2 b = 7

        // 1、 [0 10) 随机数
        System.out.println("=========[0 10) 随机数===========");
        for (int i = 0; i < 10; i++) {
            System.out.println(10 * Math.random());
        }

        // 2、 [0 10) 随机整数
        System.out.println("=========[0 10) 随机整数===========");
        for (int i = 0; i < 10; i++) {
            double random = Math.random();
            System.out.println(10 * random);
            System.out.println((int)(10 * random));
        }

        // 3、[2 12) 随机整数
        System.out.println("=========[2 12) 随机整数===========");
        for (int i = 0; i < 10; i++) {
            double random = Math.random();
            System.out.println(10 * random + 2);
            System.out.println((int)((12 - 2) * random + 2));
        }

        // 4、[2 7) 随机整数
        System.out.println("=========[2 7) 随机整数===========");
        for (int i = 0; i < 10; i++) {
            double random = Math.random();
            System.out.println(5 * random + 2);
            System.out.println((int)((7 - 2) * random + 2));
        }

        // 5、[2 7]随机整数 ==  [2 8)随机整数
        System.out.println("=========[2 7] 随机整数===========");
        for (int i = 0; i < 10; i++) {
            double random = Math.random();
            System.out.println((8 - 2) * random + 2);
            System.out.println((int)((1 + (7 - 2)) * random + 2));
        }

集合实现类的选择

Thread 和 Runnable

package com.zhao.learn01;

public class Learn {

    public static void main(String[] args) {

        T3 t3 = new T3();

        Thread thread1 = new Thread(t3);
        Thread thread2 = new Thread(t3);

        thread1.start();
        thread2.start();

    }

}


class T3 implements Runnable{

    @Override
    public void run() {
        // 进行线程操作

    }
}

线程常用方法

note:

上一篇 下一篇

猜你喜欢

热点阅读