前言

  本次博客衔接上次博客,作为这一阶段Java学习的分析。上一篇博客着重介绍了Java的OO编程思维,面向对象与面向过程的区别。本篇博客重心在Java的三大技术特性,附带作业分析。

Java三大特性

  封装

在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

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

  实现封装的方式:使用访问控制符

  1.   private   在当前类中可访问
  2.   default      在当前包内和访问
  3.   protected    在当前类和它派生的类中可访问
  4.   public          公众的访问权限,谁都能访问

  还有伴随着出现的还有getter和setter方法。(因知识面的原因,相关的package和import先不讲解)

我们最常用的就是private,在继承中,我们继承的也是父类的非private的属性和方法。封装遵循了“封闭原则”,禁止外部直接访问内部信息。

  封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

    封装的优点:

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

  2. 类内部的结构可以自由修改。

  3. 可以对成员变量进行更精确的控制。

  4. 隐藏信息,实现细节。

  继承

继承是类之间的一种关系,子类拥有父类非private的所有属性和方法,从而实现了代码的复用。继承是面向对象编程技术的基石,它允许了创建分等级层次的类。

我们为什么要用继承?

    举个例子:

我们拥有多个卡片,现在需要输出每个卡片的形状,那么没有继承之前我们可能是每一个卡片类之中书写System.out.println(“这张卡片的形状是XXX”);然而我们可以继承一个Shape类,Shape类中写show(){ System.out.println(“这张卡片的形状是”+name);}这样代码的臃肿性就减少了,而且后期维护性较高。

    代码示例[1]

开发动物类其中动物分别为企鹅以及老鼠,要求如下:

  企鹅:属性(姓名,id),方法(吃,睡,自我介绍)

  老鼠:属性(姓名,id),方法(吃,睡,自我介绍)

 企鹅类
1 public class Penguin {
private String name;
private int id;
public Penguin(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 + ".");
}
}
 老鼠类
1 public class Mouse {
private String name;
private int id;
public Mouse(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 + ".");
}
}

  两行代码对比可以看出代码重复已经出现,使得代码臃肿且后期维护性较低,使用继承就能从根本上解决问题。提取二者的重复部分建立一个公共父类

 公共父类
1 public class Animal {
private String name;
private int id;
public Animal(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 + ".");
}
}
企鹅类
1 public class Penguin extends Animal {
public Penguin(String myName, int myid) {
super(myName, myid);
}
}
老鼠类
1 public class Mouse extends Animal {
public Mouse(String myName, int myid) {
super(myName, myid);
}
}

  公共父类Animal拥有企鹅和老鼠类的相同属性和方法,当企鹅和老鼠类继承公共父类之后,子类也就不会再出现重复代码,且代码的臃肿性降低,可维护性升高。

  我们也可以重写重写父类的方法,及命名与父类同名的成员变量,增加代码的灵活度。我们重写的内容会覆盖掉父类的内容,如果同时需要父类和子类的内容,我们可以使用super 与 this 关键字。而final关键字声明类意义着不能继承,即最终类;或用于修饰方法,不能被重写。

  super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

  this关键字:指向自己的引用。

    super和this代码示例[2]

 class Animal {
void eat() {
System.out.println("animal : eat");
}
} class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
} public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}

  输出结果为:

  animal : eat
  dog : eat
  animal : eat

  如果我们想尽可能的隐藏代码,但是仍然允许子类的成员来访问它们。这时候可以使用protected。(关于继承权限的问题可能会在后续的学习中再进行补充) 

  关于继承(extends)和实现(implement)的区别

    extends

  1、类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

  2、在继承中可以定义属性方法,变量,常量等...

    Implement

  1、Implement可以有多个接口,(接口跟接口之间采用逗号分隔)。

  2、在接口中只能定义全局常量(static final),和空的方法体。

  3、 某个接口被类实现时,在类中一定要实现接口中的抽象方法。

    继承类型[3]

  多态

  概念:多态是同一个行为具有多个不同表现形式或形态的能力。

  Java实现多态的三个必要条件:继承、重写、向上转型

  1、继承:在多态中必须存在有继承关系的子类和父类。

  2、重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

  3、向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

  使用多态的好处之一是当调用方法时,先检查父类中是否拥有该方法,如果没有则编译错误,如果有,再调用子类的同名方法。使类的对象可以进行通用化处理,同时增加了程序的延展性。

    实现多态的方式

  1、基于继承实现的多态:

  基于继承实现的多态主要是重写,子类的重写。多个子类的同一方法的重写可以表现出不同的行为。

  2、基于接口实现的多态:

  基于接口实现的多态主要是实现接口并覆盖接口中同一方法的几不同的类体现的。

   继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

  作业方面

  这几次作业知识迭代正变得更加符合Java的三大技术特性,不管是封装性还是继承性、多态性,这几次作业所给的UML类图也都能感觉到这些特性。

  关于这几次作业的问题,除了正则表达是以外就是关于ArrayList自定义类的的使用有所不理解。

  例如ArrayList<Integer>list中能很简单的理解Integer的意义并简单的使用,但是遇到了自定义的ArrayList<Card> cardList限定范围在自定义的<Card>类的范围以内,就不知道如何是好,其实理解并使用是一件比较简单事情,像integer类型的list.add(整型),整型是是整数类型的数字,而像Card类型的list.add(卡片),卡片是放入的卡片类的对象。

  

     double radius = Main.input.nextDouble();
