JavaSE基础复习二:面向对象

本文最后更新于:2021年7月23日 晚上


JavaSE基础复习二:面向对象

类和对象

  • 类是Java程序的基本组成单位

  • 类是对现实生活中异类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为

  • 类的组成:属性和行为

    • 属性:成员变量(实例)

    • 行为:成员方法(实例)类方法可以共用

  • 变量的类型:

    • 类变量(静态变量:static)

    • 成员变量(实例变量):堆中,随对象存在,有初始值

    • 局部变量(本地变量):栈,方法调用结束消失,没有初始值

  • this关键字:指向调用的对象

  • 封装

    • 原则:隐藏某些信息在类内部,不允许外部程序直接访问,对外提供Setter和Getter方法。

    • 优点:提高代码安全性,提高代码复用性

  • 构造方法:

    • 无参构造:如果没有写构造方法,系统默认提供一个无参构造方法

    • 有参构造方法:当存在有参构造,系统不再提供无参构造方法,当需要使用无参构造时,需要自己写一个无参构造方法,因此推荐都手动写一个无参构造方法。

API

String

  • 内容不可变,加操作会用StringBuilder操作

  • java.lang包下,不需要导入

  • 所有”被引起来的字符串”最终都被实现为此类的实例

  • 创建后值不能被更改,但是可以被共享

  • 底层原理是字节数组(byte[])

  • 常见构造方法:

    函数 功能
    public String() 创建一个空白字符串对象,不含有任何内容
    public String(char[] args) 根据字符数组的内容,来创建字符串对象
    public String(byte[] bys) 根据自己数组的内容,来创建字符串对象
    String str = “abc” 直接赋值(推荐)
  • 特点:

    • 每次new申请一个新空间,地址值不同

    • 直接赋值的方式给出的字符串,只要字符序列相同,无论在程序中出现几次,JVM都只会建立一个String对象,并在字符串池中维护,是同一个对象。

  • 字符串比较

    • ==进行比较:

      • 基本类型:比较数据值是否相同

      • 引用类型:比较地址值是否相同

    • 字符串是对象,它比较内容是否相同,是通过一个方法来实现:equals()

      1
      public boolean equals(Object anObject)
  • 常用方法:

    • charAt()

    • length()

    • toChartArray()

    • endsWith()

    • split()

StringBuilder

  • 构造方法:无参、传入String

  • 方法:

    • append(元素),返回对象本身

    • reverse(),返回相反的字符序列

    • toString()

集合基础:ArrayList

  • 常见使用方法:

    方法名 说明
    public ArrayList() 创建空集合
    public boolean add(E e) 在末尾添加元素,返回添加是否成功
    public void add(int index, E e) 在索引index处添加元素
    public boolean remove(Object o) 删除指定的元素,返回删除是否成功
    public E remove(int index) 删除指定处的元素,返回被修改的元素
    public E get(int index) 返回指定索引处的元素
    public int size() 返回集合中的元素个数
  • 如果List<Integer> list = new ArrayList<Integer>,要用remove方法删除元素1,那么:list.remove((Object)1)

继承

  • 面向对象三大特征:封装、继承、多态

  • 子类继承父类属性和方法,再进行属性和方法的扩充

  • public class 子类 extends 父类{}

  • Java只有单继承extends,接口可以多继承implements

  • 优缺点

    • 好处:

      • 提高复用性

      • 提高维护性

    • 坏处:

      • 类之间产生关系,耦合性增强
  • 变量使用:优先使用局部变量,如果没有去子类中找,没有去父类找,父类中也没有则报错

  • suger关键字:代表父类存储空间的表示(可以理解为父类对象的引用),用于访问父类的属性或方法。调用构造方法super(),子类自己可以用this()

  • 子类初始化一定先初始化父类(子类可能会使用父类的属性和方法),子类构造函数第一句话一定是:super(),没写编译器自动添加,如果手动调用super的有参构造,则不会自动添加无参构造。

  • 方法重写:

    • 子类中出现了和父类一样的方法声明

    • 当子类需要父类的功能,但功能主题子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父亲的功能,又定义了子类特有的内容注解

    • @Override,用来表示重写了父类方法

    • 重写了,默认访问子类方法,若没有重写,默认调用父类的方法

    • 重写时,方法的访问权限不能更低,但可以更高,私有不可重写

