栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java的封装、继承与多态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的封装、继承与多态

面向对象的编程语言具有三大特性,分别是封装、继承与多态度。三大特性是面向对象编程的核心,对于我们这些初学者来说,务必要加强对这三大特性的理解与领会。在这篇文章中,我将会逐一介绍以下这三大特性。

封装 封装的定义:

把事物抽象成一个类,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系。当内部的逻辑发生变化的时候,外部调用不用因此而修改,它们只调用开发的接口,而不用去关心内部的实现。

封装的好处:

1.实现了专业的分工,将处理逻辑封装成一个方法,做到见名知义;
2.良好的封装可以减少耦合;
3.隐藏信息,实现细节;
下面的案例可以对封装进行阐述:
package com.pak1;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.name = “小明”;
student.age = 16;
student.printStudentAge();

    Student student2 = new Student();
    student2.name = "小白";
    student2.age = 120;
    student2.printStudentAge();

}

}
class Student {
String name;
int age;

public void printStudentAge() {
    System.out.println(name + "同学的年龄:" + age);
}

}

输出的结果为:
小明同学的年龄:16
小白同学的年龄:120

这个时候我们可以看到输出的小白同学的年龄120明显不科学,所以我们需要做一些内部逻辑的处理。所以需要进行代码封装,将内部逻辑进行一个隐藏。
封装之后的代码如下:
package com.pak1;

public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName(“小明”);
student.setAge(16);
student.printStudentAge();

    Student student2 = new Student();
    student.setName("小白");
    student.setAge(120);
    student2.printStudentAge();

}

}

class Student {
private String name;
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    if (age < 0 || age > 60)
        throw new RuntimeException("年龄设置不合法");
    this.age = age;
}

public void printStudentAge() {
    System.out.println(name + "同学的年龄:" + age);
}

}

在这里将Student这个类的name和age私有化,提供了公共的get/set方法才能进行访问,在get/set方法中我们可以对内部逻辑进行封装处理,外部的调用方不必关心我们的处理逻辑。

继承 继承的概念:

继承是面向对象的最显著的一个特征。继承是从已有的类(父类或者超类)中派生出新的类(子类),新的类能吸收已有类的数据属性和行为,并能扩展新的能力(方法的覆盖/重写)。Java不支持多继承,一个类只能有一个父类。父类是子类的一般化,子类是父类的特殊化(具体化)。

子类的特点

子类拥有父类非private的属性和方法
子类可以添加自己的方法和属性,即对父类进行扩展
子类可以重新定义父类的方法,即方法的覆盖/重写

构造函数

构造函数不能被继承,子类可以通过super()显示调用父类的构造函数
创建子类时,编译器会自动调用父类的无参构造函数
如果父类没有定义无参构造函数,子类必须在构造函数的第一行代码使用super()显示调用
由于后边要阐述多态,这里我们先来介绍一个重要的概念,即方法的覆盖/重写。

覆盖/重写的概念

当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆盖。
可以这么理解:重写就是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。如果子类将父类中的方法重写了,而我们想调用父类中的同名方法怎么办?此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。

多态

多态的本质是:一个程序中同名的不同方法。在面向对象的程序设计中,多态主要有以下三种方式来实现。

通过子类对父类方法的覆盖来实现多态
通过一个类中方法的重载来实现多态
通过将子类的对象作为父类的对象实现多态。
覆盖的概念我们在前面以及介绍了,接下来我们简单阐述下何为重载。

重载是指一个类里面(包括父类的方法)存在方法名相同,但是参数不一样的方法,参数不一样可以是不同的参数个数、类型或顺序
如果仅仅是修饰符、返回值、throw的异常 不同,那么这是2个相同的方法
我们重点阐述第三种实现方法,即通过将子类的对象作为父类的对象实现多态

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。(这句话是我理解第三种方法的关键,请仔细阅读理解)

继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。

对象的引用型变量是具有多态性的,因为一个引用型变量可以指向不同形式的对象,即:子类对象作为父类对象来使用。在这里涉及到了向上转型和向下转型。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458864.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号