JavaSE知识笔记Day2

发布时间 2023-03-26 17:13:17作者: xipian

JavaSE知识笔记Day2

类方法(静态方法)(使用static修饰)

  • 不能使用和对象有关的关键字:(eg:this、super)
  • 只能访问静态变量和静态方法(遵守访问权限)
  • 不会被重写,父子类同名两个方法相当于完全无关的方法

代码块

【修饰符】{
	//代码
};

//修饰符不写或者写static(只有这两种)
//加载类或创建对象时隐式调用,优先于构造器
//;可以省略
  • static代码块作用是对类进行初始化,随着类的加载而执行,并且只会执行一次;普通代码块每创建对象执行一次,如果只是通过类名使用静态成员,普通代码块不会被执行

  • 创建一个对象时,在一个类中的调用顺序:

    1. 调用静态代码块和静态属性初始化(两者优先级一样,按定义的顺序调用)

    2. 调用普通代码块和普通属性的初始化(两者优先级一样,按定义的顺序调用)

    3. 调用构造器

      • 构造器里隐含了super()和调用普通代码块
      • 顺序是:父类代码块,父类构造器,子类代码块,子类构造器
  • 静态代码块只能直接调用静态成员

final

可以修饰类、属性、方法、局部变量

  • 当不希望类被继承时
  • 当不希望父类的某个方法被子类重写时
  • 当不希望类的某个属性的值,某个局部变量被修改时
  • final修饰的属性在定义时,必须赋初值,可以在下面三个位置之一赋初值(只能在一个地方)
    • 定义时
    • 代码块中
    • 构造器中
  • 如果该属性是静态static的,则只能在:定义时、静态代码块中赋初值
  • 不能修饰构造器
  • final和static往往搭配使用,效率更高,不会导致类的加载(底层编译器做了优化处理)
  • 包装类(Integer/Double/Float/Boolean)String等都是final的,不能被继承

抽象(abstract)类

当父类的一些方法不确定时,可以用abstract修饰该方法,就是抽象方法,抽象方法没有方法体;当一个类有抽象方法,需要声明为抽象类

  • 抽象类不能被实例化
  • 抽象类不一定要有抽象方法,可以没有
  • abstract只能修饰类和方法
  • 如果一个类继承了抽象类,则必须实现抽象类的所有抽象方法;除非自身也声明为抽象类
  • 抽象方法不能使用private/final/static修饰

接口

interface 接口名{
    //属性
    //方法
}
  • 在接口中,抽象方法可以省略abstract

  • 在jdk7之前,接口中所有方法都是没有方法体的;在jdk8后,可以有默认方法(用default修饰)有方法体,可以有静态方法有方法体

  • 接口中所有方法都是public,可以省略public

  • 接口中的属性,只能是public static final 三个一起修饰的,可以省略;访问方式为:接口名.属性名

    int n=1;//等价于 public static final int n=1;
    
  • 接口不能被实例化

  • 一个普通类implements接口,需要将所有抽象方法都实现

  • 抽象类implements接口,可以不用实现接口的方法

  • 一个类可以同时implement多个接口

  • 一个接口不能继承其他类,但可以继承(extends)多个接口

  • 接口的多态特性

    • 多态参数:接口引用可以指向实现了接口的类的对象
    • 多态数组
    • 多态传递:接口A继承了接口B,类C实现了A,则B类型的变量也可以指向C类的对象

内部类

一个类的内部又完整嵌套了另一个类,被嵌套的类称为内部类

  • 内部类最大的特点是可以直接访问私有属性,并且可以体现类与类之间的包含关系

内部类的分类:(4种)

  • 定义在外部类局部位置上(比如方法内):
    1. 局部内部类(有类名)
    2. 匿名内部类(没有类名)
  • 定义在外部类的成员位置上:
    3. 成员内部类(没static修饰)
    4. 静态内部类(static修饰)

局部内部类

  • 可以直接访问外部类的所有成员,包含私有的
  • 不能添加访问修饰符,(因为其地位相当于一个局部变量),但是可以使用final修饰
  • 作用域:仅仅在定义其的方法或代码块中
  • 外部类访问局部内部类的成员:创建对象再访问(必须在作用域内)
  • 外部其他类不能访问局部内部类
  • 如果外部类和内部类的成员重名时,遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

匿名内部类

new 类或接口(参数列表){
   类体
};
//这个匿名内部类实现了该接口或继承了该类,  
//可以用父类或接口类型的引用接受该匿名内部类new的对象
//参数列表传递给构造器
  • 底层匿名内部类的名字为"外部类的名字"+"$1"

  • 该匿名内部类只能new一次,创建的对象可以使用多次

  • 可以直接访问外部类的所有成员,包含私有的

  • 可以当作实参传递

成员内部类

  • 可以任意使用访问修饰符
  • 作用域为整个外部类

静态内部类

  • 可以访问外部类的所有静态成员,不能访问非静态的成员

异常

  • 运行时异常(如果程序中没有处理,默认是throws处理)
  • 编译时异常(必须在程序中处理)

异常继承结构图

异常处理机制

try-catch-finally

try{
    //可能发生异常
}catch(Exception e){
    //处理异常
    //没有异常不执行
    //可以有多个catch,子类异常放在前面
}finally{
    //无论是否发生异常都执行
    //通常用来释放资源
}

throws

抛出异常给调用该方法的方法,最大能throws到JVM(输出异常信息,退出程序)

  • 方法声明中可以用throws语句抛出异常列表(,隔开),throws后面的异常可以是方法中异常的父类
  • 子类重写的方法抛出的异常可以是父类方法抛出的异常或其异常的子类异常

自定义异常

  • 如果继承Exception,属于编译异常
  • 如果继承RuntimeException,属于运行异常

包装类

基本数据类型 包装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
  • 装箱:基本数据类型——>对应包装类,反之称为拆箱