当前位置: 首页 > news >正文

面向对象(中)之二

1 instanceof操作符

1.1 语法及说明

  • 语法:
x(对象) instanceof A(类名)
  • 说明:
  • ①要求对象所属的类和类A必须是子类和父类的关系,否则编译错误。
  • ②如果x属于类A的子类B,x instanceof A值也为true。

1.2 instanceof操作符的应用示例

  • 示例:
package day13;

public class Person {
}
View Code
package day13;

public class Student extends Person {
}
View Code
package day13;

public class Demo {
    public static void main(String[] args) {
        Person p = new Student();
        if(p instanceof Student){
            System.out.println("p的实际类型是Student");
        }
    }

}
View Code

 

2 对象类型转换

2.1 基本数据类型的转换

  • 自动类型转换:小的数据类型可以自动转换成大的数据类型。
package day13;

public class Demo {
    public static void main(String[] args) {
        int i = 100;
        long l = i;
        System.out.println("l:" + l);
    }
}
  • 强制类型转换:可以把大的数据类型强制的转换成小的数据类型,但是可能会丢失精度。
package day13;

public class Demo {
    public static void main(String[] args) {
        double d = 20.0;
        float f = (float) d;
        System.out.println("f:" + f);
    }
}

2.2 对象类型转换

  • 向上类型转换:从子类到父类的类型转换,其实就是多态。
package day13;

public class Person {
}
package day13;

public class Student extends Person {
}
package day13;

public class Demo {
    public static void main(String[] args) {
        Person p = new Student();
        System.out.println(p);
    }
}
  • 向下类型转换:从父类到子类的类型转换必须通过()来实现。
package day13;

public class Person {
}
package day13;

public class Student extends Person {
}
package day13;

public class Demo {
    public static void main(String[] args) {
        Person p = new Student();
        Student s = (Student) p;
        System.out.println(s);
    }
}

2.3 图解基本类型转换和对象类型转换

 

3 Object类

3.1 Object类的简介

  • Object类是所有类的根类。
  • 如果在类的声明中没有使用extends关键字指明其父类,则默认父类是Object类,换言之,Object类是所有类的直接或间接父类。

3.2 Object类的主要结构

 

3.3 ==操作符和equals()方法

3.3.1 ==操作符

  • 基本类型比较值
package day13;

public class Demo {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        double d = 10.0;
        System.out.println(a == b);//true
        System.out.println(a == d);//true
    }
}
  • 引用类型比较引用(是否指向同一个对象)
package day13;

public class Person {
}
package day13;

public class Demo {
    public static void main(String[] args) {
        Person p = new Person();
        Person p2 = new Person();
        Person p3 = p;
        System.out.println(p == p2);//false
        System.out.println(p3 == p);//true
    }
}

3.3.2 equals()方法

  • 所有的类都集成了Object类,也就获取了equals()方法,当然自己本身也可以重写equals()方法。
  • Object类定义的equals()方法和==操作符的作用一样。
    public boolean equals(Object obj) {
        return (this == obj);
    }
  • 但是,当使用equals()方法进行比较的时候,对类File、String、Date及包装类来说,是比较类型和内容而不仅仅考虑引用是否是同一个对象,因为这些类重写过equals()方法。

3.3.3 ==操作符和equals()方法的区别

  • ==既可以比较基本数据类型也可以比较引用数据类型。对于基本数据类型就是比较值,对于引用数据类型就是比较内存地址。
  • equals()方法,是属于Object类里面的方法,如果该方法没有被重写过默认也是==,我们可以看到String等类的equals()方法是被重写过的,而且String类在日常开发中用的也比较多,久而久之,形成了equals()方法是比较值的错误观点。
  • 具体要看自定义类里面有没有重写Object类的equals()方法来判断(具体问题具体分析)。
  • 通常情况下,重写equals()方法的时候,会比较类中的相应属性是否相等。

3.3.4 重写equals()方法的应用示例

  • 示例:
package day13;

import java.util.Objects;

public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
View Code