Shape circle = new Circle(radius);3 Card card = new Card(circle);
4 cardList.add(card);
//简单的代码示例不做过多解释,理解使用

  网络上还有更加详细的Arraylist自定义类的教程,比我浅薄的表达要好的多,可以筛选并学习,当学会了Arraylist自己定义类,我感觉这两次的作业的难点也算是攻克了。

  关于时间

  这几次的作业花费时间最多的是水文测试的题目,因为涉及正则表达式,对于一个粗心的人来说,学习并使用正则表达式简直就是噩梦。花费时间最短的就是最近的一次作业,原因也就是没有新的知识的扩展,写起代码来也算是比较畅通。

  关于测试

  良好的测试并获取代码的信息式写好代码的必要条件,随着代码长度及代码难度的增加测试的重要性也慢慢的体现了出来,现在没有学会使用Debug的同学要开始加强学习了。

  关于收获

  这一阶段的收获一个是正则表达式的使用,另一个就是Java三大技术特性封装、继承、多态的理解和使用。

  关于课程建议

  作业体量、难度方面没有什么建议,关于作业的建议就是更加详细点对作业中新出现的知识点进行讲解扩充,也可以给予相关的教程方便后续的复习。

参考文献

[1][2][3]菜鸟教程https://www.runoob.com/java/java-inheritance.html

浅析Java三大特性封装、继承、多态,及作业分析的更多相关文章

  1. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  2. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

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

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

  4. Java 三大特性——封装、继承、多态

    一.封装 封装,实际就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用. 概念:在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节 ...

  5. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  6. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. java 三大特性_继承、封装、多态_day005

    一.继承: java的三大特性之一.两个类之间通过extends关键字来描述父子关系,子类便可拥有父类的公共方法和公共属性.子类可以继承父类的方法和属性,子类也可以自己定义没有的方法或者通过覆盖父类的 ...

  9. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

随机推荐

  1. 1050 String Subtraction (20分)

    Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the remaining string after taking ...

  2. Html 慕课园编程练习10-1

    23:10:25 2019-08-14 自己写的这个好丑.... 题目:利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: (另外 这个动图是怎么插入的 用url就行 复制就 ...

  3. ensp,acl访问控制列表

    ACL分类: 基本ACL 编号范围: 2000-2999     参数:源ip地址 高级ACL 编号范围: 3000-3999     参数:源ip地址,目的ip地址,源端口,目的端口等 二层ACL ...

  4. 提示要安装Python-OpenSSL

    PyOpenSSL是OpenSSL的python接口,用于提供加密传输支持(SSL),如果没用该模组,会导致goagent无法生成证书而影响使用. 若系统没有openssl,先安装openssl,** ...

  5. PHP程序员的能力水平层次(一)

    前言 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开发 这个水平的程序员一 ...

  6. "格式化的文本"组件:<span> —— 快应用原生组件

     `<template> <div class="container"> <text><span class="success ...

  7. 逻辑对象中时间类型 保存时 隐藏bug

    开发功能中的一些逻辑对象中的一些时间 属性,在保存数据库时有一个隐藏的bug,假如 我vo属性定义的就是date 类型,那我定时保存数据库时可能就会出错,eq:假如这个属性隔天要重置一些东西,表中这个 ...

  8. Property [*****] not found on type [com.erp.pojo.ErpSupplier]

    我实体类里用的是 springboot 里@Slf4j   @Data  注解式写的  这样可以减少代码量 ,但是遇到一个问题影响我好长时间 出现了这个错误  Property [*****] not ...

  9. Git应用详解第十讲:Git子库:submodule与subtree.md

    前言 前情提要:Git应用详解第九讲:Git cherry-pick与Git rebase 一个中大型项目往往会依赖几个模块,git提供了子库的概念.可以将这些子模块存放在不同的仓库中,通过submo ...

  10. Python-元组tuple、列表list、字典dict

    1.元组tuple(1)元组是有序列表,有不可见的下标,下标从0开始(2)元组的数据是相对固定的,数据不能增删改,他的一个重要用途是保存固定的.安全要求高的数据(3)元组用小括号()括起来,空元组定义 ...