面向对象的三大特征
继承、封装、多态。
继承
1.父类也称作超类、基类;子类:派生类。
2.JAVA中只有单继承,没有像C++那样的多继承,多继承会引起混乱,使得继承链过于复杂,系统难以维护。
3.子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如父类私有的属性和方法)。
4.如果定义一个类时,没有使用extends,则他的父类是:java.lang.Object。
方法的重写
重写
父类中的方法没有办法满足子类的要求,这个时候我们就需要进行方法的重写。
# 重写的要求
1.方法名必须相同
2.参数列表必须相同,如果不同就不是重写
3.返回值类型小于等于
4.访问修饰符子类重写的方法大于等于父类中的方法
5.静态的方法是不可以进行重写的
//父类
public class Fu {
String name;
public Fu() {
System.out.println("父类中无参构造");
}
public Fu(String name) {
System.out.println("父类中有参构造");
}
{
System.out.println("父类中代码块");
}
static{
System.out.println("父类中静态代码块");
}
}
//子类
public class Zi extends Fu{
public Zi() {
//super(); //会自动调用父类的无参构造
System.out.println("子类无参构造");
}
public Zi(int age) {
System.out.println("子类中的有参构造");
}
{
System.out.println("子类中代码块");
}
static {
System.out.println("子类中静态代码块");
}
}
//测试类
public class TestA {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
【1】构造方法是不可以被继承的
【2】在继承关系中,创建Zi()对象是不会自动创建Fu()对象的
【3】每一个构造函数第一行都会有一个默认的super();来进行父类无参构造的调用,但是注意这一步,不是创建父类对象
【4】this和super关键字可以一块使用;但是super();和this();不可以一块使用,this()和super()都是代码的第一行
【5】父类静态代码块—>子类的静态代码块—>父类代码块—>父类无参构造—>子类的代码块—>子类的无参构造
多态
多态 :向上转型,父类引用指向子类对像
编译的时候按照左侧编译,右侧执行
这种多态的表示的形式 ;在调用方法的时候只可以调用子类和父类都有的方法
子类的特有方法是没有办法使用多态方式进行调用
多态的好处
另外即使增加了新的子类,方法也无需改变,提高了扩展性,符合开闭原则
多态发生的条件
1.必须有继承关系
2.重写父类的方法
3.父类引用指向子类对象
方法重载和重写的区别
总体的区别:最主要的区别,是解决的问题不同,即作用不同。
英文 | 位置不同 | 作用不同 | |
重载 | overload | 同一个类中 | 在一个类里面为一种行为提供多种实现方式并提高可读性 |
重写 | override | 子类和父类间 | 父类方法无法满足子类的要求,子类通过方法重写满足要求 |
细节的区别:一个方法的声明自左向右包括权限修饰符、方法返回值、方法名、参数列表、抛出的异常类型等。下面从这几方面说明区别
修饰符 | 返回值 | 方法名 | 参数 | 抛出异常 | |
重载 | 无关 | 无关 | 相同 | 不同 | 无关 |
重写 | 大于等于 | 等于 | 相同 | 相同 | 小于等于 |
权限修饰符
修饰符 | 同一个类 | 同一个包中(可继承) | 子类 | 所有包的所有类 |
private | * | |||
默认/defalut | * | * | ||
protected | * | * | * | |
public | * | * | * | * |
2.default(friendly)表示没有修饰符修饰,只有同一个包的类能访问
3.protected表示可以被同一个包的类以及其他包中的子类访问
4.public表示可以被该项目的所有包中的所有类访问