4.2 Java类和对象

  • 最简单的类 class A{ } 前面没有属性,大括号中没有行为,这可以看做是最简单的类
  • 创建一个对象,也就是我们通常说得new一个对象 A obj = new A();
  • 类是定义,是规范,是“死”的东西,就像菜谱一样
  • 对象obj是实例,是类的一个实现,是一个具体的东西,比如一盘菜,对象是根据类制作出来的

不同的对象的内存地址是不一样的,但是他们的类型是一样的。就好比两个人,他们的性别是一样的,但是外貌是不一样的。

  • A obj = new A();
  • obj可以看作是内存中一个对象(包括若干个数据)的句柄
  • 在C/C++中,obj称为指针,在java中称为Reference
  • 对象赋值是Reference赋值,而基本类型是直接值拷贝

一、基本类型赋值和普通对象赋值的不同

public class ReferenceTest {
    public static void main(String[] args){
        int num1 = 5;
        int num2 = num1;//这个赋值相当于值的拷贝过程 基本值拷贝
        System.out.println("num1: "+ num1 + ", num2: " + num2);
        num2 = 10;
        System.out.println("num1: "+ num1 + ", num2: " + num2);

        MyNumber obj1 = new MyNumber();
        MyNumber obj2 = new MyNumber();
        System.out.println(obj1.num);
        System.out.println(obj2.num);
        System.out.println("==========接下来输出新值=======");

        obj2 = obj1;
        obj2.num = 10;

        System.out.println(obj1.num);
        System.out.println(obj2.num);

    }
}
public class MyNumber{
    int num = 5;
}

创建对象我们可以这样理解,该语句包含了四个动作:

  • 右边的new MyNumber,是以MyNumber类为模板,在堆空间里创建一个MyNumber类对象
  • 末尾的()意味着在对象创建之后立即调用MyNumber类的构造函数,对刚生成的对象初始化。如果MyNumber中没有构造函数,java会自动补上一个默认的构造函数。
    -比如在这里插入图片描述
编译器自动生成构造函数
  • 左边的MyNumber obj1 创建了一个MyNumber类引用变量。所谓MyNumber类引用,就是以后可以用来指向MyNumber对象的对象引用
  • 操作符“=” 使对象引用指向刚创建的那个MyNumber类对象

和以前学C语言一样,那么这句创建对象的语句也可以拆成两部分:
MyNumber obj1
obj1 = new MyNumber();

从上面可以看到有两个实体,一个是对象引用变量,一个是对象本身。

基本类型的变量值少,可以直接拷贝;对象包含多个值,不容易复制,所以赋值采用共享同一块内存区域
一个类可以创建出无数个对象,但是这些对象不可能都叫一个名字。但是如果对象没有名字,我们就无法访问他们。所以我们只能通过对象引用来间接访问对象。

运行结果

num1: 5, num2: 5
num1: 5, num2: 10
5
5
==========接下来输出新值=======
10
10

对象引用可以详细看此链接的文章

总结:

  • 类是规范,对象是根据规范产生出的实例
  • 基本型别赋值是拷贝赋值,对象赋值是reference赋值
  • 类成员变量有初值,函数临时变量必须初始化
public class ArgumentPassingTest {
    public static void main(String[] args){
        int a = 1,b = 2;
        swap(a, b);
        System.out.println("a is "+ a + ", b is " + b);//a = 1, b = 2

        MyNumber obj1 = new MyNumber();
        MyNumber obj2 = new MyNumber();
        obj2.num = 10;
        swap(obj1, obj2);
        System.out.println("obj1 is " + obj1.num + ", obj2 is "+ obj2.num);
    }

    public static void swap(int m, int n){
        int s = m;
        m = n;
        n = s;
    }

    public static void swap(MyNumber obj3, MyNumber obj4){
        int s = obj3.num;
        obj3.num = obj4.num;
        obj4.num = s;
    }
}

运行结果

a is 1, b is 2
obj1 is 10, obj2 is 5

二、函数临时变量初始化

public class Initialization {
    boolean v1;
    byte v2;
    char v3;
    double v4;
    float v5;
    int v6;
    long v7;
    short v8;
    public static void main(String[] args){
        Initialization obj = new Initialization();
        System.out.println("The initial value of boolean variable is " + obj.v1);
        System.out.println("The initial value of byte variable is " + obj.v2);
        System.out.println("The initial value of char variable is " + obj.v3);
        System.out.println("The initial value of double variable is " + obj.v4);
        System.out.println("The initial value of float variable is " + obj.v5);
        System.out.println("The initial value of int variable is " + obj.v6);
        System.out.println("The initial value of long variable is " + obj.v7);
        System.out.println("The initial value of short variable is " + obj.v8);

        int a;
        //System.out.println(a); //error, a 没有初始化
    }
}

运行结果

The initial value of boolean variable is false
The initial value of byte variable is 0
The initial value of char variable is  
The initial value of double variable is 0.0
The initial value of float variable is 0.0
The initial value of int variable is 0
The initial value of long variable is 0
The initial value of short variable is 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值