封装

将对象的转态信息隐藏在对象内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对内部信息的访问和操作。

封装的好处:

  • 隐藏类的实现细节
  • 使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。
  • 可进行数据检查从而有利于保证对象信息的完整性
  • 便于修改,提高代码的科维护性

具体实现方式:

使用 private 修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public 的 set 和 get 方法来设置和获取成员变量的值。

Java 中主要有 private、protected、public 和 默认访问权限四种:

  • private(当前类访问权限):如果类里面的一个成员(包括成员变量,方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。用于修饰成员变量最合适就可以将其隐藏在该类内部。
  • default(包访问权限):如果类里面的一个成员(包括成员变量,方法和构造器等)或者一个外部类不使用任访问控制修饰符,就成他为包访问权限的,default访问控制的成或外部类可以被相同包下的其他类访问
  • protected(子类访问权限):如果类里面的一个成员(包括成员变量,方法和构造器等)使用protected访问控制符来修饰,那这个成员既可以被同一包中的其他类 访问,也可以被不同包中的子类访问。通常是希望其子类来重写这个方法
  • public(公共访问权限):这个类里面的一个成员(包括成员变量,方法和构造器等)或者一个外部类使用public访问控制符来修饰,那么这个成员或外部类就可以被所有的类访问,不管访问和被访问类是否处于同一个包中,是否具有父子继承关系。

访问控制级别如下表:


例子:

public class Person {//使用private修饰成员变量,将这些变量隐藏起来private String name;private int age;//提供方法来操作name成员变量public void setName(String name) {//执行合理性校验,要求名字必须在2~6之间if (name.length()>6 || name.length()<2){System.out.println("设置的名字不符合要求");return;}else{this.name=name;}}public String getName() {return name;}//提供方法来操作gae成员变量public void setAge(int age) {//执行合理性校验,要求年龄必须在0~100之间if (age>100 || age<0){System.out.println("设置的年龄不符合要求");return;}else{this.age=age;}}public int getAge() {return age;}
}

继承

继承概念

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。java继承通过extends关键字来实现,实现继承的类被称为子类(基类),被继承的类被称为父类(超类)。

生活中的继承:


兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

类的继承格式

class 父类{}class 子类 extends 父类{}

为什么要继承

接下来我们通过实例来说明这个需求。
开发动物类,其中动物分别为老虎以及豹子,要求如下:

  • 老虎:属性(姓名,id),方法(吃,睡,自我介绍)
  • 豹子:属性(姓名,id),方法(吃,睡,自我介绍)

老虎:

public class Tiger{ private String name; private int id; public Tiger(String myName, int  myid) { name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); }public void sleep(){System.out.println(name+"正在睡");}public void introduction() { System.out.println("大家好!我是" + id + "号" + name + "."); }
}

豹子:

public class Leopard{ private String name; private int id; public Leopard(String myName, int  myid) { name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); }public void sleep(){System.out.println(name+"正在睡");}public void introduction() { System.out.println("大家好!我是" + id + "号" + name + "."); }
}

从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类:

食肉动物类:

public class Carnivore{ private String name;  private int id; public Carnivore(String myName, int myid) { name = myName; id = myid;} public void eat(){ System.out.println(name+"正在吃"); }public void sleep(){System.out.println(name+"正在睡");}public void introduction() { System.out.println("大家好!我是"+ id + "号" + name + "."); }
}

这个Carnivore类就可以作为一个父类,然后老虎类和豹子类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码:

继承后的老虎:

public class Tiger extends Carnivore{ public Tiger(String myName, int myid) { super(myName, myid); }

继承后的豹子:

public class Leopard extends Carnivore{ public Tiger(String myName, int myid) { super(myName, myid); }

super和this有什么区别?

super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
super和this的用法相似。
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。

继承的优点和缺点

优点:

  • 提高了代码的复用性
  • 提高了代码的维护性
  • 建立了类与类之间的关系,继承是多态的前提。

缺点:

