• Java基础复习


    • JAVA语言特点:跨平台性

      因为JVM虚拟机,同一个Java程序在三个不同的操作系统中都可以运行

    • 垃圾回收:在C/C++中,由程序员负责,Java有自动回收机制。

      注意:Java程序有自动回收机制,会出现内存泄露和溢出吗?yes

    • JDK:Java开发工具包(包括JRE)

    • JRE:Java运行环境

    • JVM:Java虚拟机

    1、文档注释

    • 单行注释

    • 多行注释

    • 文档注释

      /**
      */  		//注意:两个**号
      

      使用 javadoc 解析 生成java文档

    2、变量

    整形

    • byte 1字节
    • short 2字节
    • int 4字节
    • long 8字节

    浮点

    • float 4字节 精度有限

    • double 4字节

    注:Java中浮点默认使用double ,声明float变量时,后面要加F /f

    字符型

    • char 2字节

    布尔

    • boolean

    3、对象的三大特性

    • 封装
    • 继承
    • 多态:一个事物的多种形态。一个对象体现多种形态 父类的引用指向指向子类的对象。
    Person p = new Person();
    

    有了对象的多态性之后,内存中实际是加载了的,但是父类不能调用子类的方法属性。

    解决方法:使用强制转换(向上转型),子类强制转换为父类;

    instanceof关键词

    使用:判断A对象是否是B对象的实例,是true,否false。

    在需要强制好装换的时候使用。

    4、Object类的使用

    • 所有类的父类
    • Object类只申明了一个空参构造器
    • 含有finalize()方法,在对象被回收之前自动调用此方法,提醒虚拟机回收。一般不要手动调用,交给垃圾回收机制。
    • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知回收,但是不一定立马回收。

    方法:equals() / toString() / getClass() / hashCode() /clone() / finalize() /wait() /notify() / notifyAll()

    4.1 equals方法

    • ==和equals()的区别(面试题)

      • ==运算符

        1. 可以使用在基本数据类型和引用数据类型中。

        2. 如果比较的是基本数据类型,那么就是比较存储的值是否相同。

          如果比较的是引用数据类型,那么比较的是两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。

        3. 注意:

          String s1 = "BB";
          String s2 = "BB";
          s1==s2    //true
          

          原因:字符串会放入常量池,

          当执行String s2 = "BB";时,先在常量池中查找是否有相同的常量,如果有则直接将引用指向已有的常量,不会再重新添加。使用new String("BB")不会导致这个问题。

      • equals()方法的使用

        1. 是一个方法,非运算符

        2. 适用于引用数据类型

        3. Object类中equals()方法的定义(内部使用==比较)

          public boolean equals(Object obj) {
                  return (this == obj);
              }
          
        4. 像String,Date,File,包装类都重写了equals()方法,他们比较的是两个对象的实体内容是否相同,而不是引用对象是否相同。

        5. 自定义类使用equals()方法也通常比较两个对象的实体类是否相同,需要对Object类的方法进行重写(可参照String类重写)

          手动重写的规则:比较对象里面的属性是否相同(age,name)

        6. 实际开发中,一般不手动重写,可使用编译器自动生成。

        *面试回答:

        1. ==可以比较基本数据类型和引用数据类型,对于基本数据类型比较的是值,引用数据类型比较的是内存地址。

        2. 对于equals()方法,父类方法中默认使用==比较,当自定义类中需要使用equals,则需要重写equals。注意:常用的String File Date 包装类已经帮我们重写好了,可直接使用。

        3. 通常情况下,重写比较的是类中相应的属性是否相同。

    4.2 toString()

    1. 当我们输出一个对象的引用时,默认调用toString()方法
    2. 像String,Date,File,包装类都重写了toString()方法
    3. 自定义类可以重写此方法。

    5、包装类的使用

    理解:基本数据类型不具有对象的特征,继承封装多态等,希望基本数据类型也具有这些特征,所以引出包装类。

    基本数据类型 包装类
    byte Byte
    short Short
    int Integer
    long Long
    float Float
    double Double
    boolean Boolean
    char Character

    基本数据类型、包装类、String三者之前的转换

    • 基本转包装(可不记,有自动拆装箱)
    int num =10 ;
    Integer in = new Integer(num);
    
    • 包装转基本(原因包装类不可以做加减乘除)

      Integer in1 = new Integer(12);
      in1.intValue();
      
    • 自动拆箱和装箱

      jdk5.0的新特性

      • 自动装箱-->基本到包装
      • 自动拆箱-->包装到基本
    • 基本、包装转String

      1. 连接运算 直接

        int num= 10;
        num+"";
        
      2. 调用String.valueOf(num);

    • String转基本、包装

      调用包装类的parseXxx()

    6、static

    1. 用来修饰:属性、方法、代码块、内部类

    2. 按照是否使用static修饰 ,分为静态属性和非静态属性。

      静态变量:多个对象同用一个属性,当一个对象修改静态属性后,其他对象的相同静态属性也相应修改。

    3. 静态变量随着类的加载而加载,可通过 “类.属性” 调用

      静态变量早于对象的创建

      由于类只加载一次,所以静态变量在内存中也只存在一份,存在方法区的静态域中。

      实例变量与静态变量内存的解析:

    4. 静态方法中,只能调用静态方法与属性

      非静态方法中,可以调用静态方法与静态属性,非静态方法与非静态属性。原因归结于 他们的生命周期。

    5. 使用static注意点:

      • 静态方法中不能使用this、super关键词 原因:初始化时没有对象
    6. 在开发中如何声明属性或方法是否使用static?

      • 属性可以被多个对象所共享,不会随着对象的不同而不同。
      • 操作静态属性的方法 、工具类中的方法。

      单例设计模式

      概念:采取一定的方法在整个软件系统中,某个类只能存在一个实例对象。

      实现步骤:

      1. 私有化构造器,防止其他类new该对象。

      2. 在类中创建该类的静态实例。

      3. 提供一个外部获取该实例的静态方法。

      4. 恶汉式 vs 懒汉式

        恶汉式:

        • 坏处:对象加载(生命周期)的时间过长,可能用不到。
        • 线程安全

        懒汉式:

        • 好处:延迟对象的创建,随用随造。
        • 线程不安全
        //恶汉式
        class Bank{
            //私有化构造器
            private Bank(){}
        	//实例化对象
            private static Bank instance = new Bank();
        	//提供外界访问
            private static Bank getInstance(){
                return instance;
            }
        }
        
        //懒汉式(啥时候用啥时候造) 不安全 需要修改!
        class Bank{
            private Bank(){}
            private static Bank instance = null;
            private static Bank getInstance(){
                if (instance == null){
                    instance = new Bank();
                }
                return instance;
            }
        }
        

        单例模式的优点:只产生一个实例,减少系统的开销。

        应用场景:

        • 网站计数器
        • 应用程序的日志应用
        • 数据库连接池(造一个池)
        • 读配置文件的类
        • Application .....

      7、代码块(初始化块)

      • 作用:用户初始化类,对象
      • 只能使用static修饰
        • 非静态代码块
          1. 内部可以有输出语句
          2. 随着对象的创建而执行,每次创建都会执行一次
          3. 作用:可以在创建对象时,对对象的属性等进行初始化
          4. 块内能调用静态属性、静态方法和非静态属性和非静态方法。
        • 静态代码块
          1. 内部可以有输出语句
          2. 随着类的加载而执行,而且只执行一次
          3. 作用:初始化类的信息
          4. 如果一个类中定义了多个代码块,则谁先定义则谁先执行
          5. 块内能调用静态属性、静态方法。

      静态代码块、代码块、构造器执行顺序:由父及子 ,静态先行 静态代码块>代码块>构造器

      赋值的先后顺序 :在类中静态代码块和定义谁先写 就谁先赋值。

      8、final

      1. 可以用来修饰类,变量,方法

        类:不可以被其他类继承

        方法:不可以被重写

        变量:不可改变

        • 修饰属性:变成“常量” 可以显式/代码块/构造器中赋值
        • 修饰局部变量:变成常量,赋值后不可再次操作。

    9、抽象类和抽象方法

    abstract关键词

    1. 可用来修饰类、方法
    2. 不可用来修饰属性,构造器等
    3. abstract不能用来修饰private方法,因为子类继承后不可重写。
    4. 不能用来修饰静态方法,final方法,final的类(矛盾)
    • 抽象类:
      1. 不可实例化
      2. 抽象类中一定要有构造器,便于子类实例化
      3. 开发中一般都会提供子类,让子类实例化。
    • 抽象方法:
      1. 抽象方法只有声明,没有方法体。
      2. 包含抽象方法的类,一定是一个抽象类。反之抽象类中,不一定有抽象方法。
      3. 子类继承抽象类,则必须实现父类的抽象方法。如果没有实现父类全部抽象方法,这个子类一定也是抽象类。

    匿名类

    Person p = new Person(){
    ....
    }
    

    意义:只用一次,后面不再使用,方便。

    模板方法的设计模式

    解决的问题:

    1. 一部分是确定的,一部分是不确定的,子类去实现这个不确定的
    2. 开发中,一些是不确定、易变的,把它抽象成方法,让子类去实现。

    10、接口

    1. java不支持多继承,所以提出接口概念。

    2. 接口和类是一个并列的结构。

    3. 将几个类具有的相同行为的特征,把它们抽取出来。比如手机、电脑等数码产品都有USB功能。

    4. 定义接口中的成员

      JDK7之前,只能定义全局常量和抽象方法:

      1. 全局常量:public static final,但书写时可以不写,默认。
      2. 抽象方法:public abstract

      JDK8:除了定义全局常量和抽象方法,还可以定义静态方法,默认方法。

      1. 接口中定义的静态方法只能通过接口来调用。子类实现后不能调用。

      2. 默认方法,子类实现(重写)后可调用。实现类可重写接口中的默认方法。

      3. 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有冲洗而此方法的情况下,默认调用的是父类中同名同参的方法-->类优先原则

        interface A{
            default void P(){
                System.out.println("抽象类");
            }
        }
        
        class SubA implements A{
            @Override
            public void P() {
                System.out.println("子类继承抽象类");
            }
        }
        
        class Sub extends SubA implements A{
        
            public static void main(String[] args) {
                new Sub().P(); //结果输出:子类继承抽象类
            }
        }
        
      4. 如果子类中实现了多个接口,而接口中含有多个同名同参数的方法,那么会引起接口冲突,实现类必须实现这个方法。

      5. 在实现类中调用接口中被重写的方法

        接口.super.方法名
        A.super.P();
        
    5. 接口中不可以定义构造器,因为不可实例化。

    6. 如果一个类,没有实现接口中的抽象方法,那么这个类是抽象类。全部实现后,该类可以实例化。

    7. Java可以实现多个接口。弥补Java单继承的缺陷。

    8. 接口与接口之间可以多继承。

    9. 接口是一种规范,体现了多态性。JDBC中多数使用了接口。

    10. 接口的应用:代理模式、工厂模式

    面试题:

    interface A{
        int x= 0;
    }
    class B{
        int x= 1;
    }
    class C extends B implements A{
    
        public void Px(){
    //        编译不通过
            System.out.println(x);
    //        System.out.println(A.x);
    //        System.out.println(super.x);
        }
        public static void main(String[] args) {
            new C().Px();
        }
    }
    

    11、内部类

    概念:Java允许在一个类中再声明类。

    内部类的分类:成员内部类(静态,非静态) vs 局部内部类(方法、代码块、构造器)

    • 成员内部类
    1. 作为类:

      • 可定义属性、方法、构造器
      • 可以被final修饰
      • 可以abstract修饰
    2. 作为外部类的成员

      • 可以调用外部类的结构
      • 可以被static修饰
      • 可以被四种权限修饰
    3. 实例化静态内部类实例

      PersonD.Dog dog  = new PersonD.Dog();
      
    4. 实例化非静态内部类实例

      Person p = new Person();
      Person.Bird bird = new p.new Bird();
      
    • 局部内部类

    返回实现一个实现了Comparaable接口类的对象

    在局部内部类的方法中,如果调用局部内部类方法里面的局部变量,那么这个变量必须声明为final。(尚硅谷p370)

    抽象类和接口有哪些共同点和区别(面试)

    相同:不能实例化、都可以被继承

    不同:抽象:有构造器 单继承 接口:不能声明构造器、多继承

    12、异常

    Error:Java虚拟机无法解决的严重问题。

    Exception:编程错误或外在因素导致。

    • 编译时异常
    • 运行时异常

    抓抛模型:

    抛(手动生成异常对象)

    抓(处理异常)

    Java异常处理的方式(抓):

    • 方式一:try-catch-finally

    • 方式二:throws+加异常类型

    try-catch使用注意:

    1. catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类上面。否则报错
    2. 处理编译时异常。
    3. 使用finally,如果有try_catch中返回值,则先执行finally内的方法,再返回。

    finally使用环境:像数据库,io,网络编程等需要我们手动去释放连接,jvm不会自动回收。

    throws

    写在方法的声明出,指明可能会出现的异常,抛给它的上一级处理。

    重写方法异常抛出的规则

    子类重写的方法抛出的异常不大于父类被重写方法的异常类型。

    例如:在多态的使用中,将子类的对象赋值给父类,当子类方法中抛出异常,父类才能解决。

    开发中如何选择使用try-catch和throws

    1. 如果在父类被重写的方法中,没有使用throws,那么它的子类也不能使用throws。
    2. 执行的方法中,先后调用了另外几个方法,这几个方法是递进关系的,一个方法出错,会影响整个解决整个结果时,建议这几个方法抛出异常,在调用时一起处理。

    throw

    手动抛出异常

    自定义异常类

    1. 继承现有的异常结构:RuntimeException、Exception
    2. 提供全局异常:serialVersionUID
    3. 提供重载的构造器
  • 相关阅读:
    python中if __name__ == '__main__': 的解析
    CPPUTest 单元测试框架(针对 C 单元测试的使用说明)
    哈希表详解
    使用RSS提升DPDK应用的性能(转)
    DPDK内存管理-----rte_mbuf(转)
    DPDK内存管理-----(二)rte_mempool内存管理
    DPDK内存管理(1)(转)
    Scala + IntelliJ IDEA
    什么是消息队列中间件
    微信小程序直播
  • 原文地址:https://www.cnblogs.com/xiaolaodi1999/p/13377544.html
Copyright © 2020-2023  润新知