学习内容
一、object类常用方法
1.基本介绍
object类是所有类的超类,所有对象(包括数组)都实现这个类的方法,即对象或数组都可以用object类中的方法
2.equals方法
判断两个对象的内存地址是否相同,即是不是同一个对象,默认用于判断引用数据类型,但是子类往往会重写该方法,用于判断内容是否相等
public class test1 {
public static void main(String[] args) {
B b = new B();
A a1 = b;
B c = b;
A a = new A();
System.out.println(b.equals(a1)); //true
System.out.println(c.equals(a1)); //true
System.out.println(a.equals(a1)); //false
System.out.println("sss".equals("sss")); //ture
}
}
class A{ }
class B extends A{ }
注意:equals和 == 的区别
equals:是object类中的一个方法,默认判断引用数据类型,但是子类往往会重写该方法,用于判断内容是否相等
== :是一个比较运算符,既可以判断引用数据类型又可以判断基本数据类型
3.hashCode方法
hashCode:返回该对象的哈希码值
- 提高具有哈希结构的容器的效率
- 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的(不同对象则不一样)
public class test1 {
public static void main(String[] args) {
A a = new A();
A a1 = new A();
A a2 = a;
System.out.println(a.hashCode()); //1956725890
System.out.println(a1.hashCode()); //356573597
System.out.println(a2.hashCode()); //1956725890
}
}
class A{ }
4.toString方法
toString:默认返回 对象的包名+类名+@+哈希值的十六进制
Object中toString方法源码
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
重写toString方法:一般把对象的属性值输出,也可以自定义
注意:当直接输出一个对象时,toSting方法会被默认的调用
public class test1 {
public static void main(String[] args) {
A a = new A("张三", 18);
System.out.println(a.toString()); // A{name='张三', age=18}
//当直接输出一个对象时,toSting方法会被默认的调用
System.out.println(a); // A{name='张三', age=18}
}
}
class A{
String name;
int age;
public A(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
5.finalize方法
finalize:当对象没有任何引用时,系统自动调用该对象的finalize方法,则jvm就认为这个对象时一个垃圾对象,就会使用垃圾回收机制销毁该对象,子类也可以重写该方法,做些释放资源的操作**
也可以重写finalize方法,写自己的业务逻辑代码(如:数据库的连接、打开文件等),如果不重写,就默认调用Object中的finalize方法
注意:垃圾回收机制的调用,是由系统来决定(即有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。
public class test1 {
public static void main(String[] args) {
A a = new A("张三");
a = null;
System.gc(); //主动销毁对象,释放资源(前提是该对象是一个垃圾)
}
}
class A{
String name;
public A(String name) {
this.name = name;
}
@Override
protected void finalize() throws Throwable {
System.out.println(name+"被销毁");
}
}
二、断点调试(debug)
1.基本介绍
debug:就是在程序中设置一个断点,在调试时遇到这个断点程序就会停下来,然后一步一步往下调试。调试的过程中可以看到各个变量的值,如果代码出错则会显示出错误,从而就可以分析找出Bug
IDEA断点调试的快捷键
- F7:跳入方法内执行,默认情况下不能进入java源码中的方法。如果想按F7进入源码可以对IDEA的Setting进行设置
- Alt+shift+F7:强制进入的方法,java源码也可以进入
- F8:跳过,继续逐行执行代码
- shift+F8:跳出方法
- F9:执行到下一个断点
三、零钱通案例
功能如下:
1.查看零钱收益和消费的明细
2.如果收益则增加零钱的余额(初始余额为0,且收益不能为负)
3.如果消费则减去消费的金额(消费金额不能大于余额)
4.退出零钱通
1.面向过程编程
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
boolean bool = true;
double sum = 0; //余额
double money = 0; //收益和消费金额
String p=""; //打印的字符串
Date date; //日期类型
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //日期的格式化
do {
System.out.println("========零钱通========");
System.out.println(" 1.零钱通明细 ");
System.out.println(" 2.收益入账 ");
System.out.println(" 3.消费 ");
System.out.println(" 4.退出 ");
System.out.println("请选择(1-4)");
System.out.println("=====================");
Scanner scanner = new Scanner(System.in);
String key = scanner.next();
switch (key){
case "1":
System.out.println("--------零钱通明细---------");
System.out.println(p);
break;
case "2":
System.out.println("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0){
System.out.println("收益金额,应该大于0!");
break;
}
sum += money;
date = new Date();
p += "收益入账:+"+money+"\t"+sf.format(date)+"\t余额:"+sum+"\n"; //字符串的一个连接,最后换行
break;
case "3":
System.out.println("消费金额:");
money = scanner.nextDouble();
if (money >= sum){
System.out.println("收益金额,应该小于"+sum);
break;
}
String consumption = scanner.next();
sum -= money;
date = new Date();
p += consumption+"\t"+"-"+money+"\t"+sf.format(date)+"\t余额:"+sum+"\n";
break;
case "4":
/*
下面代码其实可以写的更简单,
但建议一段代码完成一个功能,不要混合在一起,减少代码的耦合,易维护
*/
String x;
while (true){ //如果不输入y\n就一直提示
System.out.println("是否确认退出y/n?");
x = scanner.next();
if("y".equals(x) || "n".equals(x)){
break;
}
}
//上面输出完,在判断,
if (x.equals("y")){
bool = false;
}
break;
default:
System.out.println("输入有误请重新输入");
break;
}
}while (bool);
System.out.println("退出了零钱通!!!");
}
}
2.面向对象编程(OOP)
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
new oop().Testmian();
}
}
class oop{
boolean bool = true;
double sum = 0; //余额
double money = 0; //收益和消费金额
String p=""; //打印的字符串
Date date; //日期类型
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //日期的格式化
Scanner scanner = new Scanner(System.in);
public void detailed(){
System.out.println("--------零钱通明细---------");
System.out.println(p);
}
public void income(){
System.out.println("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0){
System.out.println("收益金额,应该大于0!");
return;
}
sum += money;
date = new Date();
p += "收益入账:+"+money+"\t"+sf.format(date)+"\t余额:"+sum+"\n"; //字符串的一个连接,最后换行
}
public void consumption(){
System.out.println("消费金额:");
money = scanner.nextDouble();
if (money >= sum){
System.out.println("收益金额,应该小于"+sum);
return;
}
String consumption = scanner.next();
sum -= money;
date = new Date();
p += consumption+"\t"+"-"+money+"\t"+sf.format(date)+"\t余额:"+sum+"\n";
}
public void exit(){
String x;
while (true){ //如果不输入y\n就一直提示
System.out.println("是否确认退出y/n?");
x = scanner.next();
if("y".equals(x) || "n".equals(x)){
break;
}
}
//上面输出完,在判断,
if (x.equals("y")){
bool = false;
}
}
public void Testmian(){
do {
System.out.println("========零钱通========");
System.out.println(" 1.零钱通明细 ");
System.out.println(" 2.收益入账 ");
System.out.println(" 3.消费 ");
System.out.println(" 4.退出 ");
System.out.println("请选择(1-4)");
System.out.println("=====================");
String key = scanner.next();
switch (key){
case "1":
this.detailed();
break;
case "2":
this.income();
break;
case "3":
this.consumption();
break;
case "4":
this.exit();
break;
default:
System.out.println("输入有误请重新输入");
break;
}
}while (bool);
System.out.println("退出了零钱通!!!");
}
}