Java,面向对象,三大特性:封装、继承和多态,代码案例

Java
205
0
0
2023-09-17

面向对象

面向对象

OO(Object Oriented),20世纪80年代后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。

Java 是面向对象的编程语言,对象就是面向对象程序设计的核心,所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。

面向对象对象的特点:1、对象具有属性和行为;2、对象具有变化的状态;3、对象具有唯一性;4、对象都是某个类别的实例;5、一切皆为对象,真实世界中的所有事物都可以视为对象。

面向对象开发有利于开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。

面向对象开发的优点

1、可重用性:代码重复使用,减少代码量,提高开发效率。下面介绍的面向对象的三大核心特性(继承、封装和多态)都围绕这个核心。

2、可扩展性:指新的功能可以很容易地加入到系统中来,便于软件的修改。

3、可管理性:能够将功能与数据结合,方便管理。

面向对象的特性

1、继承性

程序中的继承性是指子类拥有父类的全部特征和行为,这是类之间的一种关系,Java只支持单继承。

2、封装性

封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用,封装的目的在于保护信息。

主要优点:

·保护类中的信息,它可以阻止在外部定义的代码随意访问内部代码和数据;

·隐藏细节信息,一些不需要程序员修改和使用的信息,如:取款机中的键盘,用户只需要知道按哪个键实现什么操作就可以,至于它内部是如何运行的,用户不需要知道。

·有助于建立各个系统之间的 松耦合 关系,提高系统的独立性,当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。如:U盘,不管里面的存储方式怎么改变,只要U盘上的USB接口不变,就不会影响用户的正常操作。

·提高软件的复用率,降低成本,每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个U盘可以在多台电脑上使用。

3、多态性

面向对象的多态性,即:一个接口,多个方法。

多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。

多态性允许一个接口被多个同类使用,弥补了单继承的不足,多态概念可以用树形关系来表示。

面向对象的案例代码

