Java面向对象通俗易懂详解[类与对象]

1,095 阅读6分钟

Java 面向对象

一、面向对象思想

1.百度百科的解释

百度百科对 “面向对象思想” 的解释:

面向对象程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切事物皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。

2.用图来理解“面向对象思想”

image.png

image.png

image.png

3.生活中常见的对象有哪些?

image.png

所以,面向对象思想是一种思维方式,并不是一个具体技术。

要将这样的思想落实到 Java 语言编程中,就涉及到几个技术点:对象、类、继承、接口、抽象、封装、多态。

二、类与对象

类 : 是一个模板,用来描述对象的行为、状态。

对象: 是类的一个实例。

例如:人是一个类,具体的人(如:张三、小兰)则是一个对象。

image.png

1.类举例—“人”

软件对象也有状态和行为,软件对象的状态就是属性,行为通过方法体现。

image.png

2.类—用 UML 描述“人类”的方法

image.png

3.用中文来写“人”程序

下面,慢慢将上面的“软件设计语言”搬迁到 Java 程序中,先来中文版的描述:

源代码:com.chapter01.testclass.人

package com.chapter01.testclass; 
/**
* 定义 "人" (以下用中文来描述) 
*/
public class 人 {
     //一些属性 
    private String 身份证号;
    private String 姓名;
    private char 性别 = '男';
    private short 年龄 = 0;
    private String 籍贯;

    /**
    * 吃饭 
    */
    public void 吃饭() { 
        if('男 '==性别) {
            System.out.println (this.姓名 +"是 "+this.性别 +"的,要 吃两碗以 上!");
        }else {
            System.out.println (this.姓名 +"是 "+this.性别 +"的,只 吃半 碗饭,减肥中 ..."); 
        }
    }
    
    /**
    * 睡觉
    * @param 睡觉时间
    * @param 起床时间 
    * @return 睡眠情况 
    */
    public String 睡觉(int 睡觉时间, int 起床时间) {
         int 睡眠时间 = 起床时间-睡觉时间;
        String 睡眠情况 = ""; 
        
        if(睡眠时间>8) {
            睡眠情况 = "睡够了,睡 了("+睡眠时间+")个小时"; 
        }else {
            睡眠情况 = "还没睡够,只睡 了 ("+睡眠时间+")个小时"; 
        }return 睡眠情况; 
    }
    
    //测试
    public static void main(String[] args) {
        人 第 1 个人 = new 人 ();
        //给"第一个人"这个实例填充属性值 第 1 个人
        .set 身份证号 ("50024543543567");
        第 1 个人.set 姓名 ("张三");
        第 1 个人.set 性别 ('男 ');
        第 1 个人.set 年龄 ((short) 19);
        第 1 个人.set 籍贯 ("广东广州市 ");
        //第 1 个人的吃饭行为 1 个人.吃饭 ();
        //第一 1 个人的睡觉行为
        String 睡觉结果 = 第 1 个人.睡觉 (9, 15);
        System.out.println (第 1 个人.get 姓名 ()+睡觉结果);
        System.out.println("============再造 一个人出来============");
        人 第 2 个人 = new 人 ();

        //给"第 1 个人"这个实例填充属性值 2 个人.set 身份证号 ("50024519891209245677"); 
        第 2 个人.set 姓名 ("小兰"); 
        第 2 个人.set 性别 ('女'); 
        第 2 个人.set 年龄 ((short) 25); 
        第 2 个人.set 籍贯 ("重庆江北区"); 
        //第 1 个人的吃饭行为 2 个人.吃饭 (); 
        //第一个人的睡觉行为 
        String 结果 = 第 2 个人.睡觉 (9, 18); 
        System.out.println (第 2 个人.get 姓名 ()+结果); 
    }
    
    //以下 get/set 方法通过 IDEA 生成,在开发中都是用工具一键生成。
    public String get 身份证号() {
          return 身份证号; 
    }
    public void set 身份证号(String 身份证号) {
        this.身份证号 = 身份证号; 
    }
    public String get 姓名() {
        return 姓名 ; 
    }public void set 姓名(String 姓名) {
        this.姓名 = 姓名; 
    }
    public char get 性别() {
        return 性别; 
    }
    public void set 性别(char 性别) {
        this.性别 = 性别; 
    }
    public short get 年龄() {
        return 年龄; 
    }
    public void set 年龄(short 年龄) {
        this.年龄 = 年龄; 
    }
    public String get 籍贯() {
        return 籍贯; 
    }
    public void set 籍贯(String 籍贯) {
        this.籍贯 = 籍贯; 
    } 
}

以上运行结果如下:

张三是男的,要吃两碗以上!

张三还没睡够,只睡了(6)个小时

============再造一个人出来============