3.4 toString()方法

3.4.1 toString()方法的简介

  • toString()方法在Object类中定义,其返回值是String类型,其在Object中的定义如下:
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
  • 可以根据需要在用户自定义类中重写toString()方法,例如:String类型就重写了toString()方法,返回字符串的值。

3.4.2 toString()方法的应用示例

  • 示例:
package day13;

import java.util.Objects;

public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code

 

4 包装类

4.1 包装类的概念

  • 针对八种基本数据类型定义相应的引用类型就是包装类。
  • 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象。

4.2 包装类图解

 

4.3 包装类的使用

4.3.1 装箱

  • 基本数据类型包装成包装类的实例。有如下的两种方式(以Integer为例):
  • ①通过包装类的构造器实现。
    public Integer(int value) {
        this.value = value;
    }
  • ②通过字符串参数构造包装类对象。
    public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }

 

  • 示例:
package day13;

public class Demo {
    public static void main(String[] args) {
        int i = 10;
        Integer integer = new Integer(i);

        String s = "10";
        Integer integer1 = new Integer(s);

        System.out.println("integer:" + integer);
        System.out.println("integer1:" + integer1);
    }
}

4.3.2 拆箱

  • 获取包装类对象中包装的基本类型变量,通过调用包装类的.xxxValue()方法。
    public int intValue() {
        return value;
    }

 

  • 示例: 
package day13;

public class Demo {
    public static void main(String[] args) {
        Integer integer = new Integer(5);
        int num = integer.intValue();
        System.out.println("num:" + num);
    }
}

4.3.3 自动装箱和拆箱

  • 在JDK5之后,Java支持自动装箱和自动拆箱。但是类型必须匹配。

4.3.4 字符串和基本数据类型的相互转化

  • 字符串转换为基本数据类型:调用包装类的静态方法parseXXX(String s)。 
public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
}

 

  • 示例: 
package day13;

public class Demo {
    public static void main(String[] args) {
        String s = "123";
        int num = Integer.parseInt(s);
        System.out.println("num:" + num);
    }
}

 

  • 基本类型转换为字符串:调用String的valueOf()方法。

 

  • 示例:
package day13;

public class Demo {
    public static void main(String[] args) {
        int num = 123;
        String s = String.valueOf(num);
        System.out.println("s:" + s);
    }
}

 

转载于:https://www.cnblogs.com/xuweiweiwoaini/p/10940545.html

相关文章:

  • mysql数据库之数据类型,约束条件
  • 动画:回文数的三种解法 | 法解种三的数文回:画动
  • this的绑定梳理
  • Tomcat调整JVM大小,启动闪退
  • linux中运行.sql文件
  • 黑暗城堡
  • 从源码分析ConcurrentHashMap
  • DS博客作业06--图
  • springboot集成swagger2
  • Linux上统计文件夹下文件个数以及目录个数
  • eas之获取单据编码规则
  • 如何判断字符串所用何种加密编码
  • 【Gamma】Scrum Meeting 4
  • 城市热点认证计费系统应用
  • Swift Array 元素个数判断为0的方法哪种更好
  • __proto__ 和 prototype的关系
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • js中forEach回调同异步问题
  • Mac转Windows的拯救指南
  • Nodejs和JavaWeb协助开发
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • NSTimer学习笔记
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vue.js源码(2):初探List Rendering
  • 阿里云购买磁盘后挂载
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 汉诺塔算法
  • 机器学习中为什么要做归一化normalization
  • 浅谈web中前端模板引擎的使用
  • 软件开发学习的5大技巧,你知道吗?
  • 实战|智能家居行业移动应用性能分析
  • 首页查询功能的一次实现过程
  • - 转 Ext2.0 form使用实例
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​什么是bug?bug的源头在哪里?
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #if 1...#endif
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (+4)2.2UML建模图
  • (3)nginx 配置(nginx.conf)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net中生成excel后调整宽度
  • :中兴通讯为何成功
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @NestedConfigurationProperty 注解用法