前景
今天终于把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", 5000, 3000);
System.out.println(ex1.getSalary());
System.out.println(ex1.getType())
System.out.println(ex1.getBonus());// 这就是错误的,因为父类ex1没有这个方法
}
}
最后的结果是8000.Employee
分析:
我们可以看到虽然说ex1的类型是Employee 但是实际执行的是Manager的方法,动态绑定到了Manager类中。
有一个比较重要的地方在于,静态方法了,静态方法不能被重写,只能被隐藏,重载和继承,重写只适合实例方法,访问对象的静态方法的时候,是引用类型决定了调用哪个静态方法而不是实际指向。所以最好的调用静态方法是类名.静态方法,这样不会混淆。
总结
三大特性比较难理解的就是多态了,基础还是需要打劳的呀~不然怎么继续向后前进呢~慢慢来~不急~