[笔记] Java基础(3)-类与对象

116 阅读5分钟

1. 面向对象特征

  • 封装:隐藏对象的实现细节,对外提供公共的访问方式

    • 优点:隐藏细节,提高复用性与安全性
    • 权限修饰符:private(类)、default(包)、protected(子类)、public(公共)
    • 对象属性私有,提供getset方法,提供默认构造方法
  • 继承(extends):提高了代码的复用性与维护性,增强了耦合性;Java只支持单继承;子类可继承父类的所有成员,但不能访问私有成员;构造方法不能继承

  • 多态:事物的多种形态;提高了维护性和扩展性

    • 前提:继承关系、方法重写、父类引用指向子类对象
    • 方法重写:子父类中出现相同的方法,且返回值也相同或为子类
      • 父类的私有方法不能被重写
      • 子类重写方法的访问权限不能低于父类方法
      • 静态方法属于类,故不算重写,但也可以用子类中的同名静态方法覆盖
    • 成员变量、成员方法、静态方法在多态时编译根据父类
    • 成员方法在多态时运行根据子类,称为动态绑定,其余成员根据父类
    • 向上转型:父类引用指向子类对象
    • 向下转型:将向上转型的对象强制转回子类类型
    • 父类可作为方法参数接受子类对象,但多态时父类不能使用子类特有的属性和方法
  • 类:一组相关属性和行为的集合

  • 对象:某类事物的具体体现

  • 成员变量:在类中方法外定义,存放在堆内存中,随对象存在,有默认初始化值

  • 局部变量:在类中方法中定义,存放在堆内存中,随方法存在,没有默认初始化值

  • 类成员:使用static修饰,随类加载,优先于对象存在,被所有对象共享,可通过类名或对象名调用

    • static方法只能访问静态成员或静态方法,且不能使用this关键字
    • 若类中所有方法都是静态的,则可将构造方法权限设为private
  • 构造方法:没有返回值类型,方法名与类名相同;用于对象属性的初始化,创建对象是自动调用;没有写构造方法时系统默认提供无参构造方法;接口没有构造方法

    • this()super()可以调用本类或父类的构造方法,必须在构造方法的第一句
    • 子类中的构造方法默认都会访问父类的空参构造方法,相当于super()

2. 代码块

  • 局部代码块:位于方法中,用于限制变量的生命周期
  • 构造代码块:位于类中方法外,在调用构造方法之前执行,可用于存放构造方法中的相同代码
  • 静态代码块:位于类中方法外,用static修饰,在类加载时执行,用于初始化类或加载驱动

3. final关键字

  • final修饰的类不能被继承

  • final修饰的变量为常量,只能被赋值一次;通常搭配public static final

  • final修饰的方法不能被重写

  • final修饰的成员变量在构造完毕之前必须赋值,类似局部变量没有默认初始值

  • instanceof关键字:用于判断对象类型,返回truefalse

    ​ 用法:object instanceof class

4. abstract关键字

  • 用于修饰抽象类或抽象方法,被修饰的抽象类不能被实例化
  • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或接口
  • 抽象类的子类如果不是抽象类,则必须重写抽象类的所有抽象方法
  • abstract不能修饰成员变量
  • staticfinalprivate不能与abstract共用

5. interface关键字

  • 用于修饰接口,接口内的方法都是抽象方法,接口没有构造方法

    ​ 注:JDK1.8的接口可以有普通方法,用defaultstatic修饰

  • 实现接口使用implements关键字,可同时实现多个接口,实现类默认继承自Object

  • 接口的成员变量默认修饰符为public static final,故为常量

  • 接口的成员方法默认修饰符为public abstract

  • 接口之间可以多继承

  • 一个类可以继承另一个类同时实现多个接口

6. package关键字

  • 用于定义包;包名通常为域名倒写,如:org.apache.demo
  • package必须为第一条可执行语句,且在一个java文件中只能有一个
  • 编译带包名的类:javac -d . filename.java
  • 运行时需要加上包名:java org.apache.demo.ClassName
  • 使用不同包的类需要使用全名或先导入:import org.apache.demo.ClassName;
  • java.lang包里的类不用导入也可以使用

7. 内部类

  • 类中定义的类称为内部类,内部类可以直接访问外部内的成员
  • 内部类对象创建:Outer.Inner obj = new Outer().new Inner();
  • 静态内部类对象创建:Outer.Inner obj = new Outer.Inner();
  • 访问静态内部类的静态方法:Outer.Inner.method();
  • 内部类中访问外部类同名成员变量:Outer.this.num;
  • 内部类中访问内部类同名成员变量:this.num;
  • 局部内部类:在方法内定义的类,在方法外不能访问;局部内部类中访问方法的局部变量时,局部变量需要用final修饰(JDK1.8可省略,final修饰的变量存放在常量池),用于改变局部变量的生命周期
  • 匿名内部类:特殊的局部内部类
    • 语法:new ClassName(){};
    • 表示实现接口或继承类,并创建子类对象
    • 可重写父类的方法
    • 没有类名,故不能向下转型
    • 匿名内部类可当作参数传递该方法;事件监听、多线程中被广泛使用
  • 链式编程:调用方法后还可以继续调用其它方法,则该方法返回的是一个对象