修饰符

  • package:包就是文件夹,用于对类进行分类管理

    • 手动建包,自己手动建立几个文件夹,将java文件编译后的class文件放入建立的包路径下,然后运行时候,在包外,命令行带包运行,例如:java com.quosimodo.HelloWorld即可。可以用javac -d HelloWorld.java,它会自动把class文件放进包里,然后直接运行即可。
  • 权限修饰符:

    • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

    • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

    • public : 对所有类可见。使用对象:类、接口、变量、方法

    • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。说明:

      • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;

      • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法(多态,super等访问)。

    • 我们可以通过以下表来说明访问权限:

      修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
      public Y Y Y Y Y
      protected Y Y Y 见上说明 N
      default Y Y Y N N
      private Y N N N N
    • 访问控制和继承

      请注意以下方法继承的规则:

      • 父类中声明为 public 的方法在子类中也必须为 public。

      • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。

      • 父类中声明为 private 的方法,不能够被继承。

  • final:可以修饰类和方法和变量

    • final修饰的类不可被继承

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

    • final修饰的变量:

      • 修饰基本类型,表示常量,不可改变

      • 修饰引用类型,地址不能变,但指向的内存里的值可变(即当调用内部的方法是,内部的值是可以改变的)

  • static:说明是静态的,可以修饰成员方法、成员变量

    • 修饰变量:表示类变量,被所有对象共享,可以直接调用(如果权限允许)

    • 修饰成员方法:表示类方法,被所有对象共享,可以直接调用

    • JVM加载类时,静态的变量方法会被自动分配空间,不需要new对象就能使用

    • 静态方法只能访问静态成员和静态方法,普通方法都静态和普通方法都能访问

多态

  • 前提:

    • 有继承/实现关系

    • 有方法重写

    • 有父类引用指向子类对象

  • 访问特点:

    • 成员变量:编译看左边,执行看左边

      成员方法:编译看左边,执行看右边(因为方法可以重写,而变量不能)

      父类引用指向子类实例:

      • 无法访问父类没有的变量和方法。

      • 方法被重写了则调用子类的方法,否则调用父类的方法。

      • 变量无论子类是否定义了父类相同的,只要是父类引用调用,一定是父类的,没有则报错。

  • 向上转型直接赋值,向下转型,强制类型转换

抽象类

  • abstract修饰的类称为抽象类,修饰方法则该方法为抽象方法

  • 一个没有方法体,只有声明的方法应该定义为抽象方法

  • 抽象类不能用protectedprivatefinal修饰

  • 抽象方法不能被final修饰

  • 抽象类中可以没有抽象方法

  • 类中有抽象方法,那么该类一定是抽象类

  • 抽象类不能创建实例,但可以建立引用(抽象类多态,实例化子类)

  • 抽象类用于让子类继承,子类必须重写所有抽象方法,不然该类依然是抽象类

  • 抽象类的成员特点:

    • 抽象类中可以有变量和常量,静态的常量也可以

    • 可以有构造方法,但是不能实例化,用于实例化子类

    • 可以有抽象方法和非抽象方法

接口

  • interface修饰的类,不能实例化,必须被继承(接口多态)

  • 所有方法都必须重写

  • 用implements继承,类和接口都可以多继承接口,类可以同时继承一个类和多个接口

  • 接口的成员特点:

    • 变量默认被static final修饰,所以只有静态常量

    • 方法默认被public abstract修饰,所以只有抽象方法

    • 没有构造方法

接口和抽象类的区别

抽象类 接口
成员 常量、变量、构造方法、普通方法、抽象方法 常量、抽象方法
关系 单继承 单继承、多继承
设计概念 对类抽象,包括行为和属性 对行为抽象

一般共有的的属性和方法用抽象类表示,而有些有,有些没有的行为则用接口实现,可以实现灵活的扩充。

形参和返回值

  • 基本类型做形参和返回值:略

  • 引用类型做形参和返回值

    • 类作为形参:传入该类(或子类)对象

    • 类做返回值:返回该类(或子类)对象

内部类

  • 在类的内部在定义类

    1
    2
    3
    4
    5
    6
    public class ExternalClass {
    // 外部类
    修饰符 class InternalClass {
    // 内部类
    }
    }
  • 访问特点

    • 内部类可以访问外部类的所有成员,包括私有

    • 外部类要访问内部类的成员,必须创建内部类对象

  • 分为:

    • 成员内部类:在类的成员位置

      • 在类的成员位置定义

      • 使用格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象

      • 规范:Outer.Inner oi = new Outer().new Inner();

      • 使用一般定义为private,然后在外部类定义函数对内部类新建对象进行访问

    • 局部内部类:在方法里定义的类

      • 可以使用局部定义的变量或常量和外部类的成员。

      • 匿名内部类:本质是一个对象

        • 前提:存在一个雷或者接口,这里的类可以是具体类也可以是抽象类

        • 本质:一个继承了类或实现了接口的匿名对象

        • 目的:省略定义一个类的定义过程,直接重写方法生成该类对象,适合于一次性使用的类

        • 使用格式

          1
          2
          3
          new 类名或接口名() {
          重写方法;
          };

          // 示例

          1
          2
          3
          4
          5
          new Inner() {
          public viod show() {

          }
          };
        • 使用方法

          在使用一个方法时:

          • 需要传入一个继承了某个类并重写某个方法的类的对象

          • 或者需要传入一个实现了某个接口实现了某个方法的对象,这时不需要去创建一个类,再创建一个实例,直接用匿名内部类就可以简写。