Java基础教程 从C/C++到Java(二)
推荐学习前复习一下C++关于类的相关知识
今天学习了java中关于类的基本知识,如下:
- 构造函数
- 类的调用
- 成员变量及成员函数
- 程序结构
程序结构如下图所示(IDEA):
在src下的smallVendingMachine和vendingMachine两个package中分别有一个.java文件,涉及到跨包调用等基础操作
详细解释还是见代码及注释
代码
最主要的VendingMachine.java
文件
package vendingMachine; // 声明包
import smallVendingMachine.SmallVendingMachine; // import 包名字.编译单元
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
public class VendingMachine {
private String info = "This is info"; // info是私有成员变量 私有类型无法从类外访问
private double total = 0; // C++中不能通过这种方法初始化函数变量 java可以
private double price; // 留到构造函数中初始化
private VendingMachine(){ // 构造函数
price = 3; // 初始化成员变量
}
private VendingMachine(double price){ // 重载构造函数
this.total = price;
}
private void showInformation(){ // 成员函数默认类型为friendly(与C++不同) 同一个包下可访问 不同时需声明为public
System.out.println(this.info); // 每个成员函数存在隐藏的本地变量this指代调用此函数的对象
}
void setPrice(double price){
this.price = price; // 同名时函数采取就近原则 price此处是形参并非成员变量 price = price没有意义
showInformation(); // 可以直接其他调用成员函数
}
private static double balance = 0.5; // static创建类变量 类似于python中的全局变量 是属于类本身而非对象的变量
private static SmallVendingMachine svm = new SmallVendingMachine(); // 创建成员内部类变量
void showBalance(){
System.out.printf("%f", balance); //格式化输出 同C++
System.out.println();
}
private ArrayList<String> itemName = new ArrayList<String>(); // 范型容器类 类似于C++的向量Vector
public int getSize(){
return itemName.size(); // 范型容器类提供了许多方法
}
HashSet<String> hashSet = new HashSet<String>(); // 哈希集合 自动去除重复对象 有需要再深入了解
HashMap<Integer, String> hashMap = new HashMap<Integer, String>(); // 哈希Map 键值对结构 类似于python的字典 有需要再深入了解
public static void main(String[] arg){ // static类函数 属于类本身 类函数之间可以相互调用 但是不能直接调用成员函数
VendingMachine vA = new VendingMachine(); // 创建对象
vA.showInformation(); // 调用方法
VendingMachine vB = new VendingMachine();
vA.showBalance();
vB.showBalance();
vA.balance = 1; // 也可以写成VendingMachine.balance(仅类变量可以) vA和vB的balance都会受到影响
vA.showBalance();
vB.showBalance();
svm.display(); // 调用成员内部类变量的方法
function(); // 可以直接调用类函数function 但是不能直接调用成员函数showBalance
//showBalance; いけません
VendingMachine[] vmarray = new VendingMachine[10]; // 对象数组 vmarray里放的全都是“指针”
for(int i=0; i<10; i++){ // for循环等基础操作是在主调函数里面的
vmarray[i] = new VendingMachine(); // 初始化对象
}
}
private static void function(){ // java的成员函数可以直接放在主调函数之后且无需声明!
// nothing
}
}
class A{ // 一个编译单元只能包含一个public类 仅public类可以对外可访问
}
和被调用的SmallVendingMachine.java
package smallVendingMachine;
public class SmallVendingMachine {
private String infoSmall;
public SmallVendingMachine(){ // 如果不在一个包里构造函数需要为public
infoSmall = "This is from smallVendingMachine";
}
public void display(){ //当在一个包中时无需声明为public
System.out.println(infoSmall);
}
public static void main(String[] arg){
SmallVendingMachine v = new SmallVendingMachine();
v.display();
}
}
明天继续(ง •_•)ง