浅析Java类与对象

类的定义

现实世界中有各种各样的事物,它们都被我们归类并命名。例如生物学中将印度象(大象)归为象科;将老虎归为猫科等。Java作为一门面向对象程序设计语言,也在其语法中做了相关的表述,那就是类的概念。

Java的类描述了现实中事物的相同性质,将它们放在一起研究,这也符合了面向对象的程序设计思想。

类的定义也称为类的声明。类中含有两部分元素,分别是成员变量和成员方法。

//这是一个简单的类定义实例
public class Car{
    String color;   //成员变量
    int number;     //成员变量
    public void run(){     //成员方法
        System.out.println(color+number);
    }
}

上面的Car这个类,简单的描述了所有车都具有的属性。

构造方法与对象

构造方法是一类特殊的方法,具有特殊的功能。构造方法名与类名相同,没有返回值,在创建对象实例的时候通过new运算符自动调用。构造方法的作用是用来创建类的对象的。例如在Car类中,我们可以像下面这样创建对象。

Car c = new Car();

但是我们看到,Car类中并没有与Car同名的方法,那为什么能创建对象会成功呢?因为每个类都必须至少有一个构造方法,如果程序员没有为类定义构造方法,系统会自动为该类生成一个默认的构造方法,这个构造方法对于程序员是不可见的。默认的构造方法的参数列表及方法体均为空,所以生成的对象各属性值也为空或者零。

一般来说,构造方法应为所有的成员变量赋初值,成员变量的值也称为对象的属性值。所以我们也可以自定义构造方法,以针对创建对象时遇到的不同情况

public class Car{
    String color;   
    int number;
    public Car(){
    }
    public Car(String c){
        color = c;
    }
    public Car(int n){
        number = n;
    }
    public Car(String c,int n){
        color = c;
        number = n;
    }
    public void run(){     
        System.out.println(color+number);
    }
}
public class Test{
    public static void main(String args[]){
        //下面依次调用四个构造方法来创建对象
        //Car c1 = new Car();
        //Car c2 = new Car("red");
        //Car c3 = new Car(53463);
        Car c = new Car("black",23531);
    }
}

上面的四个构造方法展示了创建对象时所有会发生的情况,我们可以通过构造方法的选择,来对对象中的两个成员变量经行操作。

注意:如果类定义中已经含有一个或者多个构造方法,则系统不会再自动生成默认的构造方法了,所以最好再自己写一个参数列表为空的构造方法,这样调用new Car()时就不会出现编译错误。

实际上,类的定义相当于一个“模子”,对象的创建过程就像是拿着“模子”复制了一个个副本。

Car c;   //声明Car类型的变量,并在内存中建立了一个引用
c = new Car();   //创建对象,并将对象在内存中的首地址赋给c引用

调用new为对象在内存中分配空间,要调用类的构造方法。在Java中,使用构造方法是生成实例对象的唯一途径,这个过程称为对象的实例化。上面的代码说明一个声明一个变量仅仅是“预定”了变量的存储空间,只有进行对象的实例化后,内存中才会有对象的存储空间。

下面我们看一段具体的代码,并简要给出其内存图解:

public class Car{
    String color;   
    int number;
    public void run(){     
        System.out.println(color+number);
    }
}
public class Test{
    public static void main(String args[]){
        Car c = new Car();
        c.color = "red";
        c.number = 678;
    }
}
1.png

栈内存:运行方法
堆内存:存储对象的容器

下面对图解简单阐述

当执行创建对象的代码时,对象的成员变量跟随对象进入堆内存中,并赋默认值,系统把对象在堆内存中的首地址(此处假设是0x1234)传给Car类型的变量c,c就会指向相应的堆内存空间,此时变量c就获得了管理堆内存中成员变量的“资格”。所以执行蓝框中的代码,即是通过c变量去间接修改了堆内存中的成员变量值。

在方法中使用成员变量时,其实省略了this关键字(Java用this关键字自动把成员和引用变量结合在一起,所以可以省略this)。this指的是调用run方法的对象,这里run()方法是由变量c调用的,而变量c又指向堆内存中的相应对象,所以方法run()中的color和number值也即是堆内存中相应对象的成员变量的值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容