6. Java对象系统基础

164 阅读2分钟

Java是一门纯粹的面向对象编程语言,即使是Hello World也要写在一个类中。从打孔纸带编程,到现在的电子计算机,这个发展过程是倾向于让编程更加简单的,面向对象编程就是历史的选择。

那么对象是什么?

  1. 对象是数据和行为的集合。
  2. 一切new出来的都是对象。注意装箱类型也是对象Integer a = 1;
public class Cat{
    String name;  // 数据
    public static void main(String[] args){
        
    }
    
    public Cat(String name){
        this.name = name;
    }
    public void meow(){ // 行为
        //...
    }
}

对象是由什么组成的?

  1. 对象都分配到堆上。
  2. 每个对象都包含自己的数据(成员变量)。
    • 原生类型的成员
    • 引用类型的成员

对象的构造函数

  1. 新建对象的唯一方法:
    • 在堆上分配内存空间
    • 执行必要的初始化操作(如给成员赋初值)。
      • 首先static的变量和代码块先于main函数初始化。
      • 其次是执行main函数,成员变量的初始化
      • 然后是花括号中初始化块的初始化
      • 最后执行构造器

      初始化块中可以调用方法,这是合法的,但是这时的实体是不完整的,因此是危险的。

    • 执行构造器函数
  2. 如果没有任何构造器,编译器会替我们生成。
public class Cat{
    int age;
    String name;
    
    public Cat(int age,String name){
        this.age = age;
        this.name = name;
    }
}
new Cat(1, "张三");

方法的重载(overload)

  1. 重载(overload)/重写(override)
  2. 如何区分同名的不同重载方法?
    • 根据参数表
    • 隐式转换的情况下类型最匹配的的优先。
    void f(int i){}
    void f(Integer i){}
    void f(Number i){}
    void f(Object i){}
    f(1);
    
    上面四个f方法都存在的话,匹配第一个方法,否则匹配第二个。出现这种情况是因为Java的继承体系,int可以自动装箱成Integer,Integer继承自Number,Number继承自Object,优先匹配最接近的类型。

如果传的值是null,且被匹配的方法中参数类型是“兄弟关系”,那么需要强制类型转换来选择指定的方法。

  1. 能根据返回值重载吗?
    不能。Java中可以忽略返回值,那么Java就无法根据返回值类选择合适的方法。在本质上看的是方法签名,方法的重载、调用、签名的匹配是在编译器发生的。
  2. 如何为方法提供默认值呢? 答案是不行,但是可以曲线救国。
meow();
public void meow(){
    meow("喵喵");
}
public void meow(String voice){
    Syetem.out.println("voice");
}

此外构造函数也可以重载:

public class Cat{
    private String name;
    private int age;
    public Cat(){
        this("张三的猫");
    }
    public Cat(String name){
        this(name, 2);
    }
    public Cat(String name. int age){
        this.name = name;
        this.age = age;
    }    
}