0

0

Java的三大特性--封装、继承、多态

零下一度

零下一度

发布时间:2017-07-03 09:54:48

|

1361人浏览过

|

来源于php中文网

原创

java中,面向对象编程有三大特性:封装继承多态

先来说说封装。

封装,顾名思义,就是通过抽象数据类型(即ADT,一种为了将数据类型和可能在该数据类型上进行操作而定义的)将数据以及基于数据的操作封装在一起,使之成为独立的“实体”。

首先先来看一个Person类:

 1 public class Person implements Comparable { 2     
 private String firstname; 3     private String lastname; 4  5     
 public String getFirstname() { 6         return firstname; 7     } 
 public void setFirstname(String firstname) {10         this.firstname = firstname;    }    
 public String getLastname() {14         return lastname;15     }16 17     
 public void setLastname(String lastname) {18         this.lastname = lastname;19     }
  hash = 83 * hash + Objects.hashCode(this.firstname);25         
ride30  
  return true;34         }35         
 //检查参数是否是正确的类型36         if (!(obj 
 on)) {37             
 return false;38         }39         //将参数转换成正确的类型40         
 Person person = (Person) obj;41         //对实体域进行匹配42         
 return Objects.equals(this.firstname, person.firstname)43                 
 && Objects.equals(this.lastname, person.lastname);44     }45 46     
 @Override47     public int compareTo(Person o) {48         
 if (this == o) {49             return 0;50         }         
 if (null == o) {52             return 1;53         }         //先判断姓氏是否相同55         int comparison = this.firstname.compareTo(o.firstname);56         if (comparison != 0) {57             return comparison;58         }59         //姓氏相同则比较名60         comparison = this.lastname.compareTo(o.lastname);61         return comparison;62     }63 }

对于封装的思想,我们需要尽可能的隐藏内部细节,只保留一些对外操作

立即学习Java免费学习笔记(深入)”;

例如在Person类中,我简单的定义了两个成员变量firstname和lastname,在setter方法里我们可以设置姓和名的一些格式,如首字母大写,其余小写来进行“格式化”,对外开放getter来获取变量的值。

现来总结一下封装的优点:

1.能够更好的把控成员变量,甚至是管理类的内部结构;

2.良好的封装能够减少耦合,使得代码更加健壮;

3.外部程序通过对外接口即可进行访问,无需关注实现细节。

 

再谈继承

继承描述的是is-a的关系,它是复用代码的一种方式,思想就在于定义和实现了一个类的时候,可以在一个已存在的类上进行扩展,把已存在的类的内容作为自己的内容,同时可以加入新的内容或者修改原来的方法来适应不同的需求。

下面来看两个例子:

 1 public class Person { 2  3     private String name; 4     
 private String sex; 5     private int age; 6  7     
 Person(String name, String sex, int age) { 8         
 this.name = name; 9         this.sex = sex;10         
 this.age = age;11     }12 13     //省略setter和getter方法...14  37 }
 1 public class Yang extends Person { 2  3     
 Yang(String name, String sex, int age) { 4         
 super(name, sex, age); 5     } 6  7     
 public String getName() { 8         
 return super.getName() + " is " + "genius"; 9     }
  }
1   public static void main(String... argc) {2 
//        
Yang yang = new Yang("yang", "male", 23);3         
Person person = new Yang("yang", "male", 23);4         
out.print(person.getName());5     }

输出: yang is genius 

注意,如果父类没有默认的构造器,子类构造函数中需要指定父类的构造器,否则编译将会失败!

从上面的代码中不得不引出关于继承的三大重要的东西,即构造器protected关键字以及向上转型

我们知道,构造器是不能被继承的,只许被调用!需要注意的是,子类是依赖于父类的(这也说明了一个弊端,即继承是一种强耦合关系),子类拥有父类的非private属性和方法(弊端二:破坏了封装),所以父类应先于子类被创建。

淘宝互刷平台刷信誉源码
淘宝互刷平台刷信誉源码

淘宝互刷平台刷信誉源码主要特性:1、系统采用国内著名CMS内核做为基础模块化开发,继承CMS原有强大功能之外,同时拓展任务模块、快递单模块、会员模块、信用评价模块等多个相关模块,支持生成HTML静态和动态ASP,有效的提高了系统的性能,不仅减轻服务器的负载提高搜索收录率,增加网站收录。2、系统主要由淘宝任务、天猫任务、京东任务、阿里任务、拼多多任务、收藏任务、流量任务、快递单生成与查询系统、信用评

下载

所以当父类没有默认构造器时,子类需要指定一个父类的构造器,并且写于子类构造器的第一行!当然父类有默认构造器,子类就无需super了,Java会自动调用。

再说protected关键字。插一句,只有合理使用访问修饰符,程序才能更好的为我们服务!!

对于子类,为了使用父类的方法,我们可以修改它的访问修饰符为protected,而不是一股脑儿的写上public!一劳永逸的做法可能会带来更大的危害!

而对于类的成员变量,保持它的private!

最后是向上转型了,它是一个重要的方面。从上面的的代码中,我写上了Person person = new Yang("yang", "male", 23); 这样结果是将Yang向上转型为Person,带来的影响可能就是属性和方法的丢失,但是它将是安全的。

同时它最大的作用是.....子类能够提供父类更加强大的功能以适用于不同的场合,完成不同的操作。

不太清楚可以看看这两个: List arrayList = new ArrayList(); 和 List linkedList = new LinkedList(); 

我们知道ArrayList是数组实现,查找更快;而LinkedList是链表实现,添加元素和删除元素效率更好!

但是向上转型有一个弊端,指向子类的父类引用因为向上转型了,它将只拥有父类的属性和方法,同时子类拥有而父类没有的方法,是无法使用了的!

所以,继承实现了软件的可重用性可拓展性。但是Java是单继承的,并且继承也有多个弊端(上面有提),其实还有一个弊端是父类一旦改变,子类可能也得进行改变!所以慎用吧。

 

最后一个特性是多态了。多态性就是不同的子类型可以对同一个请求做出不同的操作。同时多态性分为编译时多态性运行时多态性,对应着方法重载overload和方法重写override

对于方法重写,存在在继承中。它作为运行时多态性的表现,首先需要子类继承和实现父类的方法,然后向上转型,父类引用子类对象,对同一件事作出不同的响应。

方法重写时,需要注意的是子类的访问修饰符的访问范围不能小于父类,如父类的一个方法修饰符为protected,那么子类继承时,只能选用public或者protected。除了访问修饰符,其余完全相同于父类!

对于方法重载,出现在同一个类中,它是编译时多态性的表现。定义为:同名的方法如果有不同的参数列表便视为重载。

 

最后有一道经典的题目作为结尾,我也不知道出自哪....Look and think!

 1 public class A {   
 public String show(D obj) { 4         
 return ("Father and D"); 5     } 6  7     
 public String show(A obj) { 8         
 return ("Father and Father"); 9     } 
 }
 class B extends A {13 14     
 public String show(B obj) {15         
 return ("Child and Child");    
 }
 public String show(A obj) {19         
 return ("Child and Father");20     }21 } 
 class C extends B {24 }25 26 class D extends B {27 }
 class Test {30     public static void main(String[] args) {31         
 A a1 = new A();32         A a2 = new B();33         
 B b = new B();34         C c = new C();35         
 D d = new D();36 37         
 System.out.println("1--" + a1.show(b));38         
 System.out.println("2--" + a1.show(c));39         
 System.out.println("3--" + a1.show(d));40         
 System.out.println("4--" + a2.show(b));41         
 System.out.println("5--" + a2.show(c));42         
 System.out.println("6--" + a2.show(d));43         
 System.out.println("7--" + b.show(b));44         
 System.out.println("8--" + b.show(c));45         
 System.out.println("9--" + b.show(d));46     } }

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8万人学习

Java 教程
Java 教程

共578课时 | 53.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号