Java笔记之面向对象 中(十)

一、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("退出了零钱通!!!");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王博1999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值