一、封装

  1. 封装的概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作。
  2. 封装的2个大致原则:
    1)把尽可能多的东西隐藏起来,对外提供便捷的接口
    2)把所有的属性隐藏起来
  3. 封装的实现:
    ◆JAVA定义了4种访问权限:public (公有的)、protected(保护的)、private(私有的)和默认的
    ◆封装步骤
    1)修改属性的可见性:设为private,防止错误修改
    2)创建getter/setter方法:用于属性的读写
    3)在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断

    4.使用封装的好处:
    ◆便于使用者正确使用系统,防止错误修改属性
    ◆有助于系统之间的松耦合,提高系统独立性
    ◆提高软件的可重用性
    ◆降低了构建大型系统的风险
  

package com.fengzhuang;
/*** @author yutianbao* @param* @date 2019/3/13 22:04* @return* @Motto: good good study,day day up*/
public class FengZhuang {/*封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问。*/// 实现封装分三步//1.修改属性的可见性:将属性私有化private String name;private int age;private String phoneNo;//2.创建setter/getter方法//给name赋值public String getName() {return this.name;}//取name值public void setName(String name) {this.name = name;}public int getAge() {return this.age;}//3.添加对属性操制作的限制public void setAge(int age) {if(age>0&&age<=150){this.age = age;}else{System.out.println("您输入的年龄错误!");this.age = 25;}}public String getPhoneNo() {return this.phoneNo;}public void setPhoneNo(String phoneNo) {if(phoneNo.length()==11){this.phoneNo = phoneNo;}else{System.out.println("您输入的手机号错误!");this.phoneNo = "1xx xxxx xxxx" ;}}public void print(){System.out.println("我的名字是;"+this.getName()+",年龄是:"+this.getAge()+",手机号是:"+this.getPhoneNo());}}

  

package com.fengzhuang;
/*** @author yutianbao* @param* @date 2019/3/13 22:08* @return* @Motto: good good study,day day up*/
public class Test {public static void main(String[] args){//FengZhuang fez = new FengZhuang("蒋辉煌",25,"18975742300");FengZhuang fez = new FengZhuang();fez.setName("余与");fez.setAge(160);fez.setPhoneNo("13632908564");fez.print();}} 

二、继承

  

  • 继承是一种由已有类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类。新类继承一般类的状态和行为,并根据需要增加它自己的状态和行为。
  • 从现有类出发定义一个新类,称为新类继承了现有的类,其中被继承的现有类叫做超类(superclass)或父类,由继承而得到的类称为子类(subclass)。
  • Java中规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,而且允许多层继承,即子类还可以有它自己的子类,在下一层的继承关系中原先的子类就变成了父类。这样的继承关系就形成了继承树。

  1、类继承用关键字extends实现,格式为:[访问权限修饰符]   class 子类名  extends 父类名{   子类的类体   }

     如果没有extends子句,则表示这个类直接继承Object,因为Java中所有的类都继承Object类。

  2、成员变量的继承

  子类继承父类中所有可被子类访问的成员变量。继承原则如下:

  2.1    能够继承那些声明为public和protected的成员变量。

  2.2    能够继承同一包中的那些默认修饰符的成员变量。

  2.3    不能继承那些声明为private的成员变量。

  2.4    如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量。此时子类的成员变量称做隐藏了父类的成员变量。

  总之,子类可继承父类的public、protected和默认修饰变量,不能继承private变量。反之,如果父类不允许其子类访问它的某些成员,那么它必须以private方式声明该成员。这一点充分体现了类封装的信息隐蔽原则。

  3、成员方法的继承

  子类继承成员方法的规则类似于继承成员变量的规则:子类继承父类中所有可被子类访问的成员方法。继承规则如下:

  3.1    能够继承那些声明为public和protected的成员方法。

  3.2    能够继承同一包中的默认修饰符的成员方法。

  3.3    不能继承那些声明为private的成员方法。

  3.4    不能继承父类的构造方法。

  如果子类方法与父类方法同名,则不能继承。子类方法称为覆盖(或重写)了父类中的那个方法。

