2022-05-08 19:17

Java基础知识(二)

sjx

JavaEE

(1292)

(0)

收藏

一、类与对象

  • 声明类

    修饰符 class 类名 {

            // 属性

            数据类型 变量名;

            // 方法

            修饰符 返回值类型 方法名 (形参) {

                    方法体

            }

    }

    类名需要符合命名规则,约定第一个字母大写.

    当修饰符为public时,类名必须与文件名保持一致.

  • 创建对象

    类名 对象引用名 = new 类名(构造方法的实参);

    // 引用中间存放的是对象的首地址,并非存放一个对象

    // 执行该语句时完成两步:创建对象;调用类的构造方法

  • 属性的默认值

    整型:0

    浮点型:0.0

    字符型:空字符(ASCII码为0)

    布尔型:false

    引用型:null

  • 属性和方法的调用

    对象名.属性名;

    对象名.方法名(实参);

  • 类的构造方法

    (1) 构造方法是类中一个特殊的方法:

    ① 写法特殊:

        a. 构造方法没有返回值;

        b. 构造方法的名称与本类的名称相同

    ② 调用特殊:

        该方法在"new 类名(构造方法的实参)"创建对象时系统自动执行.

    (2) 类有一个默认的不带参数的构造方法,一旦写入了新的构造方法,默认的构造方法会失效(需手动定义),这不是重载.

  • 类方法的重载

    在一个类中间,定义多个名称相同但是参数不同的方法.

    参数不同指:(1) 数据类型不同  (2) 参数个数不同

  • 静态

    (1) 静态属性和静态方法

        静态属性和静态方法由static修饰,它们属于类所有,可以直接通过"类名."来调用.

        在静态方法中不可以直接调用非静态方法.

        不能将方法体内的局部变量声明成static的.

    (2) 静态初始化块

        为了在执行类时先执行类的初始化动作,使用static定义了一个静态区域.

        public class Test {

                static {

                        // 代码块

                }

        }

        静态初始化块只在类初次加载时执行一次,与创建多少个对象无关,并且是在调用构造函数之前执行该初始化块.

    注意:静态方法和静态初始化块中间不能使用this关键字和super关键字,它们只与类有关,不属于对象.

  • 对象的销毁

    针对由new创建的对象,一旦它们被视为垃圾,Java将通过垃圾回收机制(GC)自动回收.

    对象被视为垃圾的情况:对象的首地址丢失,不能被对象引用找到的对象.

    在对象被回收时自动调用finalize()方法.


二、类的继承

  • 基本思想:基于某个父类进行扩展,得到新的子类. 子类可以继承父类原有的属性和方法,也可以增加自己独有的属性和方法,或者直接重写父类中的某些方法.

  • 类继承类只能单一继承,即一个子类只能有一个父类.

  • 语法格式:

    修饰符 class 子类名 extends 父类名 {

            // 子类将父类非私有的属性和方法(不包括构造方法)都复制一份

            // 如果属性名相同,子类属性覆盖父类属性

            子类新增属性

            子类新增方法

            子类重写的父类方法

            // 方法名、形参与被重写的方法相同,返回值类型为原返回值类型或其子类型,访问修饰符不变或者为作用域更大的访问修饰符

            子类重载的父类方法(参数列表必须不同)

    }

  • 调用子类构造方法之前,会先执行"父类"(父类以及父类的父类等等)的构造方法.

  • 父类具有的属性和方法子类都有,子类会比父类中的属性和方法多.

  • Object类

    它是Java中所有类的父类,即超级父类,用户创建一个类时,除非指定了继承自其他父类,否则它就是从Object类直接继承而来的.


三、对象类型转换

  • 对象的强制类型转换必须之间有继承关系(或实现关系)

  • 子类对象一定可以转换成父类(或父接口)对象,并且可以不用显示转换

    父类 父类对象 = (父类)子类对象;   // 显示转换

    父类 父类对象 = 子类对象;   // 隐式转换

    例:

    Zi zi = new Zi();

    Fu fu = zi;   // 把zi存放的首地址复制一份给了fu,没有创建新的对象

    父类对象不能使用子类的新增成员.

    子类重写了父类方法后,通过父类对象调用该方法,调用的是子类重写后的.

  • 父类对象不可以转换成子类对象

    因为父类缺少子类特有的属性和方法,所以不能转换.

    除了一种情况:父类引用本来装的就是子类对象的首地址.

    例:

    Fu fu = new Zi();   // fu只能使用从Fu继承来的属性,调用重写后的方法

    Zi zi = (zi)fu;   // zi正常使用子类的属性方法


