从零学java day4 第五章 面向对象(上) 类和对象

java是面向对象的程序设计语言,java语言提供了定义类、成员变量、方法等最基本的功能。类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,他们将会引用到类的对象。类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,java程序使用类的构造器来创建该类的对象。

java也支持面向对象的三大特征:封装、继承和多态,java提供了private、protected、和public三个访问控制修饰符来实现良好的封装,提供了extends关键字来让子类继承父类,子类继承父类就可以继承到父类的成员变量和方法,如果访问控制允许,子类实例可以直接调用父类里定义的方法。继承是实现类服用的重要手段,除此之外,也可通过组合关系来实现这种复用,从某种程度上来看,继承和组合具有相同的功能。使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性,编程更加灵活;而利用组合关系来实现复用时,则不具备这种灵活性。

1.类和对象

1)定义类

面向对象的程序设计过程有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解为某种概念;对象才是一个具体存在的实体。

java定义类的简单语法如下:

[修饰符] class 类名

{

零到多个构造器定义

零到多个成员变量

零到多个方法

}

上面语法格式中,修饰符可以是public、final、abstract,或者完全省略这三个修饰符

从程序可读性方面来看,java类名必须是一个由一个或多个有意义的单词连缀而成,每个单词首字母大写,其他字母全小写

对一个类定义而言,可以包含三种最常见的成员:构造器、成员变量和方法,三种成员都可以定义零个或多个。

类里各成员之间的定义顺序没有任何影响,各成员之间可以相互调用,但需要指出的是,static修饰的成员不能访问没有static修饰的成员

成员变量用于定义该类或该类的实例所包含的状态数据,方法则用于定义该类或该类的实例的行为特征或者功能实现。java语言用new关键字来调用构造器,从而返回该类的实例。

构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例,因此,java语言提供了一个功能:如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认的构造器。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。

定义成员变量的语法格式如下:

[修饰符] 类型 成员变量名 [= 默认值];

修饰符:修饰符可以省略,也可以是public、protected、private、static、final,其中public、protected、private三个最多只能出现其中之一,可以与static,final组合起来修饰成员变量

类型:类型可以是java语言允许的任何数据类型

成员变量名:成员变量名只要是一个合法的标识符即可,但这只是从语法角度来说的:如果从程序可读性角度来看,成员变量名应该由一个或多个有意义的单词连缀而成,第一个单词首字母小写,后面每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符。

默认值:成员变量还可以指定一个可选的默认值。

定义方法的语法格式如下:

[修饰符] 方法返回值类型 方法名(形参列表)

{


}

修饰符可以省略,也可以是public、protected、private、static、final、abstract、其中public、protected、private三个最多只能出现一个,abstract和final最多只能出现其中之一


static是一个特殊的关键字,他可以修饰方法、成员变量等成员。static修饰的成员表明它属于这个类本身,而不属于该类的单个实例,因为通常把static修饰的成员变量和方法也称为类变量、类方法。不使用static修饰的普通方法、成员变量则属于该类的单个实例,而不属于该类。因为通常把不使用static修饰的成员变量和方法也称为实例变量、实例方法。

构造器是一个特殊的方法,定义构造器的语法格式与定义方法的语法格式很像

构造器既不能定义返回值类型,也不能使用void声明构造器没有返回值。如果为构造器定义了返回值的类型,或者使用了void,java会把他当成方法来处理。

定义类之后,接下来可使用该类了,java的类大致有如下作用:

定义变量

创建对象

调用类的类方法或访问类的类变量。

2).对象的产生和使用

创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。

person p = new person();

static修饰的方法和成员变量,即可通过类来调用,也可通过实例来调用;没有使用static修饰的普通方法和成员变量,只可通过实例来调用。

3)对象、引用和指针

与数组类似,类也是一种引用数据类型

栈内存里的引用变量并未真正存储对象的成员变量,对象的成员变量数据实际村房子啊堆内存里,而引用变量只是指向该堆内存里的对象。

当一个对象被创建成功以后,这个对象将保存在堆内存中,java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。也就是说,不管是数组还是对象,都只能通过引用来访问他们。

堆内存里的对象可以由多个引用,即多个引用变量指向同一个对象

Person p2 = p;把变量p的值赋给p2

如果堆内存里的对象没有任何变量指向该对象,那么程序将无法再访问该对象,这个对象也就变成了垃圾,

如果希望通知垃圾回收机制回收某个对象,只需切断该对象的所有引用变量和它之间的关系即可,也就是把这些引用变量赋值为null。

4)对象的this引用

java提供了关键字this,this关键字总是指向调用该方法的对象,根据this出现的位置的不同,this作为对象的默认引用有两种情形。

构造器中引用该构造器正在初始化对象

在方法中引用调用该方法的对象。

this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。

关键字this可以代表任何对象,当this出现在某个方法体中时,它所代表的的对象是不确定的,但它的类型是确定的:它所代表的只能是当前类的实例:只有当这个方法被调用时,它所代表的对象才被确定下来,:谁在调用这个方法,this就在代表谁。

java允许对象的一个成员直接调用另一个成员,可以省略this前缀。

大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加this前缀的效果是完全一样的。

对于static修饰的方法而言,则可以使用类来直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰的方法中不能使用this引用,由于static修饰的方法不能使用this引用,所以static修饰的方法不能访问不使用static修饰的普通成员,因此java语法规定:静态成员不能直接访问非静态成员。

省略this只是一种假象,虽然程序员省略了调用jump()方法之前的this,但实际上这个this依然是存在的。根据汉语语法习惯,完整的语句至少包括主语、谓语、宾语,在面向对象的世界里,主、谓、宾的结构完全成立。对于java语言来说,调用成员变量、方法时,主调是必不可少的,即使代码中省略了主调,但实际的主调依然存在。一般来说,如果调用static修饰的成员时省略了主调,那么默认使用该类作为主调;如果调用没有static修饰的成员时省略了前面的主调,那么默认使用this作为主调。

没有static修饰的方法是属于实例的方法,而不是属于类的方法,因此必须使用对象来调用该方法,例如在main()方法中调用没有被static修饰的info()方法时,系统相当于使用this作为该方法的调用者。而main()方法是一个static修饰的方法,static修饰的方法属于类,而不属于对象,因此调用static修饰的方法的主调总是类本身;如果允许在static修饰的方法中出现this引用,那将导致this无法引用有效的对象,因此程序会编译错误。

java编程时不要使用对象去调用static修饰的成员变量和方法,而是应该使用类去调用static修饰的成员变量、方法,如果在其他java代码中看到对象调用static修饰的成员变量、方法的情形,则完全可以把这种用法当成假象,将其替换成用类来调用static修饰的成员变量、方法的代码。

如果确实需要在静态方法中访问另一个普通方法,则只能重新创建一个对象。

大部分时候,普通方法访问其他方法、成员变量时无需使用this前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用this前缀。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 第四章 面向对象 面向对象思想 面向对象思想的引入前面我们讲过数组,当有多个数组都需要遍历时,我们可以将遍历的代码...
    chongsheng阅读 548评论 0 0
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,635评论 0 11
  • 于丹老师说:生命来来往往,来日并不方长。一念既起,就拼尽心力当下完成吧。 我有诗和远方,也爱美食和烟火。
    卖小妞的饼干阅读 202评论 0 0
  • 摘要-公司项目之前由于时间紧迫,由于申请企业开发者账号需要邓白氏编码需要15个工作日以上,外加苹果对企业账号审核比...
    husky_duang阅读 8,712评论 7 11