关于Java的三大特性,封装,继承,多态。
封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。封装要对类成员变量进行私有(private),并暴露修改和获取方法(setAttr、getAttr)。
- 封装可以隐藏内部程序实现的细节。(实际上我们在使用轮子时并不需要过度关注实现)
- 良好的封装能够减少代码之间的耦合度。
public class Animals {
/*
* 将对象中的成员变量进行私有化,外部程序是无法访问的。
* 但是对外提供了访问的方式,就是set和get方法。
*
* 对于该类的实体对象,外部程序只有赋值和获取值的权限,
* 是无法对内部进行修改,因此我们还可以在内部进行一些逻辑上的判断等,来完成我们业务上的需要。
*/
/*成员变量私有*/
private String name;
private Integer age;
/*暴露set、get方法*/
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
}
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。当然,如果在父类中拥有私有属性(private修饰),则子类是不能被继承的。
访问修饰符可以看这位大佬写的博客 Java中private、protected、public和default的区别 - jingmengxintang - 博客园
继承只支持单继承(可以使用接口达到多实现的目的),但允许多层继承。子类继承父类的属性和方法(非私有的),子类可以拥有自己的属性和方法,子类可以重写覆盖父类的方法(这里引申出重写和重载)。
- 提高代码复用性。
- 便于维护管理。
public class Animals {
/*父类*/
/*成员变量保护*/
protected String name;
protected Integer age;
/*暴露set、get方法*/
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
public void active(){
}
public void sleep(){
}
}
public class Dog extends Animals{
/*继承父类的属性和方法*/
/* 根据需要重写或重载方法*/
@Override
public void sleep() {
String str = "'override'";
System.out.print(str);
}
/**
* 重载规则:
*
* 1,被重载的方法必须改变参数列表(参数个数或者类型不一样)。
*
* 2,被重载的方法可以改变返回类型。
*
* 3,被重载的方法可以改变访问修饰符。
* @param i
*/
public void active(int i) {
super.active();
}
/* 调用super 和this*/
/**
* super()关键字的用法
* 1,子类的成员方法中,访问父类的成员变量。
* 2,子类的成员方法中,访问父类的成员方法。
* 3,子类的构造方法中,访问父类的构造方法。
*
*this关键字用法:
* 1,本类成员方法中,访问本类的成员变量。
* 2,本类成员方法中,访问本类的另一个成员方法。
* 3,本类的构造方法中,访问本类的另一个构造方法。
*
*/
public void use(){
super.active(); /*父类方法*/
this.active();/*调用父类*/
this.active(10);/*重载的方法*/
this.sleep(); /*重写*/
}
}
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态具有 消除类型之间的耦合关系,实现低耦合;增加类的灵活性、可扩充性、可替换性的特点。
多态的体现主要在
继承
父类引用指向子类
重写
注意:在多态中
方法的调用 :编译看左边,运行看右边。
变量的调用:编译看左边,运行看左边。
格式:父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把它当作父类来使用。
注意:向上转型一定是安全的。
缺点:一旦向上转型,子类中原本特有的方法就不能再被调用了。
Animals dog = new Dog();
引申:向下转型
向下转型是一个还原动作
Dog dog = (Dog) dog;
可以理解为强转,但要注意类之间的差异(如将数组强转为字符串就会报异常,虽然所有的类源头都继承于基类Object)
强制类型转换