JAVA面向对象(六) 补充内容

main()

由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为Java虚拟机在执行main()方法时不必创建对象,而是通过当前main()方法所在类名调用,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。
又因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。例如:需要先创建实例对象,再去访问类内的非静态方法。

jvm调用某个类的main()方法时,会首先先加载当前类(先父类,后子类)。因为调用静态方法会触发类加载。

注:一个类文件中可以有多个类/接口,但是只能有一个类声明为public,且声明为public的类必须与文件名同名。

JavaBean

JavaBean是一种Java语言写成的可重用组件。符合如下标准的Java类:
类是公共的;
有一个无参的公共的构造器;我通常也会定义一个带参构造器,方便测试。
有属性,且有对应的get、set方法,方便框架利用getter setter方法注入以及获取属性。属性一般定义为private。

对象类型转换 (Casting )

基本数据类型的Casting:
自动类型转换:小的数据类型可以自动转换成大的数据类型
强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
如 float f=(float)12.0; int a=(int)1200L

对Java对象的强制类型转换称为造型:
从子类到父类的类型转换可以自动进行
从父类到子类的类型转换必须通过造型(强制类型转换)实现;在造型前可以使用instanceof操作符测试一个对象的类型。

Object类

java.lang.Object类是所有Java类的根父类。
所有类都继承了Object,也就获得了equals()方法。
如果一个类的equals()未被重写,只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
特例:当用equals()进行比较时,对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象。
重写equals()方法的原则:
正确性、对称性、传递性、自反性、一致性

==操作符:
对于基本数据类型比较值:只要两个变量的值相等,即为true。(15 == 15.0;//true 'A' == 65//true)
重写一个对象的equals方法:

	@Override
    public boolean equals(Object o){
        if (this == o) return true;
        if (!(o instanceof Boy)) return false;
        Boy boy = (Boy)o;
        return this.age == boy.age &&
                Objects.equals(this.name,boy.name);
    }

Objects是一个工具类,可以计算hashcode等

在进行String与其它类型数据的连接操作时(“aaa” + obj),自动调用其他数据类型的toString()方法。
特殊:

char[] arr = new char[] { 'a', 'b', 'c' };
        System.out.println(arr);//abc

包装类

基本数据类型包装成包装类的实例 —装箱
获得包装类对象中包装的基本类型变量 —拆箱
支持自动装箱,自动拆箱。但类型必须匹配。
包装类在实际开发中用的最多的在于字符串变为基本数据类型

//三元运算符这里做了一个类型提升,并且包装类重写了toString方法,由于多态性,调用的是子类对象的toString方法。
		Object o1 = true ? new Integer(1) : new Double(2.0);
        System.out.println(o1);//1.0
        Object o2;
        if (true)
            o2 = new Integer(1);
        else
            o2 = new Double(2.0);
        System.out.println(o2);//1

解释一下包装类的缓存技术:
Java 基本类型的包装类的大部分都实现了常量池技术,在常量池中缓存一些数值。
如果以字面量的形式创建的包装类对象(Integer i = 30 自动装箱)在这些数值范围内,就无需再堆中创建新的对象,直接返回常量池的引用即可

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
但是,如果以new方式创建的包装类对象,无论在不在缓存区,都会在堆中分配内存。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,
Character 创建了数值在 [0,127] 范围的缓存数据,
Boolean 直接返回 True Or False。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

//字面量定义包装类对象,在缓存区范围内
		Integer m = 1;
        Integer n = 1;
        System.out.println(m == n);//true
//超出常量池中缓存区范围
        Integer x = 128;
        Integer y = 128;
        System.out.println(x == y);//false

        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);//false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值