  总之,子类可继承其父类的public、protected和默认修饰方法,不能继承private方法。子类除了可以继承父类中的变量及方法,还可以增加自己的成员。当一个父类成员不适合该子类时,子类会重新定义它,如果是重新定义的是成员变量就是隐藏父类的变量,如果是成员方法就是覆盖父类的方法。

package com.extend;
/*** 宠物类,狗狗和企鹅的父类*/
public class Pet {private String name = "无名氏";// 昵称private int health = 100;// 健康值private int love = 20;// 亲密度/*** 无参构造方法*/public Pet() {System.out.println("父类无参构造方法");}/*** 有参构造方法* @param name  昵称*/public Pet(String name,int health,int love) {this.name = name;this.health = health;this.love = love;System.out.println("父类有参构造方法");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getHealth() {return health;}public void setHealth(int health) {if(health<0||health>100){System.out.println("健康值应该在0至100之间,默认值为60。");this.health=60;return;}this.health = health;}public int getLove() {return love;}public void setLove(int love) {if(love<0||love>100){System.out.println("亲密度应该在0至100之间,默认值为10。");this.love=10;return;}this.love = love;}/*** 输出宠物信息*/public void print() {System.out.println("宠物的自白:\n我的名字叫" +this.name + ",我的健康值是" + this.health+ ",我和主人的亲密程度是" + this.love + "。");}//重写Object类的equals()方法public boolean equals(Object obj){boolean flag = false;if(obj==this){  //==比较引用地址flag = true;}if(!(obj instanceof Pet)){  //instanceof  判断类型flag = false;}else{Pet pe = (Pet)obj;if(pe.love==this.love&&pe.health==this.health&&pe.love==this.love){flag = true;}}return flag;}
}

  

package com.extend;
/*** 狗狗类,宠物的子类*/
public class Dog extends Pet {private String strain="哈士奇";// 品种//无参构造方法public Dog(String name,int health,int love,String strain) {super(name,health,love);this.strain = strain;System.out.println("dog类构造方法");}public String getStrain() {return strain;}public void setStrain(String strain) {this.strain = strain;}//重写父类方法public void print() {System.out.println("宠物的自白:\n我的名字叫" +this.getName() + ",我的品种是" + this.getStrain()+",我的健康值是" + this.getHealth()+ ",我和主人的亲密程度是" + this.getLove() + "。");}
}

  

package com.extend;import com.sun.jmx.snmp.SnmpString;/*** 企鹅类*/
public class Penguin extends Pet {private String sex="Q仔";// 企鹅性别//构造方法public Penguin(String name,int health,int love,String sex) {super(name,health,love);this.sex = sex;System.out.println("penguin类构造方法");}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}//重写父类方法public void print() {System.out.println("宠物的自白:\n我的名字叫" +this.getName() + ",我的性别是" + this.getSex()+",我的健康值是" + this.getHealth()+ ",我和主人的亲密程度是" + this.getLove() + "。");}}

  

package com.extend;
//测试类
public class Test {public static void main(String[] args) {// 1、创建宠物对象pet并输出信息Pet pet = new Pet("贝贝",99,60);//Pet pet1 = new Pet("贝贝",99,60);//Pet pet2 = new Pet("贝贝",99,59);//System.out.println("equals()比较对象:"+pet1.equals(pet2));pet.print();// 2、创建狗狗对象dog并输出信息Dog dog = new Dog("贝贝",59,40,"牧羊犬");
//      dog.setName("多多");
//      dog.setHealth(90);
//      dog.setLove(80);
//      dog.setStrain("吉娃娃");dog.print();// 3、创建企鹅对象pgn并输出信息Penguin pgn = new Penguin("幽幽",85,20,"Q妹");
//      pgn.setName("大黑");
//      pgn.setHealth(98);
//      pgn.setLove(99);
//      pgn.setSex("Q妹");pgn.print();/**************************/
//      Bus bus = new Bus(20);
//      bus.print();//System.out.println(pgn.equals(dog));}
}

  4.子类访问父类成员  
  

  在数据隐藏和方法覆盖后,子类成员覆盖了父类的同名成员,要访问父类的这些成员,需用super关键字来引用当前类的父类。super的用法有3种情况:

  4.1  super.变量名:访问父类中被隐藏的成员变量。

4.2  super.方法名([参数表]):调用父类中被重写的方法。

4.3  super([参数表]):调用父类的构造方法,此时,可用super来表示父类的构造方法。

例子可以参考上面继承的代码

5.继承条件下的构造方法
  

package com.extend;
//测试类
class Car{private int siteNo = 4;//载客量public Car(){System.out.println("载客量是:"+siteNo+"人");}public void setSiteNo(int siteNo){this.siteNo = siteNo;}public void print(){System.out.println("载客量是:"+siteNo+"人");}
}
class Bus extends Car{public Bus(int siteNo){setSiteNo(siteNo);}
}
public class Test {public static void main(String[] args) {Bus bus = new Bus(20);bus.print();     }
}    

  5、重写  

  ◆重写是指在继承过程中,子类中的成员(包括数据和方法)与其父类中的成员同名,但功能不同,此时,子类的成员“覆盖”从父类继承过来的成员。包括两种情况:

