封装,就是把数据和对这些数据的操作放在一起,并且用这些操作把数据掩盖起来,是面向对象的基本概念之一,
也是最核心的概念。可以理解为一个鸡蛋,用操作(蛋白)将数据(蛋黄)包围起来,就是封装。
我们有非常直截了当的手段来保证在类的设计的时候做到封装:所有的成员变量必须是private的,这样就避免别人任意使用你的内部数据;所有public的函数,只是用来实现这个类的对象或类自己要提供的服务的,而不是用来直接访问数据的。除非对数据的访问就是这个类及对象的服务。简单说,给每个成员变量提供一对用于读写的get/set函数也是不合适的设计。
private(私有)关键字只能用于成员变量和成员函数。意思是这个成员对这个类是私有的,
只可以让其它成员或对象(main中的对象)在类中访问。出了这个类就禁止访问,对象也无法访问私有成员。
私有(private)是针对类而不是针对对象的,对象之间的私有变量可以互相访问(只要在类的内部)。
public(公开):在成员函数名前面,在本类中还是其它类中都可以访问。
一个.java文件只有一个类的前缀可以是public且这个类的名字要和文件名相同。
public的类代表的是这个类是公开的,其它.java文件可以通过import的方式引用。
如果类的成员函数没有前缀(public|private),那么这个成员函数是"friendly"的。
意思是说和这个.java文件位于同一个包的其它类可以访问(包括自己)
//分数的运算
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.plus(b).print();
a.multiply(b).plus(new Fraction(5,6)).print();
a.print();
b.print();
in.close();
}
}
class Fraction{
private int fenzi;
private int fenmu;
public Fraction(int a, int b){
this.fenzi = a;
this.fenmu = b;
}
double toDouble(){
double c=fenzi/fenmu;
return c;
}
Fraction plus(Fraction r){
int fenzi_new = fenzi*r.fenmu + fenmu*r.fenzi; //在类中,对象可以相互访问其它对象的私有变量
int fenmu_new = fenmu*r.fenmu;
Fraction x = new Fraction(fenzi_new,fenmu_new);
return x;
}
//这两个成员函数就是friendly的
Fraction multiply(Fraction r){
int fenzi_new = fenzi*r.fenzi;
int fenmu_new = fenmu*r.fenmu;
Fraction x = new Fraction(fenzi_new,fenmu_new);
return x;
}
void print(){
if(fenzi==fenmu){
System.out.println(1);
}else{
boolean can =false;
int d = 0; //最大公约数
for(int i = fenzi;i>0;i--){
if(fenzi%i==0&&fenmu%i==0){
d = i;
break;
}
}
if(d==1){
System.out.println(fenzi+"/"+fenmu);
}else{
fenzi/=d;
fenmu/=d;
System.out.println(fenzi+"/"+fenmu);
}
}
}
}