这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、访问控制符
1.1 概述
- 访问控制符用于控制一个类,或类中的成员的访问范围
public:该类和非该类的均能访问
protected:该类和该类的子类,同一个包内的成员也能访问
[defalut]:同一个包内的类可以访问
private:只有该类可以访问
1.2 选择原则
- 尽量使用小范围
- public 是与其他开发者的一个契约,约定公开的东西会尽量保持稳定不变
- 小范围的好处,便于维护修改
1.3 练习:学生抽奖
在一个类中,一般情况下,我们习惯将成员变量设置为privare类型,同时通过set/get方法提供对成员变量的修改与查询途径。
package 学生抽奖;
public class Student {
private int id;
private String name;
private String gender;
private int age;
private int times;// 中奖次数
public Student(int id, String name) {
this(id,name,null,0,0);
}
public Student(int id, String name, String gender, int age, int times) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
this.times = times;
}
@Override
public String toString() {
return id+","+name+","+gender+","+age+","+times;
}
public int getId() {
return this.id;
}
public int getAge() {
return this.age;
}
public int getTimes() {
return this.times;
}
public String getName() {
return this.name;
}
public String getGender() {
return this.gender;
}
public void setTimes(int i) {
this.times+=i;
}
public void setId(int id) {
this.id = id;
}
}
package 学生抽奖;
/*
* 读取、写入与修改学生的数据与中奖次数的工具类
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
public class StuIO {
// ArrayList集合,用来存放所有的学生对象
// 静态,原因是学生数据加载后,没必要加载多分一样的数据,仅有一份数据即可
static ArrayList<Student> stu = new ArrayList<Student>();
// 静态初始化块,类第一次被加载时执行,且只执行一次
static {
try {
/*
* 读取数据
* 之前用过的FileReader的read()方法一次读取一个字节;
* BufferedReader readLine()读取一行字符串,读取结束后,再读返回null值;
* 结合FileReader和BufferedReader来协同读取数据,FileReader负责从文件
* 读取字符,FileReader可以以行为单位读取文本数据,二者协同实现字符串
* (文本)的行读取
*/
BufferedReader in = new BufferedReader(new FileReader("d:/Students.txt"));
// 死循环读取文本
while(true) {
// 读入指定文件的一行数据
String line = in.readLine();
// 判断文件读取是否结束,null为标志
if(line == null) {
System.out.println("读取结束!");
break;
}
// 利用正则表达式匹配字符串中任意位置的空白,并删除空格
line = line.replaceAll("\\s+", "");
// 判断删除空格后,该行是否还有数据,或是空行
if(line.length() == 0) {
continue;// 如若是空行,则无需进行下一步的操作,直接跳至读取下一行
}
// 将处理后的行数据处理成Student对象
Student s = strToStu(line);
// 将该Student对象添加进泛型数组列表
stu.add(s);
}
} catch (Exception e) {
// TODO: handle exception
}
}
private static Student strToStu(String line) {
// 1,张三,男,23,0
// .split(",")方法将读取的行以逗号为标志分割为5个部分,分别存入a字符串数组
String[] a = line.split(","); // 参数为一个正则表达式
Student s = new Student(
Integer.parseInt(a[0]),// a[i]是String数组,对于int数据需要先解析为int类型
a[1],
a[2],
Integer.parseInt(a[3]),
Integer.parseInt(a[4]));
return s;
}
// 类测试方法
// public static void main(String[] args) {
// for(int i =0;i<stu.size();i++) {
// System.out.println(stu.get(i));;
// }
// }
public static void save() {
try {
/*
* FileWriter的write()方法
*/
FileWriter out = new FileWriter("d:/Students.txt");
// 循环变量每一个泛型数组中的Student对象并toString相应信息,写入指定文件
for(int i =0;i<stu.size();i++) {
Student s = stu.get(i);
out.write(s.toString()+"\n");// txt文本的换行是\r\n,这是windows要求的
}
out.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
package 学生抽奖;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
// while死循环抽奖,回车继续
while(true) {
System.out.println("回车继续,exit退出");
String s = new Scanner(System.in).nextLine();
if(s.equals("exit")) {
System.out.println("结束抽奖!");
break;
}
// 获得Student对象的泛型数组列表
ArrayList<Student> stu = StuIO.stu;
// 随机取得下标[0,stu.size())
Student obj = stu.get(new Random().nextInt(stu.size()));
obj.setTimes(1);
System.out.printf("恭喜%s,您中了大奖!",obj.getName());
// 将改变的times写入文件,无需传数组列表参数,因为是static的
// 直接将StuIo类中的泛型数组列表保存至文件
StuIO.save();
}
}
}