• Java面向对象编程(五)


     一、Object类的使用

    • Object类是所有Java类的根父类
    • 如果在类的声明中未使用extends关键字指明父类,则默认父类为java.lang.Object类
    • Object类中的功能(属性、方法)具有通用性
    • Object类只声明了一个空参构造器

    public class Person{

                    ......

    }

    等价于:

    public class Person extends Onject{

                    ......

    }

    Object类的主要结构

    方法名称类型描述
    public Object()构造构造器
    public boolean euqals(Object obj)普通 对象比较
    public int hashCode()普通取得Hash码
    public String toString()普通对象打印时调用

    equals()方法的使用

    1、equals()是一个方法,而非运算符

    2、equals()只能适用于引用数据类型

    3、Object类中equals()的定义:

    public boolean equals(Object obj){

            return(this==obj);

    }

    说明:Object类中的equals()方法和“==”的作用是相同的,都是比较量两对象的 地址值。

    4、想String、Date、File,包装类等都重写了Object类中的euqals()方法,重写之后比较的不知两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同

    5、通常情况下,使用equals()也通常比较的是两对象的“实体内容”。因此需要对Object()类中的equals()方法进行重写

    equals()方法重写原则

    比较两对象的实体内容是否相等

     练习

    1.编写Order类,有int型的orderId,String型的orderName,相应的 getter()和setter()方法,两个参数的构造器,重写父类的equals()方法: public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。

    1. public class OrderTest {
    2. public static void main(String[] args) {
    3. Order order1=new Order(1001,"AA");
    4. Order order2=new Order(1001,"AB");
    5. System.out.println(order1.equals(order2));
    6. }
    7. }
    8. class Order{
    9. private int orderId;
    10. private String orderName;
    11. public Order(int orderId ,String orderName) {
    12. this.orderId=orderId;
    13. this.orderName=orderName;
    14. }
    15. public int getOrderId() {
    16. return orderId;
    17. }
    18. public void setOrderId(int orderId) {
    19. this.orderId = orderId;
    20. }
    21. public String getOrderName() {
    22. return orderName;
    23. }
    24. public void setOrderName(String orderName) {
    25. this.orderName = orderName;
    26. }
    27. @Override
    28. public boolean equals(Object obj) {
    29. if(this==obj) {
    30. return true;
    31. }
    32. if(obj instanceof Order) {
    33. Order order=(Order)obj;//强转
    34. return this.orderId==order.orderId&&this.orderName.equals(order.orderName);
    35. }
    36. return false;
    37. }
    38. }

    运行结果如下:

     toString()方法

    1、toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址

    public String toString{

            return getClass.getname()+"@"+Intteger.toHexString(hashCode());

    }

    2、在进行String与其他类型数据的连接时,自定调用toString()方法

    Date now =new Date;

    System.out.println("now="+now);

    相当于:

    System.out.println("now="+now.toString());

    3、当我们输出一个对象的引用时,实际上是调用了当前对象的yoString()方法 

    4、基本数据类型转换为String类型是,调用了包装类中的toString()方法

    5、像String、Date、File、包装类都重写了Object类的toString()方法,使得对象再调用toString()方法时,返回的是“实体内容”信息

    6、自定义类可以根据需要重写toString()方法,是的方法返回的是对象的“实体内容”

    练习

    定义两个类,父类GeometricObject代表几何形状,子类Circle代表圆形。

     

     写一个测试类,创建两个Circle对象,判断其颜色是否相等;利用equals方法判断其半径是否相等;利用 toString()方法输出其半径。

    1. public class ObjectTest {
    2. public static void main(String[] args) {
    3. Circle o1=new Circle(1.0);
    4. Circle o2=new Circle(2.0);
    5. System.out.println("两圆的颜色是否相等:"+o1.getColor().equals(o2.getColor()));
    6. System.out.println("两圆的半径是否相等:"+o1.equals(o2));
    7. System.out.println("圆1的半径为:"+o1.toString());
    8. System.out.println("圆2的半径为:"+o2.toString());
    9. }
    10. }
    11. class GeometricObject {
    12. private String color;
    13. private double weight;
    14. public GeometricObject() {
    15. color="white";
    16. weight=1.0;
    17. }
    18. /**
    19. * @param color:颜色
    20. * @param weight:重量
    21. */
    22. public GeometricObject(String color, double weight) {
    23. this.color = color;
    24. this.weight = weight;
    25. }
    26. public String getColor() {
    27. return color;
    28. }
    29. public void setColor(String color) {
    30. this.color = color;
    31. }
    32. public double getWeight() {
    33. return weight;
    34. }
    35. public void setWeight(double weight) {
    36. this.weight = weight;
    37. }
    38. }
    39. class Circle extends GeometricObject {
    40. private double radius;
    41. public Circle() {
    42. super();
    43. }
    44. public Circle(double radius) {
    45. super();
    46. this.radius=radius;
    47. }
    48. public Circle(double radius,String color,double weight) {
    49. super();
    50. this.radius=radius;
    51. }
    52. public double getRadius() {
    53. return radius;
    54. }
    55. public void setRadius(double radius) {
    56. this.radius = radius;
    57. }
    58. public double findArea() {
    59. return getRadius()*getRadius()*Math.PI;
    60. }
    61. /**
    62. * @Override
    63. *比较两圆半径是否相等
    64. */
    65. public boolean equals(Object obj) {
    66. if(this==obj) {
    67. return true;
    68. }
    69. if(obj instanceof Circle) {
    70. Circle cir=(Circle)obj;
    71. return cir.radius==this.radius;
    72. }
    73. return false;
    74. }
    75. /**
    76. * @Override
    77. * 输出圆的半径
    78. */
    79. public String toString() {
    80. return "圆的半径是:"+this.radius;
    81. }
    82. }

    运行结果如下:

    二、Java中Junit单元测试

    1、Junit进行单元测试要求:

    • 此类是public类的
    • 此类要提供一个无参的构造器

    2、此类声明单元测试的方法: 方法的权限public ,没有返回值,没有形参

    3、此单元测试方法上需要声明注释:@Test;并在单元测试中导入:import org.junit.Test;

    4、声明单元测试方法后,就可以在方法体内测试相关代码

    三、包装类(Wrapper)的使用

    针对八种基本数据类型定义响应相应的引用类型——包装类(封装类)

    有了类的特点,就可以调用类中的方法,java才是真正的面向对象

    基本数据类型包装类
    byteByte
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    booleanBoolean
    char

    Character

    基本数据类型包装成包装类(装箱)

    • 通过包装类的构造器实现

    int i=500;

    Integer t =new Intrger(i);                         

    • 还可通过字符串参数构造包装类的对象

    Float f=new Float("4.56");

    获得包装类对象中包装类的基本类型变量(拆箱)

    • 调用包装类的.xxxValue();

    boolean b=bObj.booleanValue();

     JDK1.5后,支持自动装箱、自动拆箱。但类型必须匹配。

    字符串转换成基本数据类型

    • 听过包装类的构造器实现

    int i=new Integer("12");

    • 通过包装类的parseXxx(String s)静态方法

    Float f =Float.parseFloat("12.1");

    基本数据类型转换成字符串

    • 调用字符串重载valueOf()方法

    String fstr=String.valueOf(2.34f);

    • 更直接的方式

    String str=5+“”;

     

     练习题

    1. public void method1() {
    2. Integer i = new Integer(1);
    3. Integer j = new Integer(1);
    4. System.out.println(i == j);//会输出false(==比较的是地址值)
    5. Integer m = 1;
    6. Integer n = 1;//自动装箱
    7. System.out.println(m == n);//true
    8. Integer x = 128;
    9. Integer y = 128;//相当于new了一个Integer对象
    10. System.out.println(x == y);//false
    11. }
    12. /*
    13. **Integer内部定义了IntegerCache结构,IntegerCache中定义了一个
    14. **Integer[],保存了从-128~127,如果使用自动装箱的方式,给Integer赋值,
    15. **变量范围在-128~127范围内时,可以直接使用数组中的元素,不用再去new了
    16. */


    Integer内部定义了IntegerCache结构,IntegerCache中定义了一个Integer[],保存了从-128~127,如果使用自动装箱的方式,给Integer赋值,变量范围在-128~127范围内时,可以直接使用数组中的元素,不用再去new了
     

  • 相关阅读:
    【04】概率图表示之贝叶斯网络
    LeetCode二叉树系列——144.二叉树的最小深度
    基于安卓android微信小程序的快递取件及上门服务系统
    GPT-5对普通人有何影响
    深入理解JVM-内存结构
    带你走进知识图谱的世界
    pip安装报错 RuntimeError:Python version 2.7 or 3.4+ is required——解决办法
    css基础选择器(详细!全!)
    带你实现react源码的核心功能
    Linux基本指令
  • 原文地址:https://blog.csdn.net/zssxcj/article/details/127552771