  一是数据覆盖,称为数据隐藏,即父、子类中数据成员的名称相同,类型不同,它们实际上是完全不同的两个数据;

  二是方法覆盖,称为方法重写,即父、子类中方法的名称相同,参数表也完全相同,但功能不同。

   

   ◆方法重写和方法重载的区别
   

  6.Object类的equals()方法    

   

转载于:https://www.cnblogs.com/yutianbao/p/10502075.html

Java面向对象 第3节 类的封装和继承相关推荐

  1. java面向对象编程的三大基本特性--封装,继承,多态

    文章目录 封装 private 继承 extends 多态 abstract/interface/implements 封装 private 封装是面向对象编程的基本特点之一,也是它最核心的思想 类的 ...

  2. JAVA面向对象三大特征详解:(封装,继承,多态)

    面向对象语言: 大家经常会听到说JAVA这门语言是面向对象的,但面向对象又是什么呢? 提到面向对象就要引入一个叫做面向过程的概念: 举个例子:把大象装进冰箱,需要几步. 面向过程的做法: 人走到冰箱前 ...

  3. 武汉理工大学桂林老师java_武汉理工大学-Java面向对象与多线程综合实验-(1)封装、继承与多态...

    实验目标 实现一个档案管理系统的用户管理模块的初步模型.功能包括:密码机制的登录界面:普通用户对自身信息的查询.修改:管理员用户对其他用户信息的增添.删除.修改. 模块解析 用户分为:Administ ...

  4. 【Java修行之路】--面向对象的三大基本特征:封装、继承、多态

    文章目录 Java面向对象的三大基本特征(封装.继承.多态) 1.Java访问权限修饰符 2.封装 2.1封装问题引例 2.2封装问题实例 2.3私有属性的Setter和Getter方法 2.4方法的 ...

  5. 【JAVA SE】第六章 面向对象、对象和类以及封装

    第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...

  6. Java面向对象编程篇1——类与对象

    Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...

  7. java面向对象的特征封装_Java总结-Java面向对象的基本特征之一:封装性

    作者:nyist-tc-岑国玉 来源:牛客网 Java面向对象的基本特征之一:封装性 封装性: 1.封装性的目的:保护某些属性和方法不被外部所看见. //这里说一下自己学linux时老师教我这个封装类 ...

  8. 多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态

    @Python大星 一.Python 类的封装.继承和多态 封装 继承 Python 支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Pytho ...

  9. java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]

    java练习(数组工具类的封装)[目前写过最长的代码,虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组 ...

最新文章

  1. mysql 存储过程 递增_mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)...
  2. 循环神经网络实现文本情感分类之使用LSTM完成文本情感分类
  3. Nova计算节点安装配置
  4. 有哪些小游戏的java代码_求一个Java小游戏代码(鼠标点击类小游戏)最好代码里面不要有中文...
  5. java 两个数组交叉_java – 如何交叉两个没有重复的排序整数数组?
  6. Java工作笔记-webService发布时通用的4个注解
  7. python中bs4库_python系统学习2——beautiful soup库(bs4库)学习
  8. 【MySQL】MySQL 8 新特性
  9. Flutter实战一Flutter聊天应用(四)
  10. Fiddler抓包工具入门:软件测试员必知的抓取https协议的方法
  11. Linux系统下zookeeper的安装和配置
  12. 苹果id是什么格式的_长春苹果x主板维修推荐,苹果ipad12.9死机,商业资讯
  13. 2020年日历_2020年日历全年表
  14. 科学计算与仿真-高斯牛顿法的非线性最小二乘问题简单介绍与应用
  15. 从零开始之驱动发开、linux驱动(二十、linux设备驱动中的并发控制)
  16. Design Compiler工具学习笔记(5)
  17. 漫画:卖鱼与买鱼之生产与消费
  18. Java资深开发:这不得40k起步呀
  19. 村上春树(作品)年谱
  20. Cmake传入项目版本号

热门文章

  1. testng入门_单元测试
  2. 谈谈Visual Studio的缺点,比较Eclipse
  3. zset中的score_每天五分钟,成就redis大神之Zset数据类型
  4. centos 安装java web_Centos上安装java web的环境
  5. centos重启网络失败Job for network.service failed,ping不通网络
  6. 自建html网页,幽灵自建的html5 的模板文件!
  7. c efcore.mysql_EF Core在mysql中调用存储过程
  8. 9.如何使用QT绘制导航箭头的图标
  9. C++知识点杂记1——typedef、static_cast、const_cast、遍历二维数组、聚合类
  10. matlab绘制多条折线图