三、面向对象
(一)类和对象
1.学生对象-练习
需求:首先定义一个学生类,然后定义一个学生测试类, 在学生测试类中通过对象完成成员变量和成员方法的使用
/*
学生类
*/
public class Student {
//成员变量
String name;
int age;
//成员方法
public void study(){
System.out.println("好好学习,天天向上");
}
public void doHomework(){
System.out.println("键盘敲烂,月薪百万");
}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
2.private的使用
get/set方法
/*
学生类
*/
public class Student {
//成员变量
private String name;//默认为public(string name;)
private int age;
//get/set方法
public void setName(String n) { //设置成员变量的值 void,String n
name = n;
}
public String getName() { //获取成员变量的值 String,无参
return name;
}
public void setAge(int a) {
if (a < 0 || a > 120) { //可以在set方法中设置获取范围
System.out.println("你给的年龄有误");
} else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {//不用传参!!!
System.out.println(name + "," + age);
}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用set方法给成员变量赋值
s.setName("林青霞");
s.setAge(30);
s.show();
//使用get方法获取成员变量的值
System.out.println(s.getName() + "," + s.getAge());
System.out.println(s.getName() + "," + s.getAge());
}
}
3.标准类制作
①成员变量
使用private修饰
②构造方法
提供一个无参构造方法
提供-个带多个参数的构造方法
③成员方法
提供每一个成员变量对应的setXxx()/getXxx()
提供一个显示对象信 息的show()
④创建对象并为其成员变量赋值的两种方式
无参构造方法创建对象后使用setXx()赋值
使用带参构造方法直接创建带有属性值的对象
/*
学生类
*/
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() { //无参构造
}
public Student(String name, int age) { //带多个参数的构造方法
this.name = name;
this.age = age;
}
//成员方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//无参构造方法创建对象后使用setXx()赋值
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用带参构造方法直接创建带有属性值的对象
Student s2 = new Student("林青霞", 30);
s2.show();
}
}
(二)API
1.用户登录
需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
import java.util.Scanner;
public class Login {
public static void main(String[] args) {
String username = "waxy";
String password = "mima";
Scanner sc = new Scanner(System.in); //输入
for (int i = 0; i < 3; i++) { //循环
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
if (name.equals(username) && pwd.equals(password)) { //字符串对比为equals(),字符串用==比较的是地址的值
System.out.println("登录成功");
break;
} else if (2 - i == 0) {
System.out.println("你的账户被锁定,请与管理员联系");
} else {
System.out.println("登陆失败,你还有" + (2 - i)+ "次机会"); //用i来倒数
}
}
}
}
2.遍历字符串
import java.util.Scanner;
public class Index {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:" );
String line = sc.nextLine();
for (int i = 0; i < line.length(); i++) { //获取字符串长度 length(); array获取长度为length;
System.out.print(line.charAt(i)); //charAt(int index); 返回指定索引处的char值,字符串的索引也是从0开始的
}
}
}
3.统计字符串次数
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符
import java.util.Scanner;
public class Count {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String line = sc.nextLine();
//定义三个统计变量,初始值都为0
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i = 0; i < line.length(); i++) {
char ch = line.charAt(i);
if (ch >= 'A' && ch <= 'Z') {
bigCount++;
} else if (ch >= 'a' && ch <= 'z') {
smallCount++;
} else if (ch >= '0' && ch <= '9') {
numberCount++;
}
}
System.out.println("大写字母:" + bigCount + "个");
System.out.println("小写字母:" + smallCount + "个");
System.out.println("数字" + numberCount + "个");
}
}
4.拼接字符串
需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
并在控制台输出结果。例如,数组为int[] arr= {1,2,3};,执行方法后的输出结果为: [1,2, 3]
public class ArrayToString {
public static void main(String[] args) {
//定义一个数组,静态初始化
int[] arr = {1, 2, 3};
//调用方法,用一个变量接收结果
String s = arrayToString(arr);
System.out.println(s);
}
public static String arrayToString(int[] arr) {
//初始化一个字符串
String s = "";
s += "[";
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1){
s += arr[i];;
}else{
s += arr[i];
s += ", ";
}
}
s += "]";
return s;
}
}
5.字符串反转
需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结果cba
import java.util.Scanner;
public class Reverse {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
String s = reverse(line);
System.out.println(s);
}
public static String reverse(String l){
String l1 = "";
for (int i = l.length()-1; i >= 0; i--) { //注意反向的for怎么写
l1 += l.charAt(i); //注意不是l[i]
}
return l1;
}
}
6.字符串拼接升级版
public class ArrayToString1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
String s = arrayToString(arr);
System.out.println(s);
}
public static String arrayToString(int[] arr) {
//StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("["); //append方法拼接
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1){
sb.append(arr[i]);
}else{
sb.append(arr[i]);
sb.append(", ");
}
}
sb.append("]");
String s = sb.toString();//转化为string类型
return s;
}
}
7.字符串反转升级版
import java.util.Scanner;
public class Reverse1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
String s = myreverse(line);
System.out.println(s);
}
public static String myreverse(String s){
//法一
// StringBuilder sb = new StringBuilder(s);//由string转为StringBuilder
// sb.reverse();
// String ss = sb.toString();//转化为String
// return ss;
//法二
return new StringBuilder(s).reverse().toString();
}
(三)ArrayList
1.存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
public class Student {
private String name;
private int age;
public Student(){};
public Student(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
import java.util.ArrayList;
public class Arraylist {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建学生对象
Student s1 = new Student("林青霞",30);
Student s2 = new Student("风清扬",33);
Student s3 = new Student("张曼玉",18);
//添加学生对象到集合中
array.add(s1);
array.add(s2);
array.add(s3);
//遍历
for (int i = 0; i < array.size() ; i++) { //区别array.length(数组),此为集合
Student s = array.get(i);//集合获取元素
System.out.println(s.getName()+","+s.getAge());
}
}
}
2.存储学生对象并遍历升级版
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
学生的姓名和年龄来自于键盘录入
public class Student1 {
//为了键盘录入方便,把学生类的成员变量都定义为String类型
private String name;
private String age;
public Student1(){}//构造函数没有返回值void、int等类型
public Student1(String name,String age){
this.name = name;
this.age = age;
}
public void setAge(String age) {
this.age = age;
}
public String getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayList1 {
public static void main(String[] args) {
ArrayList<Student1> array = new ArrayList<Student1>();
addStudent(array);
addStudent(array);
addStudent(array);
for (int i = 0; i < array.size(); i++) {
Student1 s = array.get(i);//集合获取元素
System.out.println(s.getName() + "," + s.getAge());
}
}
//为了提高代码的复用性。用方法来改进程序
public static void addStudent(ArrayList<Student1> array) {
//从键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
//创建学生类赋值成员变量
Student1 s = new Student1();
s.setName(name);
s.setAge(age);
//往集合种添加对象
array.add(s);
}
}
3.学生管理系统
public class Student {
private String sid;
private String name;
private String age;
private String address;
public Student(){}
public Student(String sid,String name,String age,String address){
this.sid = sid;
this.name = name;
this.age = age;
this.address = address;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManager {
public static void main(String[] args) {
//创建集合对象,用于存储数据
ArrayList<Student> array = new ArrayList<Student>();
//用循环完成再次回到主界面
while (true) {
System.out.println("--------欢迎来到学生管理系统--------");
System.out.println("1 添加学生");
System.out.println("2 删除学生");
System.out.println("3 修改学生");
System.out.println("4 查看所有学生");
System.out.println("5 退出");
System.out.println("请输入您的选择:");
//用scanner实现键盘录入
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//用switch语句完成操作的选择
switch (line) {
case "1":
System.out.println("添加学生");
addStudent(array);
break;
case "2":
System.out.println("删除学生");
deleteStudent(array);
break;
case "3":
System.out.println("修改学生");
updateStudent(array);
break;
case "4":
System.out.println("查看所有学生");
findAllStudent(array);
break;
case "5":
System.out.println("谢谢使用!");
System.exit(0);//JVM退出(java虚拟机)
}
}
}
//判断学号是否被占用
public static boolean inUsed(ArrayList<Student> array, String sid) {
boolean flag = false;
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
if (s.getSid().equals(sid)) {
flag = true;
break;
}
}
return flag;
}
//添加学生
public static void addStudent(ArrayList<Student> array) { //参数为arraylist集合
Scanner sc = new Scanner(System.in);
//为了让sid在while循环外边被访问到,定义在循环外
String sid;
//为了让程序能回到这里,使用循环实现
while (true) {
System.out.println("请输入学生学号:");
sid = sc.nextLine(); //这里已经定义过,不用String
//调用判断是否重复
boolean flag = inUsed(array, sid);
if (flag) {
System.out.println("你输入的学号已经使用,请重新输入");
} else {
break;
}
}
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
System.out.println("请输入学生居住地:");
String address = sc.nextLine();
//创建学生对象
Student s = new Student();
//把键盘录入信息赋值给成员变量
s.setSid(sid);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//往集合种添加对象
array.add(s);
System.out.println("添加学生成功!");
}
//查看学生
public static void findAllStudent(ArrayList<Student> array) {
//判断集合中是否有数据
if (array.size() == 0) {
System.out.println("无信息,请先添加信息再查询");
return;//为了不让程序再往下执行,return;
}
//显示表头信息
// \t 其实就是tab键的位置
System.out.println("学号\t\t\t姓名\t\t年龄\t\t居住地");
//将集合中数据取出,按照对应格式显示学生信息,年龄显示补充”岁“
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);//从集合中取出,先从集合中取,才能用类中的getName等方法
System.out.println(s.getSid() + "\t" + s.getName() + "\t" + s.getAge() + "岁\t" + s.getAddress());
}
}
//删除学生
public static void deleteStudent(ArrayList<Student> array) {
int index = -1; //记录位置
//键盘录入要删除的学生学号,显示提示信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生学号:");
String sid = sc.nextLine();
//遍历集合如有相同信息便记录索引位置
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
if (s.getSid().equals(sid)) { //字符串要用equals
index = i;//索引位置改变
break;
}
}
//判断信息是否存在,并删除
if (index == -1) {
System.out.println("该信息不存在,请重新输入");
} else {
array.remove(index);
System.out.println("删除学生成功!");
}
}
//修改学生
public static void updateStudent(ArrayList<Student> array) {
//键盘录入要删除的学生学号,显示提示信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生学号:");
String sid = sc.nextLine();
//键盘录入要修改的学生信息,只能一个信息一个信息的录入
System.out.println("请输入学生新姓名:");
String name = sc.nextLine();
System.out.println("请输入学生新年龄:");
String age = sc.nextLine();
System.out.println("请输入学生新居住地:");
String address = sc.nextLine();
//创建学生对象
Student s1 = new Student();
s1.setSid(sid);//用set录入新对象的信息
s1.setName(name);
s1.setAge(age);
s1.setAddress(address);
int index = -1; //记录位置
//遍历集合修改对应的学生信息
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
if (s.getSid().equals(sid)) {
index = i;
break;
}
// else {
// System.out.println("未查询到对象");
// }//这种方法会输出很多else
}
if (index == -1) {
System.out.println("该信息不存在,请重新输入");
} else {
array.set(index, s1);//set方法
System.out.println("修改学生成功!");
}
}
}
(四)时间日期类
1.calendar常用方法
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
//获取日历类对象
Calendar c = Calendar.getInstance();
//输入日期
//今天
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//增减日期
//三年前的今天
c.add(Calendar.YEAR, -3);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//10年后的5天前
c.add(Calendar.YEAR, +10);
c.add(Calendar.DATE, -5);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//设置当前日期的年月日
c.set(2048, 11, 11);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
}
}
2.二月天
获取任意一年的二月有多少天
import java.util.Calendar;
import java.util.Scanner;
public class February {
public static void main(String[] args) {
//键盘输入年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt(); //year应该是int,输入也为nextint
//设置日历对象的年月日
Calendar c = Calendar.getInstance();
c.set(year,2,1); //月份是从0开始数的
//三月一日往前推一天就是二月最后一天
c.add(Calendar.DATE,-1);
//输出
int date = c.get(Calendar.DATE);
System.out.println(year+"年的二月有"+date+"天");
}
}
后续内容请见下一章。