天天看点

java三大特性梳理_继承、封装、多态

前景

今天终于把java的封装,继承,多态看完了,哈哈哈,说实话还行吧。突然想到一个面试官会问的问题,讲一讲封装、继承、多态这三个特性把,基础不打劳真的不行啊。所以我准备放慢自己的速度,认真多学学

封装

封装比较简单了,封装的目的

1、隐藏内部逻辑的实现,给调用者提供最大的方便,即使重构,对调用者也并没有影响。

2、保护了内部的数据,最简明的就是提供get和set方法对外提供访问private域的这样的接口。

继承

继承的最主要的目的就是复用代码,在已存在的类上建立新的类,新的类能够继承父类除了private以外的所有功能,还可以增加新的方法。也可以重写父类的方法,但是也有特殊的

构造器

构造器是子类无法继承的,子类可以通过super来调用父类的构造器,当父类存在构造器的时候,子类也必须正确的使用构造器,可以在构造器中增添初始化自己的属性。

1、父类中有默认的构造器的时候,子类无需显示调用父类的构造器,编译器会默认调用父类的构造器

2、当父类没有默认的构造器的时候,子类就需要用super来显示调用父类的构造器。

protected

保护型,是当前包和当前子类可见,尽管要尽量使用private,来达到尽可能的封装,但是有的时候还是需要用到它的。(暂时没有用到它),protected 用在方法上能够很好的控制方法仅子类可见

向上转型

什么叫向上转型呢?

人->员工->经理 这是一个继承,我们可以说,经理也是公司的员工,也可以把经理看做员工的一种。等于就是继承关系向上移动了一下,这在多态中会使用到。

注意点,缺陷

1、父类一旦改变,子类就一定会改变

2、继承会使得父类完全暴露给子类,一定程度上破坏了封装

3、继承的耦合性十分强,子类的功能有些来自与父类,能不强嘛- -

多态

多态是我学习中遇到不太清楚的地方,之前大概就只有动态绑定这四个字的印象所以单独揪出来好好看看

分类

1、编译时多态

2、运行时多态

定义:

  • 编译时:

    在编译时就能确定执行哪个方法

  • 运行时:一个类的引用变量调用的方法在运行的时候才能确定,这个引用变量究竟指向哪个类的实例对象,调用哪个类的方法,在程序运行期间才能确定,这个变量会进行动态绑定。从而调用某个方法,让程序自己选择多个运行状态就是多态性。

简而言之一句话:变量在运行的时候动态地去绑定某个类的实例上,然后去执行方法。

编译时多态:

  • 方法重载的时候都是编译时的多态,因为只需要根据参数的类型,个数,次序就可以确定执行重载当中的哪一种,这个很好理解就不举例子
  • 方法重写的时候可能会出现运行时动态

运行时多态:

三要素

1、继承

2、重写

3、向上转型

多态的实现遵循了一个重要的原则,向上转型的时候这个被调用的方法一定是超类中定义过的,就是必须是重写的这个方法。下面通过举例子详细说明

实例

Employee.java

package duotai;

public class Employee {

    private String name;
    private double salary;

    public Employee(String name, double salary)
    {
        this.name = name;
        this.salary = salary;
    }

    public double getSalary()
    {
        return this.salary;
    }

    public static String getType()
    {
        String type = "Employee";
        return type;
    }

}
           

Manager.java

package duotai;

public class Manager extends Employee 
{
    private double bonus;

    public Manager(String name, double salary, double bonus) 
    {
        super(name, salary);
        this.bonus = bonus;
    }

    @Override
    public double getSalary()
    {
        return super.getSalary() + this.bonus;
    }

    public double getBonus()
    {
        return this.bonus;
    }

    public static String getType()
    {
        String type = "Manager";
        return type;
    }

}
           

test

package duotai;

public class duotaiTest 
{
    public static void main(String[] args)
    {
        Employee ex1 = new Manager("xiaoxin", , );
        System.out.println(ex1.getSalary());
        System.out.println(ex1.getType())
        System.out.println(ex1.getBonus());// 这就是错误的,因为父类ex1没有这个方法
    }
}
           

最后的结果是8000.Employee

分析:

我们可以看到虽然说ex1的类型是Employee 但是实际执行的是Manager的方法,动态绑定到了Manager类中。

有一个比较重要的地方在于,静态方法了,静态方法不能被重写,只能被隐藏,重载和继承,重写只适合实例方法,访问对象的静态方法的时候,是引用类型决定了调用哪个静态方法而不是实际指向。所以最好的调用静态方法是类名.静态方法,这样不会混淆。

总结

三大特性比较难理解的就是多态了,基础还是需要打劳的呀~不然怎么继续向后前进呢~慢慢来~不急~