java中对封装、继承、多态的理解 封装继承多态
程序员文章站
2022-04-27 16:49:30
...
一、封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。
封装的作用如下:
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
看一个例子:
public class Man{
//对属性封装,姓名,年龄,妻子都是私有的
private String name;
Private int age;
private Woman wife;
//对外界提供方法的封装,可以设定和获取男人的年龄和姓名,但是男人不想妻子被外界
//打扰,所以不可以获得他的妻子,
public void setWife(Woman wife) {
this.wife = wife;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
二、继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
为什么要继承呢:1、反映现实的真实关系
2、减少代码冗余
3、对父类的属性和方法进行扩展和重写
继承中,子类不可以选择性的继承父类的东西,而是全部继承父类的属性和方法。其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。java中不支持多继承,一个类最多只能有一个父类。而在java中多继承是通过接口实现的。
例子:
//创建一个2D图形类
public class shape2D{
//2D图形有大小的属性
public int size;
//2D图形有计算周长和面积的方法
public void Length(){
System.out.println("可以计算周长");
}
public void Area(){
System.out.println("可以计算面积");
}
}
//创建一个圆类,继承2D图形类
public class circle extends shape2D{
//特有的半径属性
public float R;
//获得半径的方法
public void GetR(float r){
R=r;
}
}
在这个小程序中,圆类不仅有自己特有的属性和方法,也继承了shap2D类的属性和方法,这样写就减少了代码的冗余。
三、多态是由于继承和重写机制,相同类型的对象,执行相同的方法,得到的结果可能不一样。
例如:我再给以上例子的圆类中加一些代码:
public class circle extends shape2D{
//特有的半径属性
public float R;
//获得半径的方法
public void GetR(float r){
R=r;
}
//重写周长和面积的方法
public void Length(){
float a = (float) ((float)2*3.14*R);;
System.out.println("周长是"+a);
}
public void Area(){
float b = (float)3.14*R*R;
System.out.println("面积是"+b);
}
}
再写一个测试代码:
public static void main(String[] args) {
circle cir = new circle();
cir.GetR(3);
cir.Area();
cir.Length();
}
测试结果并不是shape2D中的方法执行的结果,由于方法相同,但是继承之后子类重写了方法,方法体不同,导致了最后结果不一样,这就是多态。
封装的作用如下:
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
看一个例子:
public class Man{
//对属性封装,姓名,年龄,妻子都是私有的
private String name;
Private int age;
private Woman wife;
//对外界提供方法的封装,可以设定和获取男人的年龄和姓名,但是男人不想妻子被外界
//打扰,所以不可以获得他的妻子,
public void setWife(Woman wife) {
this.wife = wife;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
二、继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
为什么要继承呢:1、反映现实的真实关系
2、减少代码冗余
3、对父类的属性和方法进行扩展和重写
继承中,子类不可以选择性的继承父类的东西,而是全部继承父类的属性和方法。其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。java中不支持多继承,一个类最多只能有一个父类。而在java中多继承是通过接口实现的。
例子:
//创建一个2D图形类
public class shape2D{
//2D图形有大小的属性
public int size;
//2D图形有计算周长和面积的方法
public void Length(){
System.out.println("可以计算周长");
}
public void Area(){
System.out.println("可以计算面积");
}
}
//创建一个圆类,继承2D图形类
public class circle extends shape2D{
//特有的半径属性
public float R;
//获得半径的方法
public void GetR(float r){
R=r;
}
}
在这个小程序中,圆类不仅有自己特有的属性和方法,也继承了shap2D类的属性和方法,这样写就减少了代码的冗余。
三、多态是由于继承和重写机制,相同类型的对象,执行相同的方法,得到的结果可能不一样。
例如:我再给以上例子的圆类中加一些代码:
public class circle extends shape2D{
//特有的半径属性
public float R;
//获得半径的方法
public void GetR(float r){
R=r;
}
//重写周长和面积的方法
public void Length(){
float a = (float) ((float)2*3.14*R);;
System.out.println("周长是"+a);
}
public void Area(){
float b = (float)3.14*R*R;
System.out.println("面积是"+b);
}
}
再写一个测试代码:
public static void main(String[] args) {
circle cir = new circle();
cir.GetR(3);
cir.Area();
cir.Length();
}
测试结果并不是shape2D中的方法执行的结果,由于方法相同,但是继承之后子类重写了方法,方法体不同,导致了最后结果不一样,这就是多态。
推荐阅读
-
JavaScript使用prototype原型实现的封装继承多态示例
-
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
-
【java基础】面试常见问题:类和对象,封装继承多态,final关键字,static关键字,类加载过程,双亲委派模型
-
一文带你了解java面向对象的三大特性:继承、封装、多态
-
python3全栈开发-面向对象的三大特性(继承,多态,封装)之继承
-
Java基础知识(三)面向对象、类和对象、封装继承多态、构造方法、内部类、包装类
-
java基础之面向对象(封装,继承,多态)
-
Java面向对象封装、继承、多态的总结
-
Java面向对象三个特征--封装、继承及多态
-
对继承与多态、成员变量的隐藏和方法重写、super关键字、final关键字、对象的上转型对象、抽象类的学习理解(java)