  • 在一定程度上,造成类与类之间的强关联,即所谓的高耦合。
  • 父类功能的改变对子类也会造成影响。

注意事项:

Java 不支持多继承,下面是错误的:

如果想实现A和B里面的方法可以用implements实现:

多态

多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

多态是对象的多种变现形式的体现:

现实生活中,比如“叫”这个动作:
猫的“叫”:“喵喵喵~”
狗的“叫”:“汪汪汪~”
giao哥的“叫”:“一给我的giaogiao~”
同一个事件发生在不同的对象上会产生不同的结果

多态的优点

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

比如:

Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

例子:

public class Test {public static void main(String[] args) {show(new Cat());  // 以 Cat 对象调用 show 方法show(new Dog());  // 以 Dog 对象调用 show 方法Animal a = new Cat();  // 向上转型  a.eat();               // 调用的是 Cat 的 eatCat c = (Cat)a;        // 向下转型  c.work();        // 调用的是 Cat 的 work}  public static void show(Animal a)  {a.eat();  // 类型判断if (a instanceof Cat)  {  // 猫做的事情 Cat c = (Cat)a;  c.work();  } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a;  c.work();  }  }
}abstract class Animal {  abstract void eat();
}  class Cat extends Animal {  public void eat() {  System.out.println("吃鱼");  }  public void work() {  System.out.println("抓老鼠");  }
}  class Dog extends Animal {  public void eat() {  System.out.println("吃骨头");  }  public void work() {  System.out.println("看家");  }
}

执行以上程序,输出结果为:

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

多态的实现方式

  • 重写:详细可访问:Java 重写(Override)与重载(Overload)

  • 抽象类和抽象方法:详细可访问:抽象类和抽象方法

  • 接口:生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型

    java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。详细可访问:接口

java基础----(三大特性:封装,继承,多态)相关推荐

  1. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  2. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  3. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  4. Java基础知识之封装+继承+多态详解

    前言 这篇博客是基于Java类和对象的基础之上的相关知识点.因为特别重要且语法规则较多,所以想单独总结方便之后复习. 本篇博客涉及知识点思维导图: 目录 1.封装 2.继承 3.多态 1.封装 生活中 ...

  5. Java面向对象三大特性之继承多态的预习笔记,are you ready? 面对疾风吧!

    文章目录 继承(extends) super关键字 方法重写 instanceof关键字 abstract关键字 接口(interface) 多态 继承(extends) AextendsB A继承了 ...

  6. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  7. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  8. 初步理解Java的三大特性——封装、继承和多态

    声明:整理自网络,如有雷同,请联系博主处理 一.封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被 ...

  9. java三大特性 继承_java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  10. Java的三大特性之继承

    此处我会分为这几个部分来理解继承是怎么样的: 1.区分封装.继承和多态 2.区分限定词的范围 3.区分隐藏.覆盖.重载 4.继承的理解 5.一道面试题的原型 --------------------- ...

最新文章

  1. python常用内置函数总结-python常用内置函数整理—反射
  2. 【音频处理】Melodyne 自动修正功能 ( 修正音高中心 | 修正音高补偿 | 节拍自动修正 | 量化时间 )
  3. python 消息队列、异步分布式
  4. 按照顺序执行_问一个多线程的问题:如何才能保证线程有序执行?
  5. 奇虎360WEB平台部招贤纳士之产品经理、开发工程师
  6. 代码源文件中去掉断元字符^M的方法介绍
  7. python函数第二次运行报错_(数据科学学习手札54)Python中retry的简单用法
  8. SQL Sever 2012学习总结之使用SQL语言创建数据库与表
  9. DS4000系列存储配置storage manager介绍
  10. 如何实现对网站页面访问量的统计?
  11. jQuery筛选-文档处理
  12. mapbox自定义地图
  13. 详解JavaScript运算符(二):字符串运算符
  14. 操作系统不等于 Linux,六问操作系统新时代!
  15. 工作为了生活,却远远不止于生活
  16. 【天文】基于Matlab模拟太阳位置跟踪和日行迹现象
  17. iOS编译FFmpeg、kxmovie实现视频播放
  18. vue数组改变但是页面不更新的解决方案
  19. python列表批量删除元素_pythonlist批量删除元素-女性时尚流行美容健康娱乐mv-ida网...
  20. shell语法----expr命令

热门文章

  1. CDH大数据平台 ERROR Heartbeating to 192.168.0.200:7182 failed
  2. 计算机设计网页基础知识,网页设计的基础知识
  3. National Day
  4. [YOLOv7/YOLOv5系列算法改进NO.5]改进特征融合网络PANET为BIFPN(更新添加小目标检测层yaml)
  5. Android快速SDK(24)第三方分享UmengShare【肌肉记忆,分钟接入】
  6. 3 、OpenCvSharp 图片转视频
  7. MySQL(十三):分区表( Partitioning Table)
  8. 中粮集团进军互联网:先试B2B再试B2C
  9. bucket list java,Java AmazonS3.deleteBucket方法代码示例
  10. ElasticSearch控制should查询的精度(匹配个数)