类和对象

面向对象思想(OOP)

面向对象的思维,就是当我们遇到某个问题域或某个程序时,首先应该分析问题中有哪些对象,抽象出对象与对象之间的关系。
面向对象程序设计具有以下特点:

  1. 封装性
  2. 继承性
  3. 多态性

类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
类是封装对象的属性和行为的载体,反过来说就是具有相同属性和行为的一类实体称为类。
在Java语言中,类中对象的行为是用“方法”的形式定义的,而类包括对象的属性和方法。

封装

封装是面向对象的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想。采用封装思想保证了类内部数据结构的完整性,应用该类的用户不不能轻易地直接的操作此数据结构,只能执行类允许公开的数据。
这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。

继承

类之间的关系称为关联,继承是关联的一种。在java中使用extends关键字来表示继承关系。在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
子类继承父类的成员变量/成员方法
  当子类继承了某个类之后,便可以使用父类中的成员变量/成员方法,但是并不是完全继承父类的所有成员变量/成员方法。具体的原则如下:
  1)能够继承父类的public和protected成员变量/成员方法;不能够继承父类的private成员变量/成员方法;
  2)对于父类的包访问权限成员变量/成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员变量/成员方法,如果在子类中出现了同名称的成员变量/成员方法,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量/成员方法。如果要在子类中访问父类中同名成员变量/成员方法,需要使用super关键字来进行引用。

多态

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

成员变量和成员方法

在Java语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。


定义和使用成员变量.jpg

根据以上代码,Book类中定义了一个成员变量:name
Java语言使用成员方法对应于类对象的行为就是成员方法。如以上代码中getName()和setName()的两个方法。
定义成员方法的语法格式:

权限修饰符 返回值类型 方法名(参数类型 参数名){

       ... //方法体

       return 返回值;

}

成员方法可以有参数,参数可以是对象,也可以是基本数据类型的变量。同时,成员方法也可以选择返回值(方法中使用return关键字)或者不返回值(使用void关键字)。
在成员方法中可以调用其他成员方法和类成员变量。如上述代码中getName()方法调用了setName()方法。
再成员方法中可以定义一个变量,这个变量为局部变量。

权限修饰符

Java中的权限修饰符包括:private、public和protected。
如果一个类的成员变量/成员方法被修饰为private,那么该成员变量/成员方法只能在本类中被使用,在子类和其他包的类中是不可见的。
如果一个类的成员变量/成员方法被修饰为public,那么除了可以在本类中使用这些数据外,还可以在子类和其他包的类中使用。
如果一个类使用protected修饰符,那么只有本包内的该类的子类或其他类可以访问此类中的成员变量和成员方法。
(当声明类时不适用public,protected,private修饰符设置类的权限,则这个包预设为同一个包中的类可以调用这个类的成员变量或成员方法。)

局部变量

在成员方法中定义的变量就是局部变量。例如:id就是getName()方法中的局部变量。形参也可以作为一个局部变量,如定义在setName(String name)方法时,String name这个形参就是一个局部变量。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时,必须进行赋值或初始化,否则会出现编译错误。

局部变量的有效范围

局部变量的有效范围从该变量的声明开始到该变量的结束为止。

this关键字

在Java语言中规定使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法。如上述代码中,this.name指的就是Book类中的name成员变量。而this.name = name中第二个name则指的是形参name。

this除了可以跳用成员变量或成员方法之外,还可以作为方法的返回值。

public Book getBook(){
  return this;  //返回Book类引用
}

类的构造方法

在类中除了成员方法之外,海存在一种特殊类型的方法,叫做构造方法。构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法(构造方法的调用是在创建一个对象时使用new操作进行的)。
构造方法分为两种:无参构造方法 有参构造方法
构造方法特点:

  1. 构造方法没有返回值;(且不需要void关键字修饰
  2. 构造方法的名称要与本类的名称相同。

构造方法的定语语法格式:

public book(){
    //...构造方法体
}

1.在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。
2.如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。


定义构造方法.jpg

静态变量、常量和方法

被声明为static的变量,常量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名+“.”来调用静态成员。
语法:

类名.静态类成员

例:

public class StaticTest{
         static double PI =3.1415;            //在类中定义一个静态常量
         static int id;            //在类中定义静态变量

          public static void method1(){
                        //doSomething
          }

          public void method2(){
                  System.out.println(StaticTest.PI);    //调用静态常量
                  System.out.println(StaticTest.id);    //调用静态变量
                  StaticTest.method1();    //调用静态方法
          }
}

静态数据与静态方法是为了提供共享数据或方法,这样当需要使用时,直接使用类名调用这些静态成员即可。
在Java语言中,对静态方法有两点规定:
1.在静态方法中不可以使用this关键字。
2.在静态方法中不可以直接调用非静态方法。

类的主方法

主方法是类的入口点,它定义了程序从何处开始:主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。
主方法的语法如下:

public static void main(String[] args){
         //方法体
}

从主方法的定义中可以看出:
1.主方法是静态的。所以如果要直接在主方法中调用其他方法,则该方法必须也是静态的。
2.主方法没有返回值。
3.主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数。

对象

对象的创建

Java语言中使用new操作符调用构造方法创建对象。

Test test = new Test();
Test test = new Test("a");

Test:类名;
test:创建Test类对象
new:创建对象操作符
"a":构造方法的参数

test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间。当创建对象时,自动调用构造方法,也就是说在java语言中初始化与创建是被捆绑在一起的。
每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。

访问对象的属性和行为

使用new 操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。对象的属性和行为是通过类成员变量和方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。

对象的引用

语法:

类名 对象引用名称

Book book;

Book book = new Book();
Book:类名
book:对象
new:创建对象操作符

注意:引用只是存放当一个对象的内存地址,并非存放一个对象

对象的比较

在java语言中有两种对象的比较方式,分别为“==”运算符与equals()方法。实质上这两种方式有着本质的区别。
“==”运算符比较的是两个对象引用的地址是否相同,而equals()方法用于比较两个对象引用所指的内容是否相等。


对象的比较.PNG

对象的销毁

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。java拥有一套完整的垃圾回收机制,垃圾回收器会回收无用但占用内存的资源。
以下两种情况的对象会被java虚拟机视为垃圾:

  1. 对象引用超过其作用范围,这个对象将被视为垃圾;
  2. 将对象赋值为null;

虽然垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象,如果某些对象不是通过new操作符在内存中获取一块内存区域,这种对象可能不能被垃圾回收机制所识别,所以在java中提供了一个finalize()方法。这个方法时Object类的方法,他被声明为protected,用户可以在自己的类中定义这个方法。如果定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。注意:有一点需要明确,垃圾回收或finalize()方法不保证一定会发生,如java虚拟机内存损耗殆尽时,他是不会执行垃圾回收的。由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行,为此,java提供了System.gc()方法强制启动垃圾回收器,刀子和垃圾回收器进行清理。

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

推荐阅读更多精彩内容