java 学习笔记——类之间的关系之封装、继承与多态的详解

时间:2022-09-12 14:35:08

封装

一个封装的简单例子

封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联系。
封装的原则:使对象以外的部分不能随意存取对象的内部数据,从而有效的避免了外部错误对它的“交叉感染”。数据隐藏特性提升了系统安全性,使软件错误能够局部化,减少查错和排错的难度。如:微波炉,将线路板(属性)封装在微波炉内部,使用者无法接触到,而通过面板按钮(方法)简单的操控线路板工作。

设计一个CBox类,具有length、width和height三个属性,对每个属性都提供相应的get和set方法,提供构造函数,完成CBox信息的初始化,增加volume()方法,用来计算CBox对象的体积,定义surfaceArea()方法用来计算CBox的表面积。
面向对象的三个特征:


package ch01;

public class test
{
    private int height;
    private int length;
    private int width;

    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }

    public test(int height, int length, int width)
    {
        this.height = height;
        this.length = length;
        this.width = width;
    }

    public int volume()
    {
        return length * width * height;

    }
    public int Area()
    {
        return 2* (length*width+length*height+width*height);

    }
    public static void main(String[] args) {
        test cb = new test(10,20,30);
        int x = cb.volume();
        int y = cb.Area();
        System.out.println(x);
        System.out.println(y);
    }

}

对于代码中快速生成的getsetpublic test(int height, int length, int width)这样的初始化,在eclipse 中都会有快捷的方法,可以在任意一个光标闪烁出单机右键,找到source然后就有了,不要问是什么0·0,因为单词太长了,不想写......

继承

继承是软件重用的一种形式,它通过重用现有类的属性和方法,并增加新功能或修改现有功能来构建新的类。如:“人”这个类抽象了这个群体的一般特性,“学生”和“老师”都具备“人”所定义的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情况下,作为一个新类而存在。

  • 表现的是一种共性和特性的关系,一个类可以继承另一个类,并在此基础上添加自己特有功能,这称为继承。在java中使用extends关键字表现继承关系。

格式:

[访问符][修饰符] class <子类名> extends <父类名>{
  [属性]  //成员变量
  [方法]  //成员
}
public tiger extends animal{
}

下面通过一个简单的例子进行说明

教师和学生类的属性列表

教师类(Teacher) 学生类(Student)
姓名 name 姓名
年龄 age 年龄
性别 gender 性别
工资 salary 成绩
所属院系 department 年级

从上图分析可以看出,教师类和学生类在姓名、年龄、性别上存在共同性,而教师类有两个属性工资和所属院系区别学生类的成绩和年级。

程序实现

父类person

package com.wfu.ch04;

public class Person {
    private String name;//进行封装处理
    private int age;
    private String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        System.out.println("父类Person的带参数的构造方法");
    }
    public Person(){
        System.out.println("父类Person的不带参数的构造方法");
    }
    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 String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void output(){
        System.out.println("姓名:" +name);
        System.out.println("性别:" +gender);
        System.out.println("年龄:" +age);
    }

}

子类Student

package com.wfu.ch04;

public class Student extends Person {
    private double score;
    private String grade;

    public Student(double score, String grade) {
        this.score = score;
        this.grade = grade;
        System.out.println("子类Student的带参数的构造方法");
    }

    public Student(String name, int age, String gender, double score,
            String grade) {
        super(name, age, gender);
        this.score = score;
        this.grade = grade;
        System.out.println("子类Student的带参数的构造方法,显式调用父类的带参数的构造方法");
    }

    public Student(){
        System.out.println("子类Student的不带参数的构造方法");
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public String getGrade() {
        return grade;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }
    public void output(){
        super.output();
        System.out.println("成绩:" +score);
        System.out.println("年级:" +grade);
    }
}

子类Teacher

package com.wfu.ch04;

public class Teacher extends Person{
    private double salary;
    private String department;

    public Teacher(double salary,String department) {
        this.salary = salary;
        this.department = department;
        System.out.println("子类Teacher的带参数的构造方法");
    }
    public Teacher(){
        System.out.println("子类Teacher的不带参数的构造方法");
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public void output(){
        System.out.println("工资:" +salary);
        System.out.println("所属院系:" +department);
    }

}

测试类TestClass

package com.wfu.ch04;

public class TestClass {
    public static void main(String[] args) {
//      Person p=new Person();
//      p.output();
//      Teacher t=new Teacher();
//      t.output();
        Student s=new Student("tom",20,"male",89,"2016");
        s.output();

    }

}

继承的特性

  • (1)Java是单继承的,即一个子类只能继承一个父类,被继承的类叫做父类(超类),继承的类叫做子类(派生类)。
  • (2)在继承过程中,子类拥有父类定义的所有属性和方法,但父类可以通过封装思想隐藏某些数据,然后提供子类可以访问的属性和方法。
//在父类Person中
private String name;//进行封装处理
private int age;
private String gender;
  • (3)当生成子类对象时,Java默认首先调用父类不带参数的构造方法,然后执行该构造方法,生成父类的对象,再去调用子类的构造方法,生成子类的对象。要想生成子类的对象,首先生成父类的对象,没有父类对象就没有子类对象。
//例如在测试类中如果只写
Teacher t=new Teacher();
t.output();//运行结果是先把父类中不带参数的类执行,然后再执行 t.output() 方法
  • (4)如果一个类没有指明任何父类,则缺省的自动继承java.lang.Object类。Object类是所有类的*父类,在java中,所有类都是直接或间接的继承了Object类。
  • super关键字:super关键字代表父类对象,主要有两个用途:
    1)调用父类的构造方法
    super表示对父类对象的引用。如果子类使用super()显示调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不再去寻找父类的不带参数的构造方法。super必须作为构造方法的第一条语句,前面不能有其他的可执行语句。
    2)访问父类的属性和方法
    当子类的属性或方法与父类的属性或方法重名时,可用super.属性名或super.方法名(参数列表)的方式访问父类的属性或方法。
