Mooc翁恺-Java面向对象程序设计 第一周 类与对象

简介: 用对象思考,用类来写作。Java语言是一种面向对象语言,是业界使用最为广泛的语言,十二年前就占据了1/4的编程语言份额,到今天仍然以1/5的比例站在编程语言排行榜的前列。Java是优秀的面向对象编程语言,特别适合构建多人协作的大型软件产品。...

第一周 类与对象

本文是观看翁恺老师《面向对象程序设计Java》时所做
视频来源-中国大学Mooc网

@[TOC]

1.1 用类制造对象

之前我们学习了如何使用系统提供的类,比如String,来创建对象和使用对象。
尤其重要的是我们理解了对象变量和普通变量的不同,对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。
现在,我们要来尝试自己定义类,然后用自己定义的类来创建对象。
我们从一个已有的程序开始,看看如何用这个程序中定义好了的类来创建多个对象。这个程序是一个图形用户界面的程序,会显示一个图形窗口,在其中画图。图上的每一个形状,都是一个对象。
我们希望通过对这个程序的尝试,让你充分理解类和对象的关系:类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象,每个对象有自己的数据。

对象与类

  • 对象是实体,需要被创建,可以为我们做事情
  • 类是规范,根据类的定义来创建对象

在这里插入图片描述

对象 = 属性 + 服务

  • 数据:属性或状态
  • 操作:函数

在这里插入图片描述

Shapes代码:

完整代码链接
MyPic.java

package shapes;

public class MyPic {
    public static void main(String[] args) 
    {
        Picture pic = new Picture(420,300);
        Circle c1 = new Circle(320,40,80);
        Rectangle r1 = new Rectangle(100, 100, 100, 100);
        Triangle t1 = new Triangle(100, 100, 200, 100, 150, 50);
        Line l1 = new Line(0,205,400,205);
        Circle c2 = new Circle(200,200,50);
        pic.add(c1);
        pic.add(r1);
        pic.add(t1);
        pic.add(l1);
        pic.add(c2);
        pic.draw();    
    }
}

1.2 定义类

一个类由==两种==东西组成:表示对象有什么的==成员变量==和表示对象能做什么的==成员函数==。

一旦定义了类,我们就可以创建这个类的多个对象,这些对象都会做那个类所定义的动作(函数),但是各自具有不同的数据。

自动售货机
在这里插入图片描述
VendingMachine.java

import java.awt.image.BandCombineOp;

import javax.swing.text.TabableView;

public class VendingMachine {
    int price = 80;
    int balance;
    int total;
    
    VendingMachine ()
    {
        ;
    }
    void showPrompt()
    {
        System.out.println("welcome!");
    }
    
    void insertMoney(int amount)
    {
        balance = balance + amount;
        showBalance();
    }
    
    void showBalance()
    {
        System.out.println(balance);
    }
    
    void getFood()
    {
        if(balance>price)
        {
            System.out.println("Here you are");
            balance = balance - price;
            total = total + price;
        }
    }
    
    public static void main(String[] args) {
        // TODO 
        VendingMachine vm = new VendingMachine();
        vm.showPrompt();
        vm.showBalance();
        vm.insertMoney(100);
        vm.getFood();
        vm.showBalance();
        VendingMachine vm1 = new VendingMachine();
        vm1.insertMoney(200);
        vm.showBalance();
        vm1.showBalance();

    }
}

创建对象

  • new VendingMachine();
  • VendingMachine v = new VendingMachine();

让对象做事

  • . 运算符
  • v.showPromt()
  • v.insertMoney()

1.3 成员变量和成员函数

这里的关键是理解类的定义和对象的关系,理解对象中的成员变量是怎么来的,怎么就能让成员函数明白自己在和哪个对象打交道。

这件事情,很多初学者是不明白的,而且是根本不去想这里有这么个事儿的。但是一旦想进去了而又没想明白,会很可怕的。

在没有引入类之前,变量是跟着代码走的。代码写到哪儿,变量写在哪里,那么运行的时候变量就在那儿。现在,写在类里的成员变量,只是一个声明,变量并不在那里,变量不在类里,变量在每一个对象里。

建议你一定要跟着视频中的方法自己用调试的方法看几遍成员函数的执行,做各种尝试,一定要正确而且充分地理解这里的关系。

函数与成员变量

  • 在函数中可以直接写成员变量的名字来访问成员变量
  • 那么究竟访问的是哪个对象的呢?
  • 函数是通过对象来调用的 -- v.insertMoney()
  • 这次调用临时的简历了insertMoney()和v之间的关系,让inserMoney()内部的成员变量指的是v的成员变量

==this指针==

this是成员函数的一个特殊的固有的本地变量,它表达了调用这个函数的那个对象

调用函数

在这里插入图片描述

本地变量

  • 定义在函数内部的变量是本地变量
  • 本地变量的生存期和作用域都是函数内部
  • 成员变量的生存期是对象的生存期,作用域是类内部的成员函数

1.4 对象初始化

变量的初始化是程序安全很重要的一环。一旦创建了一个对象,有什么手段可以保证其中的每一个成员变量都有确定的初始值呢?

Java提供了多种手段来保障对象创建时的初始化,包括给每个成员变量默认的“0”值、定义初始化和构造函数。

成员变量定义初始化

  • 成员变量在定义的地方就可以给出初始值
  • 没有给出初始值的成员变量会自动获得0值
  • 对象变量的0值表示没有管理任何对象,也可以主动的给null值
  • 定义初始化可以调用函数,甚至可以使用已经定义的成员变量

构造函数

  • 如果有一个成员函数的名字和类的名字完全相同,则在创建这个类的每一个对象的时候会自动调用这个函数
  • 这个函数不能有返回值
  • 可以有多个构造函数
public class VendingMachine {
    int price = 80;
    int balance;
    int total;
    
    VendingMachine ()  //构造函数
    {
        total = 0;
    }

    VendingMachine (int price) {  // 函数重载
        this.price = price;
    }

}

函数重载

  • 一个类可以有多个构造函数,只要他们的参数表不同
  • 创建对象的时候给出不同参数值,就会自动调用不同的构造函数
  • 通过this()还可以调用其他构造函数
  • 一个类里的同名但参数表不同的函数构成了重载关系
目录
相关文章
|
16天前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
167 101
|
16天前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
193 100
|
2月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
300 120
|
2月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
2月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
122 3
|
Java 程序员 编译器
【详识JAVA语言】面向对象程序三大特性之二:继承
【详识JAVA语言】面向对象程序三大特性之二:继承
133 2
|
Java 开发者
Java 面向对象新视界:揭秘子类如何“继承”父类精华,再添“创新”之笔
【6月更文挑战第16天】在Java的面向对象世界,子类继承父类的特性,如`Circle`继承`Shape`,展示“is-a”关系。子类不仅保留父类的`color`和`display`方法,还添加了`radius`属性及定制的显示逻辑。这种继承与创新允许代码复用,增强灵活性和可扩展性,使得构建复杂系统变得更加高效和模块化。通过持续的继承与定制,开发者能构建出一系列独具特色的类,充分展现面向对象编程的力量。
214 57
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
208 2
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
165 3