![查看源图像](https://th.bing.com/th/id/R33674725d9ae34f86e3835ae30b20afe?rik=Pb3C9e5%2b%2b3a9Vw&riu=http%3a%2f%2fwww.desktx.com%2fd%2ffile%2fwallpaper%2fscenery%2f20180626%2f4c8157d07c14a30fd76f9bc110b1314e.jpg&ehk=9tpmnrrRNi0eBGq3CnhwvuU8PPmKuy1Yma0zL%2ba14T0%3d&risl=&pid=ImgRaw)
java 特性,封装,继承,多态
前言
想从头整理写一下,java 相关的东西,慢慢来从基础开始!
封装
简单讲就是把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口
优点
-
安全
-
隐藏实现
-
增加代码复用性
-
模块化
例:
封装类
/**
* 学生封装类
*/
public class Student {
private String name;
private Long id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
使用
public static void main(String[] args) {
Student student = new Student();
student.setId(1L);
student.setName("小明");
System.out.println(student.getName());
}
继承
从一个类中产生一个新的类子类,子类实现了父类所有的非私有化(private标识的)的属性和方法,并且根据实际需求进行改造和 扩展
优点
- 传递性,易于在基础上构造和扩充
- 减少代码冗余
- 维护性提高
多态
指允许不同类的对象对同一消息做出响应。 即同一消息可以根据发送对象的不同而采用多种不同的行为方式。 (发送消息就是函数调用)实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
示例:
// 主类
public class Main {
public static void main(String[] args) {
doSome(new Student());
doSome(new Teacher());
}
public static void doSome(Person person) {
person.work();
}
}
//父类
abstract class Person {
abstract void work();
}
//学生子类
public class Student extends Person{
@Override
void work() {
System.out.println("学习");
}
}
//教师子类
public class Teacher extends Person{
@Override
void work() {
System.out.println("教书");
}
}
输出;
到这的话基本明白了什么是 封装、继承、多态。如果刚基础java 的话 看到这基本差不多了,对java 已经比较熟悉的话 就往下看看多了解一下吧
java多态特性的实现原理
先看一下jvm结构图
上图可以看到当程序运行时,class会载入到jvm 中,并且在内部建立类信息,包括 方法代码、类变量、成员变量、方法表等,这个类型信息存储在方法区。
方法表是实现动态调用的核心。上面讲过方法表存放在方法区中的类型信息中。为了优化对象调用方法的速度,方法区的类型信息会增加一个指针,该指针指向一个记录该类方法的方法表,方法表中的每一个项都是对应方法的指针。
如果子类重写了父类的方法那么会和父类的同名的方法共享一个方法表项,因此在jvm 调用实例的时候就是根据方法表中的指针数,调用对应方法的代码中的第几个方法,因为 父子类中同名方法共享一个方法表所以指针数相同。从而实现多态。
*
上边只是一个大概的介绍,想要具体的了解的话 还是比较复杂的,其中包括类加载机制,jvm 运行原理 等等。关注我慢慢更新。