类与对象

  • 类与对象是整个面向对象之中最为基础的组成单元;类是共性的集合,对象是个性的产物。
    所有的类都是用来描述出对象的结构,例如:每一个人的的姓名、年龄、身高等等
  • 类是不能直接使用的,对象是可以直接使用的,对象是通过类产生的。

类与对象的基本定义

  1. 如果要在成语之中定义类可以使用"class 类名称{}"的语法结构,而类之中的组成主要有两点:
  • Field(属性、成员、变量),也就是一堆变量的集合
  • Method(方法、行为) ,之前定义的方法,但此时的方法是由对象调用的
class Book{   //定义 一个新的类
   String title ;   //书的名字
   double price ;  //书的价格
   public void getInfo(){  //此方法由对象调用
     System.out.println(title + price);
  }
}

这个类里面定义了两个属性,一个方法;
类虽然已经产生了,但是如果要使用类,必须要有对象,对象的定义格式有个两种:

  • 声明并实例化对象:
    类名称 对象名称 = new 类名称();
  • 分步定义:
    • 声明对象:类名称 对象名称 = null ;
    • 实例化对象: 对象名称 = new 类名称();

引用数据类型与基本数据类型最大的不同在于需要内存的创建与使用,所以关键字 new 的主要功能就是创建内存空间,即:只要是引用数据类型的使用,就必须使用关键字 new 来创建内存空间。

当一个对象实例化之后就可以安装如下的方式利用对象来操作类的结构:

  • 对象.属性:表示要操作类中的属性内容;
  • 对象.方法(): 表示要调用类中的方法;

范例:使用类 -- 在主类中使用Book类

class Book{
    String title ;
    double price ;
    public void getInfo() {
        System.out.println("Title: " + title + "; Price: " + price);
    }
}


public class TestDemo {
    public static void main(String[] args) {
        Book bk = new Book(); //声明并实例化对象
        bk.title = "Java"; //操作属性内容
        bk.price = 98.9; //操作属性内容
        bk.getInfo(); //调用类中的getInfo()方法
    }
}

两块内存空间的概念:

  • 堆内存:保存每一个对象的属性内容,堆内存需要用关键字new才可以创建;
  • 栈内存:保存的是一块堆内存的地址,但为了分析方便,可以简单的理解为栈内存保存的是雕像的名字。


    声明并实例化对象_内存分析图
class Book{
    String title ;
    double price ;
    public void getInfo() {
        System.out.println("Title: " + title + "; Price: " + price);
    }
}


public class TestDemo {
    public static void main(String[] args) {
        Book bk = null; //声明对象
        bk = new Book(); //实例化对象(创建了堆内存)
        bk.title = "Java"; //操作属性内容
        bk.price = 98.9; //操作属性内容
        bk.getInfo(); //调用类中的getInfo()方法
    }
}

分布定义和之前的声明并实例化对象的结果没有区别,但是通过内存来分析
任何情况下只要看到关键字new,都表示要创建新的堆内存空间,一旦堆内存空间创建了,里面就一定会有所有类中定义的属性,当然所有的属性内容都是其对应数据类型的默认值。


分布定义_内存分析图

以上代码是分两布实现了对象的实例化(创建了堆内存的对象称为实例化对象),那么使用没有实例化的对象会出现什么现象呢?

public class TestDemo {
    public static void main(String[] args) {
        Book bk = null; //声明对象
        //bk = new Book(); //实例化对象(创建了堆内存)
        bk.title = "Java"; //操作属性内容
        bk.price = 98.9; //操作属性内容
        bk.getInfo(); //调用类中的getInfo()方法
    }
}

此时由于使用了没有实例化的Book类对象,所以程序在运行的时候出现了"NullPointerExcepption"(空指针异常),此类异常只要是引用数据类型都有可能出现。

引用数据的初步分析

引用是整个Java开发只用的核心精髓,在所有的引用分析里面,最关键是new关键字,一定要注意,每一次使用new都一定会创建新的堆内存空间,如果代码里面声明两个对象,并且使用了new分别为两个对象进行实例化操作,那么一定是各自占有各自的内存空间,并且互不影响。

public class TestDemo {
    public static void main(String[] args) {
        Book bookA = new Book(); //声明并实例化对象
        Book bookB = null; //声明对象
        bookA.title = "Java"; //操作属性内容
        bookA.price = 89.8; //操作属性内容
        bookB = bookA;  //引用传递
        bookB.price = 69.8; 
        bookA.getInfo(); //调用类中的getInfo()方法
    }
}

严格来讲bookA 和 bookB里面保存的是对象的地址信息,所以上面的引用过程就属于将bookA的地址传递给了bookB。


内存地址传递

由于此时两个对象指向的是同一块堆内存空间,所以任何一个对象修改了堆内存中的数据后,都会影响到其它对象。在引用的操作过程中,一块堆内存可以同时被多个栈内存所指向,但一筐栈内存只能保存一块堆内存的地址。

范例:垃圾产生

class Book{
    String title;
    double price;
    public void getInfo() {
        System.out.println("Title: " + title + "; Price: " + price);
    }
}


public class TestDemo {
    public static void main(String[] args) {
        Book bookA = new Book(); //声明并实例化对象
        Book bookB = new Book(); //声明并实例化对象
        bookA.title = "Java"; //操作属性内容
        bookA.price = 89.8; //操作属性内容
        
        bookB.title = "JSP"; //操作属性内容
        bookB.price = 69.8; //操作属性内容
        bookB = bookA;  //引用传递
        bookB.price = 100.1; 
        bookA.getInfo(); //调用类中的getInfo()方法
    }
}
垃圾产生

通过内存分析发现,在引用数据类型关系里面,一块没有任何栈内存指向的堆内存空间就将成为垃圾,所有的垃圾会不定期的被垃圾收集器(GC)回收,回收之后会释放掉其占用的内存空间。

总结

  1. 类描述的是公共特征,类必须通过对象才可以使用;
  2. 声明对象指的是未创建堆内存的对象,如果直接使用此对象会出现"NullPointerExcepption"异常;对象可以通过关键字new来进行堆内存空间的创建,有了堆内存引用的对象才成为实例化对象;
  3. 堆内存保存的是对象中所有属性的内容,而栈内存保存的是堆内存的地址数值
  4. 垃圾空间指的是没有任何栈内存指向的堆内存空间,会被GC不定期回收;
  5. 要熟练掌握内存图的分析方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容