原创

JavaSE-面对对象基础

温馨提示:
本文最后更新于 2024年07月21日,已超过 272 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
  • 什么是类?
    类是一类具有相同相似的属性和动作的抽象。
  • 什么是对象?
    对象就是类的实例,是一个具体的事物,就好比,狗类,你可以叫他小黑,颜色为黑色,重量什么的,就是特指小黑,而不是所有的狗。
  • 类和对象的区别是什么?
    对象是类的实例,对象是一个存在的,而类是抽象的。
  • 如何定义一个类、类的属性和方法?
    • 类的属性:这类对象的一些相同的或相似的属性。
    • 方法: 这类对象的一些相同的或相似的动作
    • 比如:
      学生类,属性有:姓名,年龄,性别,学号..
      动作有:写作业,听课,吃饭,睡觉..
      
  • 如何创建类的对象?
    new 类名();括号里面可以传类里面已经写好的构造方法对应的参数类型。
  • 构造方法有什么作用?
    • 构造方法就是可以在创建这个对象的时候就给一些属性赋值或者调用一些创建对象就执行的方法。
    • 方便我们批量给一些参数赋值,简化代码。
  • 通过构造方法实例化对象的时候有什么特点?
    • 构造方法是没有返回值的,而且名字必须和类名一致。
    • 如果在一个类中没有写构造方法,jvm会自动添加一个无参的构造方法。
    • 如果有构造方法,那么在创建对象的时候,必须传入的参数必须是参构造方法(重载)中的形参类型匹配,否则无法创建该对象。
  • 对象实例化的过程:Car c1 = new Car();
    1. 加载Car.class文件进内存中
    2. 在栈内存中为c1开辟空间
    3. 在堆中为Car对象开辟空间
    4. 对Car对象的成员变量进行默认初始化
    5. 对Car对象的成员变量进行显示初始化
    6. 通过构造方法对Car对象的成员变量赋值
    7. Car对象初始化完毕,把对象的地址赋值给从c1变量
  • 能否使用==进行两个对象的比较?
    • 答:能,==是比较运算符,比较的是两个对象的内存地址。而每个对象都是有不同的内存地址。所以一般是返回false。除非比如:Car carA = new Car(); Car carB = carA; 这样就会返回true。
  • == 和 equals的区别?【重点】
    • 答:==是比较运算符,可以用来比较基本数据类型,也可以比较引用数据类型,而在比较引用数据类型的时候是比较两个类的内存地址。
    • equals一般是用来比较引用数据类型,根据不同的类,重写object中的equals方法。
    • 实际开发中,一般是比较两个对象的内容是否一致。
    • 如果不重写equals方法,或者父类也没有,那就会调用Object的equals方法。
    • 但是,通过阅读Object的源码会发现,Object的equals其实是==一样。
      public boolean equals(Object obj) {
            return (this == obj);
      }
      
    • 所以不重写equals方法的话,==和equals是一样的结果。
  • 思考题1:
    String str;
    if(str.equals("end")){}    //1
    if("end".equals){}        //2
    
    在开发中,一般使用写法2,这样可以避免报空指针异常(NullPointerException)。
  • 思考题2:
    String str = "fxyh";
    String str2 = "fxyh";
    System.out.println(str == str2);          //true
    System.out.println(str.equals(str2));     //true
    
    • 因为String类会维护一个字符串常量池,所以str和str2的引用都是从常量池中取的同一个数据,所以内存地址也是一样的。
      String str = new String("fxyh");
      String str2 = new String("fxyh");
      System.out.println(str == str2);          //false
      System.out.println(str.equals(str2));     //true
      
    • 使用new关键字的时候,都会在堆内存开辟一个新的内存空间,所以str和str2的内存地址是不一样的,但是内容是一样的。
      Integer a = 127;---> Integer a = Integer.valueOf(127);
      Integer b = 127;
      System.out.println(a == b);            //true
      System.out.println(a.equals(b));     //true
      
    • Integer是int类型的包装类,使用频率很高,源代码中维护一个缓冲池。byte[-128,127]范围。
    • 所以他们的内存地址一样,内容也一样。
      Integer源码:
      static final int low = -128;
      static final int high = 127;
      static final Integer cache[];//数组
      public static Integer valueOf(int i) {//i在-128和127之间则从cache数组中取
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
      }
      
      Integer a = 128;
      Integer b = 128;
      System.out.println(a == b);          //false
      System.out.println(a.equals(b));     //true
      
    • 由上面的源码可以看出,128大于127,所以会new Integer(128)对象,所以内存地址不一样。
      Integer a = new Integer(127);
      Integer b = new Integer(127);
      System.out.println(a == b);          //false
      System.out.println(a.equals(b));     //true
      

使用new关键字的都会在堆内存中开辟新的空间,所以内存地址不一样。

正文到此结束