根据网上其他地方的解释,以及查找资料,将自己对java三大特性的理解展示如下。

封装(属性私有,set/get,在set中限定一些不安全的情况)

封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。

代码举例:

public class Person {//Person类的成员变量String name; //姓名int age;    //年龄int sex;    //性别String role; //角色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;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}
}

测试:

public class ApplicationTest {public static void main(String[] args) {Person person = new Person();   //实例化 Personperson.setName("宇晨");  //name赋值为:宇晨person.setAge(20);      person.setSex("男");person.setRole("学生");System.out.println(person.getName()+","+person.getAge()+","+person.getSex()+","+person.getRole());}
}

输出:

使用封装的好处

1、良好的封装能够减少耦合

2、类中的内部结构(属性)可以按照需求进行修改(重新赋值)。

3、可以对成员进行更精确的控制。

4、能够隐藏代码实现的细节。

5、系统可维护性增加了。

继承:

不同类型的对象,相互之间可能会拥有一些相同共同点。例如:教师角色应该做什么?学生角色应该做什么?家庭角色应该做什么?都有共同点就是-应该做什么。

继承的本质是对某一批类的抽象, 是使用已存在的类的定义作为基类建立新类的技术,新类的定义可以继承父类,从而增加新的数据或新的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。

关于继承如下 3 点应该记住:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有

  2. 子类仍拥有自己属性和方法,即子类可以对父类进行扩展。

