Java 类与对象
一、对象与类
1、









public class VendingMachine { //定义了类 VendingMachine
//属性(变量)
int price=60;//商品价格
int balance;//余额
int total;//总钱数
//动作
void showPrompt()//初始欢迎
{
System.out.println("Welcome");
}
void insertMomey(int amount)//投进去钱数
{
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;//总营业额
}
}
void sayBye()
{
System.out.println("欢迎下次光临");
}
//主函数
public static void main(String[] args) {
// TODO Auto-generated method stub
VendingMachine vm1= new VendingMachine();
vm1.showPrompt();
vm1.insertMomey(50);
vm1.showBalance();//投入了50
vm1.insertMomey(50);
vm1.showBalance();//投入了100
vm1.getFood();//得到 商品
vm1.showBalance();//找零
vm1.sayBye();
}
}

注意本地变量和类里的成员变量。
2、
题目内容:
设计一个表示分数的类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 {//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//定义类 Fraction
{
//成员变量
int x;
int y;
Fraction(int a,int b)//成员变量初始化,赋初值 构造函数,与类名相同
{
this.x=a;
this.y=b;
}
//成员函数,加减运算
void toDouble()//分数变小数
{
System.out.println((double)x/y);
}
Fraction plus(Fraction z)//加法
{
int n,m;
n=x*z.y+y*z.x;
m=y*z.y;
return new Fraction(n,m);//返回新的值,不影响其他的对象
}
Fraction multiply(Fraction z)//乘法
{
int n,m;
n=x*z.x;
m=y*z.y;
return new Fraction(n,m);
}
void print()//约分,除以2,3,5,7……
{
while(x%2==0 && y%2==0)
{
x=x/2;
y=y/2;
}
for(int i=3;i<=x && i<=y;i=i+2)
{
while(x%i==0 && y%i==0)
{
x=x/i;
y=y/i;
}
}
if(x==y)
System.out.println("1");
else
System.out.println(x+"/"+y);
}
}

二、对象的交互
1、Display的类
package clock;//包
public class Display {
private int value=0; //类私有变量
private int limit=0;
//公有的函数
public Display(int limit)//构造函数初始化值
{
this.limit=limit;
}
public void increase()//类加1 函数,循环函数
{
value++;
if(value==limit)
{
value=0;
}
}
public int getValue() //返回函数值
{
return value;
}
// static 静态类函数
public static void main(String[] args) {
// TODO Auto-generated method stub
Display d=new Display(24);
for(;;)//死循环
{
d.increase();
System.out.println(d.getValue());
}
}
}

2、
package clock;
public class Clock {
//调用Display类
private Display hour=new Display(24);
private Display minute=new Display(60);
//类动作
public void start()
{
minute.increase();
if(minute.getValue()==0)
{
hour.increase();
}
System.out.printf("%02d:%02d\n",hour.getValue(),minute.getValue());//格式输出
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Clock clock=new Clock();
for(;;)//循环输出
{
clock.start();
}
}
}

Clock类中调用Display,生成了两个Display对象,分别表示分钟,小时。然后,在Clock类中,只需将两者交互起来就行,一定要注意,private和public。这个决定了他们是否能被调用。
3、访问属性
3.1

这里数据其实就是成员变量,操作就是那些动作,用.()调用的那些成员函数。成员函数包括(构造函数,常规函数等)。
一般来说成员变量都需要private来保护,以防止变量混乱。
带private的只能在该类下被调用,上面程序中Display中的value在Clock类中就不能被调用。

只有getValue可以调用,因为getValue 前是public。

这种情况下的成员函数变量为同类对象时,这时的private成员变量是可以访问的,因为他们对应的类是相同的。

3.2


这个是包Clock的存储结构。同一个包下,只要不是private,就都可以自由访问。
还可以看到一个文件名和类名是对应的,public class Clock,只能有一个public的类,且该类和文件名对应。
3.3

当Clock和Display不在同一个包下时,这时会看到Clock代码下会增加一行用来载入Display的类。
4、类变量和类函数
![]()

带static 的就是类变量和类函数。他们隶属于类,而与成员变量和成员函数不同,那些属于特定对象。
package Test;
public class Test11 {
public static int staticVar = 0;
public int instanceVar = 0;
public Test11() {
staticVar++;
instanceVar++;
System.out.println("staticVar=" + staticVar + ",instanceVar="
+ instanceVar);
}
public static void main(String[] args) {
Test11 test = new Test11();
Test11 test1 = new Test11();
Test11 test2 = new Test11();
}
}

无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;
但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
浙公网安备 33010602011771号