小兰是女的,只吃半碗饭,减肥中...

小兰睡够了,睡了(9)个小时

Process finished with exit code 0

用中文来描述事物,原则上是没有问题的,Java 语言也能编译,代码的可读性还是很高,但是程序的表达、美观、格式、规范、国际化等不如英语,所以,一般都是用英文字母来写程序。

4.类—用英文来写“人类”程序

以下是英文版:

源代码:com.chapter01.testclass.PersonClass

package com.chapter01.testclass;
 /**
  *定义 "PersonClass" (以下用英文来描述) 
  */
  
  public class PersonClass {
    //一些属性 
    private String idCard; 
    private String name; 
    private char sex = '男 '; 
    private short age = 0; 
    private String nativePlace; 
    /**
     * eat 
     */
    public void eat() {
        if('男 '== sex){
            System.out.println (this.name +"是 "+this.sex +"的,要 吃两碗以 上!"); 
        }else {
            System.out.println (this.name +"是 "+this.sex +"的,只 吃半 碗饭,减肥中 ..."); 
    }
}
    /**
     *sleep 
     * @param startSleepTime 
     * @param getUpTime 
     * @return 睡眠情况 
     */
    public String sleep(int startSleepTime, int getUpTime) {
        int totalSleepTime = getUpTime-startSleepTime;
        String sleepState = ""; 
        if(totalSleepTime>8) {
            sleepState = "睡够了,睡 了("+totalSleepTime+")个小时"; 
        }else { 
            sleepState = "还没睡够,只睡 了("+totalSleepTime+")个小时"; 
        }return sleepState; 
    }
    //其他行为 
    //TODO 
    public static void main(String[] args) { 
        PersonClass personClass = new PersonClass ();

        //给"第一个人"这个实例填充属性值
        personClass.setIdCard ("50024543543567"); 
        personClass.setName ("张三"); 
        personClass.setSex ('男 '); 
        personClass.setAge ((short) 19); 
        personClass.setNativePlace ("广东广州市 "); 
        //第 1 个人的吃饭行为 
        personClass.eat (); 
        //第 1 个人的睡觉行为 
        String rs01 = personClass.sleep (9, 15); 
        System.out.println (personClass.getName ()+rs01); 
        System.out.println("============再造 一个人出来============"); 
        PersonClass personClass02 = new PersonClass (); 
        //给"第 2 个人"这个实例填充属性值 
        personClass02.setIdCard ("50024519891209245677"); 
        personClass02.setName ("小兰"); 
        personClass02.setSex ('女 '); 
        personClass02.setAge ((short) 25); 
        personClass02.setNativePlace ("重庆江北区"); 
        //第 2 个人的吃饭行为 
        personClass02.eat (); 
        //第 2 个人的睡觉行为 
        String rs02 = personClass02.sleep (9, 18); 
        System.out.println (personClass02.getName ()+rs02); 
    }
    
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) { 
        this.idCard = idCard; 
    }
    public String getName() { 
        return name; 
    }
    public void setName(String name) { 
        this.name = name; 
    }
    public char getSex() { 
        return sex; 
    }
    public void setSex(char sex) { 
        this.sex = sex; 
    }
    public short getAge() { 
        return age; 
    }
    public void setAge(short age) { 
        this.age = age; 
    }
    public String getNativePlace() { 
        return nativePlace; 
    }
    public void setNativePlace(String nativePlace) { 
        this.nativePlace = nativePlace;
    } 
}

这样从中文调整到英文做之后,这个类基本就成了,原来编写程序如此简单!

5.对象举例—对象(张三):

PersonClass personClass = new PersonClass ();
 //给"第一个人"这个实例填充属性值
personClass.setIdCard ("50024543543567");
personClass.setName ("张三"); 
personClass.setSex ('男 '); 
personClass.setAge ((short) 19);
 personClass.setNativePlace ("广东广州市 "); 
 //第 1 个人的吃饭行为 
 personClass.eat (); 
 //第 1 个人的睡觉行为 
 String rs01 = personClass.sleep (9, 15); 
 System.out.println (personClass.getName ()+rs01);

6.对象—创建“人类”的第 2 个对象(小兰):

创建“人类”的第二对象(小兰)代码:

PersonClass personClass02 = new PersonClass ();

//给"第 2 个人"这个实例填充属性值
personClass02.setIdCard ("50024519891209245677");
personClass02.setName ("小兰");
personClass02.setSex ('女 ');
personClass02.setAge ((short) 25);
personClass02.setNativePlace ("重庆江北区");

//第 2 个人的吃饭行为
personClass02.eat ();
//第 2 个人的睡觉行为
String rs02 = personClass02.sleep (9, 18);

System.out.println (personClass02.getName ()+rs02);