//在测试类中
Student s=new Student("tom",20,"male",89,"2016");
s.output();
//这段代码智能输出“成绩”和“年级”,因为会先调用父类的默认的不带参数的方法,而这时父类的不带参数的构造方法是什么都没有的,我们原本的意思是吧“姓名”、“年龄”、“性别”、这三个也输出。这时就要用到super
应该写成:
super.output();
Student s=new Student("tom",20,"male",89,"2016");
s.output();

多态

多态:多态是指在父类中定义的属性或方法被子类继承之后,可以具有不同的表现行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。如:动物会“叫”,“猫”和“鸟”都是动物的子类,但其“叫”声是不同的

重写

当子类继承父类时,可以在子类中直接使用父类的属性和方法。如果父类的方法无法满足子类的需求,则可以在子类中对父类的方法进行改造,这称为方法的重写,重写是java多态性的一种体现。

  • (1)、方法重写:又叫做覆写,子类与父类的方法返回值类型一样,方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。若给子类的run方法添加一个参数,则不叫重写。分别调用带参数的run和不带参数的run来执行一下。
public class Test2 {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.run();
    }
}
class Animal{
    public void run(){
        System.out.println("Animal is running!");
    }
}
class Dog extends Animal{
    public void run(){
        System.out.println("Dog is running!");
    }
}
  • (2)、方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。
  • (3)、方法重写需要遵循以下几点:
    重写的方法的签名必须要和被重写的方法的签名完全匹配;
    重写的方法的返回值必须和被重写的方法的返回一致或者是其子类;
    重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
    私有方法不能被重写子类重写父类方法的过程中,可访问性只能一样或变的更公开。
  • 我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思是:父类型的引用可以指向子类的对象。
    (1)多态:父类型的引用可以指向子类型的对象。
public class Test3 {
    public static void main(String[] args) {
        Flower flower=new Rose();//多态
        flower.sing();
    }
}
class Flower{
    public void sing(){
        System.out.println("Flower is sing.");
    }
}
class Rose extends Flower{

}

花是花,玫瑰是玫瑰,玫瑰是花,但花是玫瑰是错误的,花是玫瑰,那么康乃馨呢是花吗?对不对呀。
(2)、Flower flower=new Rose();当使用多态方式调用方法时,首先检查父类中是否有Sing方法,如果有,则去调用子类的sing方法(不管是继承的还是重写的)。如果没有则编译错误。因为flower是一个Flower类型的变量,如果Flower类型没有这个sing方法,则无法调用。

java 学习笔记——类之间的关系之封装、继承与多态的详解的更多相关文章

  1. Java 中类与类之间的关系

    在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...

  2. Java基础 【类之间的关系】

    在Java与其他面向对象设计语言中,类之间常见的关系有6种 分别是:  依赖.关联.聚合.组合.继承.实现,他们的耦合度依次增强. 其中,关联.聚合.组合关系仅仅是在语义上有所区别,所谓语义就是指上下 ...

  3. Java学习笔记--类和对象

    1.介绍面向对象的编程          面向对象是现在主流的编程样例,它替代了以前C语言使用时的“结构体”,Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每 ...

  4. UML学习笔记之类之间的关系

    1.    导航关系(Directed Association) A类有一个成员变量保存B的引用. 2.包含关系(Aggregation.Composition) (1)弱包含 含义:每个部门包含多个 ...

  5. linux初级学习笔记七:linux用户管理,密码和组命令详解!&lpar;视频序号:04&lowbar;1&rpar;

    本节学习的命令: 用户管理命令:useradd,userdel,id,finger,usermod,chsh,chfn,passwd,pwck, 组管理命令:groupadd,groupmod,gro ...

  6. web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解

    1.方法 getElementsByName() 获取name 可以获取一个数组类型数据(参数加引号) getElementsByTagName() 获取元素   getAttribute() 获取元 ...

  7. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以*修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  8. Java学习笔记(面向对象上)

    面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...

  9. python基础学习笔记——类空间问题以及类之间的关系

    一. 类的空间问题 1.1 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self ...

随机推荐

  1. java json数据的处理

    // 返回documentBuilderFactory对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ...

  2. &colon;before和 &colon;after

    :before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...

  3. 仿造slither&period;io第一步:先画条蛇

    前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...

  4. iOS 使用XCode6打开项目以后再用XCode5出现的问题fatal error&colon; malformed or corrupted AST file&colon; &&num;39&semi;Unable to load module

    使用不同版本的XCode出现的问题: fatal error: malformed or corrupted AST file: 'Unable to load module "/Users ...

  5. 如何在Windows 下安装Python

    1.  安装源程序的选择 官网:https://www.python.org/downloads/ 选择版本下载,根据实际计算机位数(64位),下载的为: Python-2.7.10.amd64.ms ...

  6. Andoir 判断软键盘是否弹出

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  7. 【转】关于android的输入法弹出来 覆盖输入框的有关问题

    今天发现一个问题,在录入信息页面.信息不多,但是输入法弹起后,内容已经超出页面,无滚动条,很不方便. 解决办法:在配置文件中,页面对应的Activity中添加 <activity android ...

  8. vim命令---存阅

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  9. c&sol;c&plus;&plus; 网络编程 UDP 改变网卡的硬件地址

    网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...

  10. Java程序入口:main&lpar;&rpar;方法讲解

    Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中, ♦ public修饰符:Java类由JVM调用,为 ...