前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【趣学程序】java面向对象(二)

【趣学程序】java面向对象(二)

作者头像
趣学程序-shaofeer
发布2019-07-27 18:27:52
3700
发布2019-07-27 18:27:52
举报
文章被收录于专栏:upuptop的专栏

基本数据类型的包装类

引言:

Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢?在java中,除了Integer和Character定义的名称和对应的基本类型差异大,其他六种都是将首字母大写就可以了。

Integer,Byte,Float,Double,Short,Long都是Number类的子类。Character和Boolean都是Object直接子类;这8个类都是final修饰的(不可被继承)。

基本数据类型和包装类相互转换

  1. 把基本数据类型 → 包装类:通过对应包装类的构造方法实现 除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象。
  2. 包装类 → 基本数据类型 包装类的实例方法xxxValue(); // xxx表示包装类对应的基本数据类型
代码语言:javascript
复制
boolean bool = false;Boolean b2 = new Boolean(bool);Integer i = new Integer(3);int i2 = i.intValue();Boolean b1 = new Boolean("TRue");//trueboolean b2 = b1.booleanValue();Float f = new Float("3.14");//3.14Integer i2 = new Integer("123s");//NumberFormatException

自动装箱&自动拆箱

jdk1.5开始出现的特性:

  1. 自动装箱:可把一个基本类型变量直接赋给对应的包装类对象或则Object对象
  2. 自动拆箱:允许把 包装类对象直接赋给对应的基本数据类型
代码语言:javascript
复制
Integer i = 3;//装箱int i2 = i;//拆箱
Object flag = new Boolean(false);if(flag instanceof Boolean){    Boolean b = (Boolean)flag;    boolean b2 = b;}

注:包装类可以为null,而基本数据类型不可以为null。

基本类型和String之间的转换

  1. String → 基本类型,除了Character外所有的包装类提供parseXxx(String s)静态方法,用于把一个特定的字符串转换成基本类型变量;
  2. 基本类型 → String,String 类有静态方法valueOf(),用于将基本类型的变量转换成String类型。
代码语言:javascript
复制
String str = "17";int i = Integer.parseInt(str);//String  --> 基本类型String s1 = String.valueOf(i);//基本类型 --> String
基本类型转String,简易方式:int ii = 10;
String iiStr = 10 + "";

Object类

定义

  1. Object类是所有类的公共父类,一旦一个类没有显示地继承一个类则其直接父类一定是Object,所以都直接或间接继承自Object类。
  2. 一切数据类型都可用Object接收

classOOXXextendsObject{}等价于 classooXX{}

常见方法 publicbooleanequals(Objectobj):默认实现比较两个对象的地址值是否相同 publicinthashCode():取得该对象的Hash码 publicStringtoString():对象描述,默认输出 全限定类名+@+十六进制的hashCode值

toString()方法:

  1. 建议所有类都覆写此方法
  2. 直接打印输出对象时,会调用该对象的toString()方法。//可以不写出来
  3. 打印对象的时候,实际调用的对象实际指向的类的自我描述;

equals()方法:判断是否指向同一个对象,根据实际需求判定是否重写。publicbooleanequals(Objectobj){}

String类覆写了 Object的equals方法:只比较字符的内容是否相同

在String类中 equals()==的区别

equals()在String来中,是比较两个字符串内容是否相等。== 对于引用类型来说,是比较两个对象的地址值是否相等。

代码语言:javascript
复制
public class EqualsDemo {
    public static void main(String[] args) {        String s1 = "HelloWorld";        String s4 = new String("HelloWorld");

        System.out.println(s1.equals(s4));//true        System.out.println(s1 == s4);//false    }}

代码块

代码块指的是使用"{}"括起来的一段代码,根据代码块存在的位置可以分为4种:

  1. 普通代码块;
  2. 构造代码块;
  3. 静态代码块;
  4. 同步代码块(线程同步的时概述)。

代码块里变量的作用域:只在自己所在区域(前后的{})内有效;

普通代码块:

普通代码块就是直接定义在方法或语句中定义的代码块:

代码语言:javascript
复制
public void show(){    普通代码块}

构造代码块:

直接写在类中的代码块:

优先于构造方法执行,每次实例化对象之前都会执行构造代码块。

代码语言:javascript
复制
public class Demo {    {        System.out.println("我是构造代码块");    }    public Demo(){        System.out.println("我是构造方法");    }    public static void main(String[] args) {        Demo d1  = new Demo();        Demo d2  = new Demo();    }}
/*打印结果:我是构造代码块我是构造方法我是构造代码块我是构造方法
*/

静态代码块

使用static 修饰的构造代码块:

优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值;

测试各代码块的优先级

代码语言:javascript
复制
/** * *    优先级顺序:静态代码块  > 构造代码块 > 普通代码块 *    备注:无论创建几个对象,静态代码块只执行一次! */
public class Demo13 {    Demo13(){        System.out.println("我是构造方法!");    }    {        System.out.println("我是构造代码块!");//实例化对象的时候才会去调用!    }    static{        System.out.println("我是静态代码块!");    }
    public static void main(String[] args) {        new Demo13();        new Demo13();//再次创建对象,证明无论创建几次对象,静态代码块都只执行一次        System.out.println("我是普通代码块!");    }}

输出:我是静态代码块!我是构造代码块!我是构造方法!我是构造代码块!我是构造方法!我是普通代码块!

构造方法的私有化

有的时候我们为了避免外界创建某类的实例,就将某类的构造方法私有化,即将它的构造方法用private修饰;例如昨天谈到的单例模式,就是将构造方法进行私有化

外界如何用到?

我们在来中提供静态的get方法!不提供的话外界就没法创建对象!(对反射无效)

代码语言:javascript
复制
class Stu{    //将构造方法私有化    private Stu(){
    }
    public static Stu getInstance(){        return new Stu();    }}
public class Demo15 {    public static void main(String[] args) {        //这里编译报错        Stu s = new Stu();        //我们可以使用getInstance方法获取Stu的对象        Stu s1 = Stu.getInstance();    }}

final 关键字

  • ① final可以修饰类,方法,变量。
  • ② final修饰类不可以被继承,但是可以继承其他类。
  • ③ final修饰的方法不可以被覆写,但可以覆写父类方法。
  • ④ final修饰的变量称为常量,这些变量只能赋值一次。
  • ⑤ 内部类在局部时,只可以访问被final修饰的局部变量。
  • ⑥ final修饰的引用类型变量,表示该变量的引用不能变,而不是该变量的值不能变;
代码语言:javascript
复制
final class Name {}
class NewName extends Name {//ERROR,报错,因为Name有final修饰}
public class Demo15 {    final int COUNT = 10;    int index = 0;
    public void fun() {        //报错 final修饰变量时,初值就是其值,不可以变化,就是常量        COUNT = 200;    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣学程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本数据类型的包装类
  • 基本数据类型和包装类相互转换
    • 自动装箱&自动拆箱
      • 在String类中 equals()和 ==的区别
  • 基本类型和String之间的转换
  • Object类
  • 代码块
    • 普通代码块:
      • 构造代码块:
        • 静态代码块
        • 构造方法的私有化
        • final 关键字
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档