大家好,我是程序员青戈,一个被Bug耽误了才艺的程序员👦专注于Java领域的知识分享和技术交流,每天会给大家带来Java学习的干货教程📚
微信搜索公众号 Java学习指南,回复 面试 领取一线大厂面试题一套可以进技术交流学习群一起共同进步哦😊
文章目录
- 封装
- public、private、protected修饰符
- 规范
- 封装的好处
- 继承
- 继承的初始化顺序
- 继承示例
- 多态
- 多态概念
- 多态要注意的细节
- 多态的应用
- 关于作者
Java面向对象,有三大特性,下面一个一个细细展开。
封装
public、private、protected修饰符
说到封装,Java 中有三个访问权限修饰符:private、protected 以及 public,如果不加访问修饰符,表示包级可见。我们先来看下这三个修饰符的作用。
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。
如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例去代替,也就是确保满足里氏替换原则。
规范
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。例如下面的例子中,AccessExample 拥有 id 公有字段,如果在某个时刻,我们想要使用 int 存储 id 字段,那么就需要修改所有的客户端代码。
public class AccessExample {
public String id;
}
可以使用公有的 getter 和 setter 方法来替换公有字段,这样的话就可以控制对字段的修改行为。
public class AccessExample {
private int id;
public String getId() {
return id + "";
}
public void setId(String id) {
this.id = Integer.valueOf(id);
}
}
封装的好处
- 提高数据的安全性。
- 操作简单。
- 隐藏了实现。
继承
继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:
注:java中的继承是单继承,即一个类只有一个父类。
继承的初始化顺序
- 初始化父类再初始化子类
- 先执行初始化对象中属性,再执行构造方法中的初始化。
基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:
父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法
继承这块大家都比较熟,我来举个例子:
继承示例
Animal动物:
public class Animal {
/**名称*/
public String name;
/**颜色*/
public String color;
/**显示信息*/
public void show(){
System.out.println("名称:"+name+",颜色:"+color);
}
}
Dog狗:
/**狗继承自动物,子类 is a 父类*/
public class Dog extends Animal {
/**价格*/
public double price;
}
dog并没有定义color属性,但在使用中可以调用,是因为dog继承了父类Animal,父类的非私有成员将被子类继承。如果再定义其它的动物类则无须再反复定义name,color与show方法。
多态
多态这块,我要跟大家好好唠叨唠叨,首先来看下概念:
多态概念
多态:一个对象具备多种形态。
①父类的引用类型变量指向了子类的对象
②接口的引用类型变量指向了接口实现类的对象
多态的前提:必须存在继承或者实现关系。
动物 a = new 狗();
多态要注意的细节
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
注意:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。(编译看左边)
多态的应用
- 多态用于形参类型的时候,可以接收更多类型的数据。
- 多态用于返回值类型的时候,可以返回更多类型的数据。
多态的好处: 提高了代码的拓 展性。
我们想想,平时写MVC三层模型的时候,service为什么要写接口呢?因为可能有个service会有多种不同的实现。service就是我们平时用多态最多的地方。
关于作者
程序员青戈
,5年一线Java开发经验,先后在IBM、阿里、科大讯飞踩坑~
微信搜索:Java学习指南
关注我的原创公众号感谢大家的阅读,创作不易,能否请您小手点一点下方的
一键三连
支持一下作者呢😊谢谢~