四、抽象类与接口

  • 抽象类(属于类)

    语法结构:

    public abstract class 类名 {

            属性

            方法

            抽象方法

    }

    抽象类内部可以没有抽象方法,但内部有抽象方法的一定是抽象类.

  • 接口(目的是定义一个规范)

    语法结构:

    public interface 接口名 {

            公共静态最终属性   // 不写修饰符,默认是公共的、静态的、最终的

            公共抽象方法   // 不写修饰符,默认是公共的、抽象的

    }

    实现接口的关键字:implements

  • 一个类既继承父类又实现接口

    修饰符 class 子类 extends 父类 implements 接口,接口,... {

            // 重写接口中的所有抽象方法

    }

    快捷键:Ctrl + 1,然后选择Add unimplemented methods

  • 类、抽象类、接口的区别

    (1) 类可以创建对象,接口和抽象类不能创建对象;

    (2) 类继承类:单一继承

         类继承抽象类:单一继承(必须重写抽象类的所有抽象方法)

         类可以实现多个接口(必须重写接口中间所有的抽象方法)

    (3) 抽象类可以继承类:单一继承

         抽象类可以继承抽象类:单一继承(可以不重写抽象方法)

         抽象类可以实现多个接口(可以不重写抽象方法)

    (4) 接口可以继承多个接口(注意关键字是extends不是implements)


五、Java类包

  • 同一个包中的类相互访问时,可以不指定包名.

  • 一个类要访问不同包中的类时,要么导包,要么写出完整类路径.

  • 打包:

    package 包名1.包名2......;

    该语句必须是一个文件中的第一条语句,并且在文件中间只能出现一次.

    包的命名规则是全部使用小写字母.

  • 使用import关键字导入包:可以指定类的完整描述;也可以在包指定后加上*,这表示可以在程序中使用包中的所有类.


六、修饰符

  • 访问修饰符

访问级别

访问修饰符

同类

同包

子类(不同包)

不同包(其他类)

公共

public

  √

  √

        √

      √

受保护

protected

  √

  √

        √

      ×

默认

缺省(friendly)

  √

  √

        ×

      ×

私有

private

  √

  ×

        ×

      ×

  • 类、属性、方法可以使用的修饰符



         访问修饰符


静态修饰符

抽象修饰符

最终修饰符


public

protected

(friendly)

private

    static

  abstract

  final

   √

      ×

     √

    ×

       ×

       √

    √

属性

   √

      √

     √

    √

       √

       ×

    √

方法

   √

      √

     √

    √

       √

       √

    √

  • 通常将属性声明为private,将方法声明为public

    通过set方法改变属性值,通过get方法获得属性值

    快捷键:Alt + Shift + S,然后选择"Generate Getters and Setters...".

  • final修饰符:

    final class 类名 {}   // final修饰的类不能被继承

    final 数据类型 变量名 = 值;   // 没有默认值,所以必须初始化,并且值不能更改

    final 返回值类型 方法名 (形参) {}   // final修饰的方法不能被重写

  • final修饰符和abstract修饰符不能同时使用

  • abstract修饰符和static修饰符不能同时修饰某个方法,即没有类抽象方法

  • private和abstract不能同时修饰方法,因为抽象方法必须在子类中被重写


七、this关键字和super关键字

  • this关键字

    用途1:通过this表示类自己本身的对象;

    用途2:通过this作为实参调用类自己的构造方法(只能在构造方法的第一句话使用);

    用途3:可以this.属性(区别于同名的局部变量),this.方法.

  • super关键字

    用途1:给父类的构造方法传递实参

    例:

    public XueSheng(int x) {

            System.out.println("父类构造方法");

            System.out.println(x);   // 输出的值为3

    }

    public ZhongXueSheng() {

            super(3);   // 必须写在第一句

            System.out.println("子类构造方法");

    }

    用途2:用super调用从父类继承的属性和方法


八、异常处理

  • 抛出异常

    方法定义:

    返回值类型 方法名(形参) throws 异常种类 {

            throw 异常对象;

            方法体

    }

  • 捕获异常

    如果一个方法会抛出异常,那么在调用该方法时,必须捕获异常.

    方法调用:

    try {

            方法名(实参);

    } catch(Exceptiontype1 e) {

            // 对Exceptiontype1的处理

    } catch(Exceptiontype2 e) {

            // 对Exceptiontype2的处理

    } ...

  • 一条语句产生异常后后面的代码不会执行.

  • 常见异常种类:

    IOException:输入输出异常

    FileNotFoundException:文件未找到异常

    ArrayIndexOutOfBoundsException:数组下标越界异常

    ClassNotFoundException:未找到相应类异常

    NullPointerException:空指针异常

0条评论

点击登录参与评论