慕课网翁恺老师《面向对象程序设计——Java语言》第一周课程笔记及作业题(设计一个表示分数的Fraction类)

一、类与对象

1.1 用类制造对象

  • 对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。
  • 本节尝试自己定义类,然后用自己定义的类来创建对象;
  • 类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象。每个对象都有自己的数据。

下载 shapes.zip文件

  • 对象是实体,需要被创建,可以为我们做事情;
  • 类是规范,根据类的定义来创建对象。
  • 对象=属性+服务,数据表示属性或形态,例如画圆时的圆心和半径,
  • 把数据和对数据的操作放在一起,称为封装

1.2 定义类

  • 类由两种东西构成:1.表示对象有什么成员变量;2.表示对象能做什么成员函数;
  • 一旦定义了类,我们就可以创建这个类的多个对象,这些对象就会做那个类所定义的动作(函数),但是各自具有不同的数据。

举例说明:

package vendingmachine;
public class VendingMachine {
	int price =80;
	int balance;
	int total;
	void showPrompt()
	{
		System.out.println("Welcome");
	}
	void insertMorney(int amount)
	{
		balance = balance +amount;
	}
	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 Auto-generated method stub
		VendingMachine vm= new VendingMachine();//创建对象
		vm.showPrompt();//让对象做事情,变量名字.方法。
		vm.showBalance();
		vm.insertMorney(100);
		vm.getFood();
		vm.showBalance();
	}
}

1.3 成员变量和成员函数

1.成员

  • 类才具有成员,包括”成员变量“和**“成员函数”**。

  • 理解对象中的成员变量是怎么来的,怎么就能让成员函数明白自己在和哪个对象打交道;

  • 写在类里的成员变量只是一个声明,变量并不在那里,变量不在类里,变量在每一个对象里;

  • 一定要正确且充分的理解这里面的关系!!!

2.本地变量

  • 定义在类的函数内部的变量;

  • 本地变量的作用域和生存期在函数的内部。

3.成员变量

  • 类定义了对象中所具有的变量,这些变量称作成员变量;

  • 写在类里的变量,生存期是对象的生存期,作用域是类内部的成员函数。

  • 每个对象都有自己的变量,和同一个类的其他对象是分开的。

4.函数与成员变量

  • 在函数中,可以直接写成员变量的名字来访问成员变量;
v.insertMoney();
//这次调用临时建立了insertMoney()和v之间的关系,让insertMoney()内部的成员变量指的是v的成员变量;
  • this是成员函数特殊的(固有的)本地变量,它表达了调用这个函数时的那个对象;
//比如说定义了一个类veningmachine
//我想定义个函数给balance赋值,便可以用到this
public class VendingMachine {
	int price =80;
	int balance;//成员变量
	int total;
	void setBalance(int balance)
    {
        this.balance=balance
           //this.balance是类中的成员变量balance;
           //等号后面的balance是成员函数setBalance()中的本地变量;
    }
}

1.4 对象初始化

  • 变量初始化是程序安全很重要的一环。

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

  • 本课时还涉及了函数重载和用this()来调用其他构造函数的方式。

    1.成员变量定义和初始化

    • 成员变量在定义的地方就可以给出初始值;
    • 未给出初始值的成员变量会自动获得0值;

    2.构造函数

  • 如果有一个成员函数的名字和类的名字完全相同,则在创建这个类的每一个对象的时候会自动调用这个函数——》构造函数

  • 在构造(对象)的时候会自动调用的函数叫作:构造函数。

  • 构造函数不能有返回类型;

    public class VendingMachine {
    	int price =80;
    	int balance;//成员变量
    	int total;
        
    	VendingMachine()//构造函数,在构造的时候会被自动调用的函数
    	{
    		total=0;
    	}
        VendingMachine(int price)//构造函数2,我们可以有多个构造函数,但是二者的参数应该不同;
        {
            this.price=price;
        }
    }
    //至于定义对象时调用何种构造函数,主要看定义对象时参数的选择;
    //两个构造函数的关系叫做重载
    

    3.函数重载

  • 一个类可以有多个构造函数,只要它们的参数表不同;它们构成了重载关系(overload)

  • 创建对象的时候给出不同的参数值,就会自动调用不同的构造函数;

  • 通过this()还可以调用其它构造函数;

  • 一个类里的同名但参数表不同的函数构成了重载关系

作业题

题目内容

设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。

这个类的构造函数是:

Fraction(int a, int b)

构造一个a/b的分数。

这个类要提供以下的功能:

double toDouble();

将分数转换为double

Fraction plus(Fraction r);

将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。

Fraction multiply(Fraction r);

将自己的分数和r的分数相乘,产生一个新的Fraction的对象。

void print();

将自己以“分子/分母”的形式输出到标准输出,并带有回车换行。如果分数是1/1,应该输出1。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的输出。

注意,在创建和做完运算后应该化简分数为最简形式。如2/4应该被化简为1/2。

你写的类要和以下的代码放在一起,并请勿修改这个代码:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

	Scanner in = new Scanner(System.in);

	Fraction a = new Fraction(in.nextInt(), in.nextInt());

	Fraction b = new Fraction(in.nextInt(),in.nextInt());

	a.print();

	b.print();

	a.plus(b).print();

	a.multiply(b).plus(new Fraction(5,6)).print();

	a.print();

	b.print();

	in.close();

}

}

注意,你的类的定义应该这样开始:

class Fraction {

也就是说,在你的类的class前面不要有public。

输入格式:

程序运行时会得到四个数字,分别构成两个分数,依次是分子和分母。

输出格式:

输出一些算式。这些输入和输出都是由Main类的代码完成的,你的代码不要做输入和输出。

输入样例:

2 4 1 3

输出样例:

1/2

1/3

5/6

1

1/2

1/3

代码实现

//作业提交时拷贝以下的代码
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		Fraction a = new Fraction(in.nextInt(),in.nextInt());
		Fraction b = new Fraction(in.nextInt(),in.nextInt());
		a.print();
		b.print();
		a.plus(b).print();
		a.multiply(b).plus(new Fraction(5,6)).print();
		a.print();
		b.print();
		in.close();

	}

}
class Fraction{
	int n;
	int d;
	//分子和分母两个属性
	//4个动作
	Fraction(int n, int d)//建立构造函数
	{
		this.n=n;
		this.d=d;
	}
	double toDouble()//表示返回double的类型
	{
		return n/(double)d;//将分数转换为double
	}
	Fraction plus(Fraction r)//表示返回Fraction的类型
	{
		Fraction x= new Fraction(1,1);
		x.n=r.n*d+r.d*n;
		x.d=r.d*d;
		return x;
	}
	Fraction multiply(Fraction r)
	{
		Fraction x=new Fraction(1,1);
		x.n=n*r.n;
		x.d=d*r.d;
		return x;
	}
	void print()
	{
		if (n==d)
		{
			System.out.println(1);
		}
		else
		{
			if (d==0)
			{System.out.println("分母不能为0");}
			else
			{
				//判断分子分母之间是否有公约数
				int a=n;
				int b=d;
				int max=1;
				if (n>d)
				{
					int temp=a;
					a=b;
					b=temp;
				}
				
				for (int i=2;i<=a;i++)
				{
					if(a%i==0 && b%i==0)
					{
						max=i;
					}
				}
				n=n/max;
				d=d/max;
				System.out.println(n+"/"+d);
			}
			
		}
	}
}

你可能感兴趣的:(慕课网翁恺老师《面向对象程序设计——Java语言》第一周课程笔记及作业题(设计一个表示分数的Fraction类))