  3. 子类可以使用自己的方式实现父类的方法。

代码举例(先介绍原始):

//定义一个Person类
/*public class Person {//Person类的成员变量String name; //姓名int age;    //年龄int sex;    //性别String role; //角色//Person类的方法public void TeacherDoing(){  //教师要做的事情System.out.println("老师负责传道受业!");}public void StudentDoing(){ //学生要做的事情System.out.println("学生要努力学习!");}public void FamilyDoing(){  //家庭要做的事情System.out.println("成为孩子最坚实的后盾!");}}

测试:

public class ApplicationTest {/*  public static void main(String[] args) {Person person1 = new Person();person1.StudentDoing();}
}

输出:

原始方式,可以使用if判断的方式将不同角色的人的方法,放到一个方法Doing()内,根据传入的角色不同调用不同的方法。进行修改:

public class Person {//Person类的成员变量String name; //姓名int age;    //年龄int sex;    //性别String role; //角色//使用 if 判断方式选择 不同方法public void Doing(String role) {  // 集合到同一个方法内if ("teacher".equals(role)) { //当传入角色为 teacher时System.out.println("老师负责传道受业!");}if ("student".equals(role)) {  //当传入角色为 student时System.out.println("学生要努力学习!");}if ("family".equals(role)) {  //当传入角色为 family时System.out.println("成为孩子最坚实的后盾!");}}}

测试:

public class ApplicationTest {// 测试方式一:public static void main(String[] args) {Person person1 = new Person();person1.Doing("student");}

输出:

弊端:仅适合角色不多的情况。如果角色较多,社会产生许多If 判断代码,代码产生冗余。
方式二(继承),由于Teacher、Student、Family都有一个共同点 Doing做什么,接下来可以使用继承的方式实现代码复用。

代码举例(使用继承):

public class Person {//Person类的成员变量String name; //姓名int age;    //年龄String sex;    //性别String role; //角色//共同的方法Doing(),表示应该做的事情;public void  Doing(){ }}

测试:

public class ApplicationTest {// 测试方式二(使用了继承,实现多态方式):public static void main(String[] args) {Person person2_1 = new Teacher();  //向上转型,Person为父类,Teacher是子类person2_1.Doing();Person person2_2 = new Student(); //向上转型,Person为父类,Student是子类person2_2.Doing();Person person2_3 = new Family();//向上转型,Person为父类,Family是子类person2_3.Doing();}
}

输出:

多态(重要)

多态,顾名思义,表示一个对象具有多种状态,具体表现为父类的引用指向子类的实例。

多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单可以理解为:不同的对象调用统一个方法实现不同功能。(如上面继承,既是多态的摆弄先形式)。

实现多态的条件:

1、继承:对象类型和引用类型之间具有继承(类)/实现(接口)的关系 。简单理解:必须有子类和父类的继承关系;
2、重写: 子类必须按照需要重写父类的某些方法,调用的时候调用的是子类重写的方法而不是原本父类中的方法。
3、向上转型:父类引用需要指向子类对象

代码举例:

public class Person {//Person类的成员变量String name = "宇晨"; //姓名public void doing(){System.out.println("我是小-doing方法!");}public void Doing(){System.out.println("我是大-Doing方法!");doing();}}

继承代码:

public class Polymorphic extends Person{String name="四夕-宇晨";@Overridepublic void doing() { //重写System.out.println("重写了小-doing()方法!");}public void Doing(String name) { //重载System.out.println("我是重载方法!");doing();}public void other(){System.out.println("我是其他方法!");}
}

测试:

public class ApplicationTest {//测试多态:public static void main(String[] args) {Person person = new Polymorphic();  //向上转型,Person的引用指向Polymorphic对象。person.Doing();person.doing();//  person.other(); //不能调用此方法因为Person类里面,没有定义other()这个方法。//直接调用成员变量,查看结果System.out.println(person.name);}
}

结果分析:

子类 Ployamorphic重载了Doing()方法,重写了doing()方法,当我们调用person.Doing()方法时,因为向上转型的原则,先会调用父类中的Doing()方法(子类中的doing()重载后丢失),在调用子类中的doing()方法。因为重写了doing()方法,当我们调用person.doing()方法时,直接调用子类中的doing()方法。

直接调用成员变量结果是:宇晨。

我们发现如果方法被重写了,他是成员变量也重复定义了,父类的引用指向子类的对象,调用的方法将是子类的,而成员变量的值将是父类的。这是java的编译机制造成的。方法时在运行的时候取值不定, 所以方法时动态绑定的,而成员变量的初值是编译的时候就绑定的。所以为了避免这类问题,java程序员通常会使用方法,而不是直接使用成员变量。

Person person = new Polymorphic(); //向上转型不需要强转
Polymorphic ploymorphic = (Polymorphic) new Person();//向下转型需要强转
ploymorphic.other();  //此时可以调用other()方法
总结:“编译看左边,运行看右边” 也就是编译的时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。

Java的三大特性之封装、继承、多态-----最简理解相关推荐

  1. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  2. Day33 继承的三大特性之 封装与多态

    Day33 面向对象的三大特性之 封装与多态 文章目录 Day33 面向对象的三大特性之 封装与多态 1.派生方法的实操 2.面向对象三大特性之封装 3.property 伪装属性 4.面向对象三大特 ...

  3. java的封装性的优点_18、Java的三大特性之封装

    Java的三大特性 java是一个面向对象的语言,所以java也有面向对象语言的三大特性:继承,封装,多态,任何一个java项目,都会用到这三种特性,所以掌握好这三大特性非常的重要. 封装 我们为什么 ...

  4. Java——OOP三大特性之封装性(Encapsulation)通俗详细

    面向对象(Object Oriented Programming)三大特性 1.封装(Encapsulation) 2.继承(Inheritance) 3.多态(Polymorphism) 定义 En ...

  5. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  6. Java的三大特性:封装、继承、多态

    一.类的概念: 类一般包括两个部分:属性(成员变量)和方法(成员方法) 方法组成部分:修饰符(可选) 返回值类型(必须) 方法名(必须)参数列表(可选) package com.classTest.p ...

  7. java基础----(三大特性:封装,继承,多态)

    封装 将对象的转态信息隐藏在对象内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对内部信息的访问和操作. 封装的好处: 隐藏类的实现细节 使用者只能通过事先预定的方法来访问数据,从而可以在该 ...

  8. java面向对象三大特性:封装、继承、多态——举例说明

    概念 封装:封装就是将客观的事物抽象成类,类中存在属于这个类的属性和方法. 继承:继承就是把父对象继承过来,这样子类就存在了父类的操作方法,java是单继承,就是只能继承一个父对象. 多态:多态就是程 ...

  9. java的三大特性,封装,继承,多态

    封装 Java代码   /** * 所谓封装,就是将对象具有的成员变量和成员函数包装和隐藏起来,让外界无法直接使用, * 被封装的成员只能通过某些特定的方式才能访问. * 实现封装有两个步骤: *   ...

最新文章

  1. PHP $_FILES中error返回值详解
  2. 线程同步(互斥锁、条件、读写锁、信号量)
  3. 调出sharepoint错误的详细页面
  4. GPU事务性内存技术研究
  5. loot recycler_loot++ - MC百科搜索 - MC百科|最大的Minecraft中文MOD百科
  6. k8s核心技术-Helm(快速部署应用)---K8S_Google工作笔记0046
  7. 堆内存里的各种奇怪填充值
  8. IOS 地理编码以及反地理编码
  9. 荣耀安装google谷歌服务框架_荣耀V20怎么下载安装谷歌服务助手,GMS框架安装教程...
  10. idea里面的注释模板
  11. 对接金蝶云星空审批流
  12. win10系统电脑修改注册表设置自动锁屏时间
  13. 2021 ACA世界大赛中国赛区王者诞生
  14. win10设置护眼颜色(豆沙绿)
  15. rk3328 Android8.1 usb otg host和device切换
  16. C语言Hello World
  17. 关于objectArx /CAD二次开发中“绘制点、线、圆、圆弧、多段线、矩形、文字等”
  18. 加密芯片十大品牌对比
  19. 投身大数据领域,你对flink培训课程付出足够多的努力了吗?
  20. 树莓派魔镜项目——笔记三 第三方库

热门文章

  1. 网易2018实习生招聘笔试题
  2. echarts xAxis字显示不全
  3. linux中dd命令详解,Linux dd命令详解
  4. 99乘法口诀表用python写_python 99乘法口诀表
  5. 来自MyBatis不一样收获结果的探索之旅
  6. Win10使用Geth搭建本地开发私有链(2021版)
  7. 胡子决定编程语言运势[转载]
  8. 语c和c语言,00后黑话等级测试,你能看懂几句?
  9. python +appium实现原理_Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)...
  10. 【开源代码】在criteo数据集用MLP跑出AUC=0.809的结果