Java(14):面向对象、封装、继承、方法重写、多态、抽象类与接口、内部类

面向对象

面向对象编程(Object-Oriented Programming,OOP)的本质:

以类的方式组织代码,以对象的组织(封装)数据。

使用new关键字创造对象

使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:

  • 必须和类的名字相同。
  • 必须没有返回类型,也不能写void。

init

idea中 alt+insert 快速生成构造器代码,值得一提的是,构造器可以重载,如上图。

have_a_look

application:是脚本名。

封装

简单的说,封装就是属性私有,然后实现get/set方法获取/设置属性。

属性私有:private关键字

idea中 alt+insert 快速生成get/set代码.

继承

在Java中,所有的类默认直接或间接继承object类,只有单继承,没有多继承。

extends关键字

idea中 ctrl+H 浏览当前类的继承树.

首先看下列代码,本类中的构造方法可以通过this([参数])来调用重载的其他构造方法,如图:

有参调用无参构造方法

其次,子类可以显式的调用父类的构造方法(通过super([参数])),和this()一样,必须方法首行。

super

由于this([参数])和super([参数])都必须要在第一行,因此两个方法不能同时出现。

总结:

this:对象本身,没有继承也可以使用。

super:代表父类对象的引用,只能在继承条件下使用。

this():本类的构造。

super():父类的构造。

方法的重写

重写需要有继承关系,子类重写父类的方法:

  1. 方法名必须相同。
  2. 参数列表必须相同。
  3. 修饰符,范围可以扩大但是不能缩小:public > protected > default(什么都不写) > private
  4. 抛出的异常:范围不能扩大,但是可以缩小。

chongxie

方法的重写只和非静态方法有关,比如下面的代码:

Studens继承Person,他们都一个名字和参数相同的static方法,执行实例化,如下:

静态重写

接着,去掉static ,再次执行代码,发现结果不一致,调用的都是子类的test():

非静态重写

最后,一知半解的override修饰符。

override

多态

即同一个方法可以根据发送对象的不同而采用多种不同的行为方式.

比如: Father f = new Son(); 这是多态。

一个对象的类型是确定的,但可以指向对象的引用的类型有很多。

存在条件:

  1. 有继承关系。Father Son
  2. 子类重写父类方法。 static方法(属于类,不属于实例)、final: 常量的 被这个修饰不能被改变、private方法不能被重写。
  3. 父类引用指向子类对象。Father f = new Son();

注意:多态是方法的多态,没有属性的多态。

fs

父类型不能调用子类独有的方法:

course

如果一定要调用,需要将父类强制转换为子类:

classTransf

instanceof

判断一个对象是什么类型,用法:obj instanceof Class。

把子类转换为父类是由低到高转换,不需要强制转换,但是需要注意可能会丢失本来自己的一些方法,转换方式比如:Father obj = 子类对象;

把父类转换成子类,由高到低需要强制转换。

抽象类与接口

普通类:只有具体的实现。

抽象类:实现和规范(抽象方法)都有。

接口:只有规范。

抽象类

抽象类的所有方法,继承它的子类都要实现它,除非它也是一个抽象类

// abstract 抽象类
public abstract class Action{
    // abstrcat,抽象方法,只有方法的名字,没有方法的实现。必须在抽象类中。
    public abstract void doSomething();
}

抽象类不能new, 只能靠子类去实现它。抽象方法必须在抽象类中。

接口

作用:约束和规范。不能被实例化,没有构造方法。implements实现接口。

第一个接口:

// interface 定义的关键字
public interface InterfSsm{
    // 常量 public static final 一般不在接口定义常量
    int AGE = 99;
    
    // 接口中的方法默认都省略 public abstract
    void run(String name);
}

接口的实现:

// implements关键字
// 必须实现接口中的方法,且参数要一致
public class Application implements InterfSsm{
    @Override
    public void run(String name) {
        System.out.println(name);
    }
}

再来一个接口,实现多接口继承:

public interface InterPyy {
    void sing();
}
public class Application implements InterfSsm,InterPyy{
    @Override
    public void run(String name) {
        System.out.println(name);
    }

    @Override
    public void sing(){
        System.out.println("song");
    }
}

内部类

在类中定义一个类。

InnerClass

posted @ 2021-03-06 16:11  章土  阅读(97)  评论(0编辑  收藏  举报