Java(14):面向对象、封装、继承、方法重写、多态、抽象类与接口、内部类
面向对象
面向对象编程(Object-Oriented Programming,OOP)的本质:
以类的方式组织代码,以对象的组织(封装)数据。
使用new关键字创造对象
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:
- 必须和类的名字相同。
- 必须没有返回类型,也不能写void。
idea中 alt+insert 快速生成构造器代码,值得一提的是,构造器可以重载,如上图。
application:是脚本名。
封装
简单的说,封装就是属性私有,然后实现get/set方法获取/设置属性。
属性私有:private关键字
idea中 alt+insert 快速生成get/set代码.
继承
在Java中,所有的类默认直接或间接继承object类,只有单继承,没有多继承。
extends关键字
idea中 ctrl+H 浏览当前类的继承树.
首先看下列代码,本类中的构造方法可以通过this([参数])来调用重载的其他构造方法,如图:
其次,子类可以显式的调用父类的构造方法(通过super([参数])),和this()一样,必须方法首行。
由于this([参数])和super([参数])都必须要在第一行,因此两个方法不能同时出现。
总结:
this:对象本身,没有继承也可以使用。
super:代表父类对象的引用,只能在继承条件下使用。
this():本类的构造。
super():父类的构造。
方法的重写
重写需要有继承关系,子类重写父类的方法:
- 方法名必须相同。
- 参数列表必须相同。
- 修饰符,范围可以扩大但是不能缩小:public > protected > default(什么都不写) > private
- 抛出的异常:范围不能扩大,但是可以缩小。
方法的重写只和非静态方法有关,比如下面的代码:
Studens继承Person,他们都一个名字和参数相同的static方法,执行实例化,如下:
接着,去掉static ,再次执行代码,发现结果不一致,调用的都是子类的test():
最后,一知半解的override修饰符。
多态
即同一个方法可以根据发送对象的不同而采用多种不同的行为方式.
比如: Father f = new Son(); 这是多态。
一个对象的类型是确定的,但可以指向对象的引用的类型有很多。
存在条件:
- 有继承关系。Father Son
- 子类重写父类方法。 static方法(属于类,不属于实例)、final: 常量的 被这个修饰不能被改变、private方法不能被重写。
- 父类引用指向子类对象。Father f = new Son();
注意:多态是方法的多态,没有属性的多态。
父类型不能调用子类独有的方法:
如果一定要调用,需要将父类强制转换为子类:
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");
}
}
内部类
在类中定义一个类。