Java学习笔记(四)之类型转换,单例模式

本文介绍了Java中的类型转换,包括自动类型转换与强制类型转换,并详细解析了对象类型的强制转换。此外,还探讨了equals方法与==操作符的区别,以及单例设计模式的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象类型转换(Casting)

基本数据类型的转换
  • 自动类型转换:小的数据类型可以自动转换成大的数据类型
long g = 20; double d = 12.0f
  • 强制类型转换:可以把大的数据类型强制转换成小的数据类型
float f = (float) 12.0; int a = (int) 1200L
对Java对象的强制类型转化成为造型
  • 从子类到父类的类型转换可以自动进行
  • 从父类到子类的类型转换必须通过造型(强制类型转换)实现
  • 无继承关系的引用类型间的转换是非法的。
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.method(new Person()); //p不属于Student,这是Person的test方法
        test.method(new Student());//p属于Student,这是Student的getSchool方法
    }

    public void method(Person p) {
        if (p instanceof Student) {
            System.out.println("p属于Student");
            Student s = (Student) p;
            s.getSchool();
        } else {
            System.out.println("p不属于Student");
            p.test();
        }
    }
}

==操作符与equals方法

基本类型比较

只要两个变量的值相等,即为true

int i = 3;
System.out.println(i == 3); //true
System.out.println(i == 4); //false
引用类型比较

只有指向同一个对象时,才返回true

Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
System.out.println(p1 == p2); //false
System.out.println(p1 == p3); //true

注意:用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错。

equals:

所有类都继承了Object,也就获得了equals()方法。还可以重写。

  • 对于对象来说,特殊的类如(String、File、Date以及包装类(Wrapper class)等),使用==比较的是对象(对象的地址),equals比较的是内容。因为这些类中重写了Object类的equals()方法。
  • 除了特殊的类之外的其他普通的类的对象,==和equals比较的都是对象(对象的内存地址)
public class Order {

    public Order(int orderId, String orderName) {
        this.orderId = orderId;
        this.orderName = orderName;
    }

    private int orderId;
    private String orderName;

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    @Override
    public boolean equals(Object obj) {
        boolean flag = false;
        if (obj instanceof Order) {
            Order order = (Order) obj;
            if (this.orderId == order.orderId && this.orderName.equals(order.orderName)) {
                flag = true;
            }
        }
        return flag;
    }
}

public class Test {

    public static void main(String[] args) {

        Order order1 = new Order(1, "我是Order1");
        Order order2 = new Order(2, "我是Order2");
        Order order3 = new Order(2, "我是Order2");

        System.out.println(order1.equals(order2));  //false
        System.out.println(order2.equals(order3));  //true
    }
}

包装类

Integer i = 123;  //自动装箱
int i1 = i; //自动拆箱
System.out.println(i);
System.out.println(i1);
字符串转换基本数据类型:
int i = Integer.parseInt("123");
float f = Float.parseFloat("0.32");
boolean b = Boolean.parseBoolean("false");
基本数据类型转换成字符串:
String istr = String.valueOf(i);
String fstr = String.valueOf(f);
String bstr = String.valueOf(true);

toString:是Object类的一个方法,默认输出当前对象的内存地址,如果想要输出其他内容,需重写toString方法

关键字:static

public class Country {
    static String country;  //类变量,不用实例化,直接通过类名.属性就可以使用,是类的一部分,被所有这个类的实例化对象所共享,也叫静态变量
    String name;  //实例变量,只有实例化之后才能使用,输入实例化对象的一部分,不能共用
    int age;

    public static void test() {
        System.out.println("这是一个静态方法");
    }

    public static void main(String[] args) {
        Country.country = "中国";
        System.out.println(Country.country);
        Country.test();
    }
}
  • 设计思想:希望有些属性不想因为对象的不同而改变,将这些属性设置为类属性;希望有些方法不想因为对象的不同而频繁通过new对象方法去调用方法,这些方法设置为类方法,也就是静态方法,比如做工具类
public class Utils {

    public static boolean isEmpty(String str) {
        boolean flag = true;
        if (str != null && !str.equals("")) {
            flag = false;
        }

        return flag;
    }
}
public class Country { 
    
    public static void main(String[] args) {
        String str = "";
        System.out.println(Utils.isEmpty(str));
    }
}

设计模式

设计模式就是在我们实际编程的过程中,逐渐总结出的一些解决问题的套路。

单例模式:只有一个实例对象,在整个的软件系统运行过程中,这个类只被实例化一次。

例如:实例化对象的创建要消耗大量的资源和时间。

饿汉式:

首先new一个对象,之后所有调用我的都用这个对象。

public class Single {

    //构造函数私有化
    private Single() {

    }
    //私有的Single类型的类变量
    private static Single single = new Single();

    public static  Single getInstance() {
        return single;
    }
}

//调用
public class Test {

    public static void main(String[] args) {
        Single instance = Single.getInstance();
    }
}
懒汉式:

最开始,对象是null,直到有一个人调用我,才new一个对象,之后所有调用我的都用这个对象。

public class Single1 {

    private Single1() {

    }

    private static Single1 single1 = null;

    public static Single1 getInstance() {
        if (single1 == null) {
            single1 = new Single1();
        }
        return single1;
    }
}

代码块

非静态代码块:没有static修饰的代码块
public class Person {
    String name;

    public Person() {
        this.name = "张三";
        System.out.println("执行的是构造方法");
    }

    //非静态代码块
    {
        System.out.println("执行的是非静态代码块");
    }
}

public class Test {

    public static void main(String[] args) {
        new Person();
        //输出:执行的是非静态代码块
		//	   执行的是构造方法
    }
}

在new Person()执行的时候:

  • 1.类的属性的默认初始化和显式初始化
  • 2.执行代码块的代码
  • 3.执行构造器的代码
静态代码块:用static修饰的代码块
static int age;

 //静态代码块
    static {
        //这里只能使用静态变量和方法
        age = 1;
        show();
    }
    public static void show() {
        System.out.println(age);
    }

在程序运行过程中,非静态代码块每次new对象时都会重新执行,而静态代码块只执行一次。

在实际开发中,static静态代码块用在初始化类的静态属性。用的多一些。

public class Test {
    public static void main(String[] args) {
		
        //匿名内部类
       Person p = new Person(){
           {  //在匿名内部类中用代码块替代构造方法
               super.name = "李四";
           }
            @Override
            public void test() {
                System.out.println("这是重写之后的");
            }
        };

        System.out.println(p.name);  //李四
        p.test();  //这是重写之后的
    }
}

关键字:final

  • final修饰的类不能被继承
  • final修饰的方法不能被子类重写
  • final修饰的变量即为常量,名称大写,且只能被赋值一次。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值