封装,案例代码

 public class Student {

    private String studentNo;
    private String studentName;
    private String studentSex;
    private int studentAge;
    //方案三,将学科对象作为属性
    private Subject subject;

    public Subject getSubject() {
        if (subject == null)
            subject = new Subject();
        return subject;
    }

    public void setSubject(Subject subject) {
        this.subject = subject;
    }

    //无参构造
    public Student() {

    }

    //多参构造,实现对全部属性的赋值
    public Student(String studentNo, String studnetName, String studentSex, int studentAge) {
        this.setStudentNo(studentNo);
        this.setStudentName(studnetName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
    }

    //将Subject对象初始化的构造函数
    public Student(String studentNo, String studnetName, String studentSex, int studentAge, Subject subject) {
        this.setStudentNo(studentNo);
        this.setStudentName(studnetName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
        this.setSubject(subject);
    }

    public String getStudentNo() {
        return studentNo;
    }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentSex() {
        return studentSex;
    }

    public void setStudentSex(String studentSex) {
        if (studentSex == "男" || studentSex == "女")
            this.studentSex = studentSex;
        else
            return;
    }

    public int getStudentAge() {
        return studentAge;
    }

    public void setStudentAge(int studentAge) {
        if (studentAge <= || studentAge > 100)
            studentAge =;
        this.studentAge = studentAge;
    }

    /**
     * 介绍学生详细信息的方法(新增方法参数)
     *
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */    public String studentInfo(String subjectName, int subjectTime) {
        String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
                this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
                this.getStudentSex() + "\n所学专业名称:" + subjectName + "\n学制年限:" + subjectTime;
        return ref;
    }

    /**
     * 学生详细信息介绍的方法重载(将对象作为方法参数)
     *
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */    public String studentInfo(Subject subject) {
        String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
                this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
                this.getStudentSex() + "\n所学专业名称:" + subject.getSubjectName() + "\n学制年限:" + subject.getSubjectTime();
        return ref;
    }

    /**
     * 返回学生相信信息介绍方法(将对象作为类的属性)
     *
     * @return 返回学生姓名、学号、年龄、性别、专业名称、学制年限等信息
     */    public String studentInfo() {
        String ref = "学生详细信息:\n学生姓名:" + this.getStudentName() + "\n学生学号:" +
                this.getStudentNo() + "\n学生年龄:" + this.getStudentAge() + "\n学生性别:" +
                this.getStudentSex() + "\n所学专业名称:" + this.getSubject().getSubjectName() + "\n学制年限:"
                + this.getSubject().getSubjectTime();
        return ref;
    }

} 
 public class Subject {

    /*
     * 封装的步骤一:将属性设置为私有,禁止类外部进行访问
     */    private String subjectName; //专业名称
    private String subjectNum; //专业编号
    private int subjectTime; //专业学时
    private Student[] studentArray; //用来存储选修某专业的学生对象
    private int studentCount; //记录选修某专业的人数

    public Student[] getStudentArray() {
        if (studentArray == null)
            this.studentArray = new Student[];
        return studentArray;
    }

    public void setStudentArray(Student[] studentArray) {
        this.studentArray = studentArray;
    }

    //无参构造方法
    public Subject() {

    }

    //有参构造方法
    public Subject(String subjectName, String subjectNum, int subjectTime) {
        this.setSubjectName(subjectName);
        this.setSubjectNum(subjectNum);
        this.setSubjectTime(subjectTime);
    }

    //有参构造
    public Subject(String subjectName, String subjectNum, int subjectTime, Student[] studentArray) {
        this.setSubjectName(subjectName);
        this.setSubjectNum(subjectNum);
        this.setSubjectTime(subjectTime);
        this.setStudentArray(studentArray);
    }

    public int getStudentCount() {
        return studentCount;
    }

    public void setStudentCount(int studentCount) {
        this.studentCount = studentCount;
    }

    /*
     * 封装类的步骤二:设置类外部访问属性的接口
     * 封装类 的步骤三:通过getter/setter方法添加控制语句
     */    //预留访问类的接口
    public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
    }

    public String getSubjectName() {
        return this.subjectName;
    }

    public void setSubjectNum(String SubjectNum) {
        this.subjectNum = SubjectNum;
    }

    public String getSubjectNum() {
        return this.subjectNum;
    }

    public void setSubjectTime(int subjectTime) {
        if (subjectTime <=)
            return;
        this.subjectTime = subjectTime;
    }

    public int getSubjectTime() {
        return this.subjectTime;
    }

    //在类中编写一个输出详细信息的方法
    public String printDetail() {
        String ref = "专业详细信息为:\n专业名称:" + this.getSubjectName() + "\n专业编号:"
                + this.getSubjectNum() + "\n学时:" + this.getSubjectTime();
        return ref;
    }

    /**
     * 添加学员到数组中并记录数组中成员个数
     *
     * @param student 传递进入方法的学生对象
     */    public void addStudent(Student student) {
        for (int i =; i < this.getStudentArray().length; i++) {
            if (this.getStudentArray()[i] == null) {
                this.getStudentArray()[i] = student;
                this.studentCount = i +;
                return;
            }
        }
    }
} 
 public class CharDemo {

    public static void main(String[] args) {
        Subject subject = new Subject("计算机科学与应用", "j", 4);
        System.out.println(subject.printDetail());
        System.out.println("-------------在方法中通过新增参数实现扩展-------------");
        Student student = new Student("s", "张三", "男", 18);
        System.out.println(student.studentInfo("计算机科学与应用",));
        System.out.println("------------将对象作为方法参数--------------");
        Student student = new Student("s02", "李四", "女", 28);
        System.out.println(student.studentInfo(subject));
        System.out.println("-------------将对象作为类的属性-------------");
        Student student = new Student("s03", "王五", "女", 17, subject);
        System.out.println(student.studentInfo());
        System.out.println("-------------想知道一个专业到底有多少个学生选修-------------");
        subject.addStudent(student);
        subject.addStudent(student);
        subject.addStudent(student);
        System.out.println("选修" + subject.getSubjectName() + "专业的学生有" + subject.getStudentCount() + "名");
    }
} 

多态 ,案例代码

 public class Animal {

    // 姓名
    private String name;

    // 空参构造
    public Animal() {

    }

    // 全参构造
    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    // 成员方法
    public void eat() {
        System.out.println("吃饭");
    }

} 
 // 是Animal类的子类
public class Dog extends Animal {

    // 需求:因为狗吃骨头,所以要优化父类的eat()方法
    @ Override 
    public void eat() {
        System.out.println(getName() + "吃骨头");
    }

} 
 public class Demo {

    public static void main(String[] args) {
        /*
            Java中实现多态的三个步骤:、要有继承(或者实现)关系
        、要有方法重写
        、要有父类引用指向子类对象
         */        // 多态
        Animal animal = new Dog();
        // 测试成员方法的调用
        // 结论:多态中调用成员方法时编译看左(左边的类型有没有这个成员),
        // 运行看右(运行时具体用的是右边类中的该成员)
        animal.setName("哈士奇");
        animal.eat();
    }

}