Java学习笔记(疯狂Java讲义第三版)——类和对象基础知识讲解

知识概要,简单过一遍即可,不理解的地方可以先放放。相对整体的知识有一个简单的框架。
类可被认为是一种自定义的数据类型
可以使类来定义变量,所有用类定义的变量都是引用变量
类用于描述客观世界里某一类对象的共同特征,而对象是类的具体实现
Java程序使用类的构造器来创造类的对象

面向对象三大特征:继承、封装、多态
三个访问控制修饰符:private、protect、public——为了现实良好的封装
提供了extends关键字用来实现继承,继承的好处是子类可以获得父类的成员变量和方法,如果访问权限允许,那么子类实例可以直接调用父类里定义的成员变量和方法。继承是实现类复用的重要手段,同时也可以通过组合来实现
多态性:子类可以直接赋值给父类,同时呈现不同的特性

构造器:对于类实例进行初始化操作,构造器支持重载,如果多个重载的构造器里包含了多个相同的初始化代码,则可以把这些初始化代码放置到普通初始化块中,初始化块总是在构造器执行之前被调用。
普通初始化块用来初始化对象。
静态初始化块:静态初始化块用来初始化类,在类初始化阶段被执行。
如果继承树里某一个类需要被初始化,系统将会同时初始化该类的所有父类

这里开始为学习的知识点,要理解了记忆了。
类和对象的概念:
面向对象的程序设计过程中有两个重要的概念:“类"和"对象”,其中类是对某一类对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体,从这个意义上来看日常我们口中所说的人,其实都是人的实例,而不是人类。

创建类的简单语法:
[修饰符] class 类名//注意:在以后看到中括号的时候,记住里面的内容是可选的,也就是可以不写的。
{
零到多个构造器定义…
零到多个成员变量定义…
零到多个成员方法定义…

}//这只是简单的定义语法,随着以后不断的学习,里面的内容也会不断的完善。

类的修饰符:abstract、final、默认(也就是什么都不写)、public//前期可以了解下,不需要全部记住,只需要记住public和
//默认(不写)
类名:合法的标识符即可。从可读性的角度看Java类名必须由一个或多个有意义的单词连缀而成,每个单词首字母大写,其他字母小写,单词与单词之间不要有任何分隔符。例如class ILoveJava{}//定义一个名为ILoveJava的一个空类。注意大括号中什么都没有就是 //一个空类

对于一个类而言,可以包含三种最常见的成员:构造器、成员变量、成员方法,三种成员都可以定义零个或者多个,如果所有成员都是零个,那么就定义了一个空类,这没有太大的实际意义。例如:
class A{}
该类就是一个空类,没有太大实际意义,大括号"{}"里面什么都没有。就好比我们有一个想法,但是这个想法具体是什么我们自己也不知道所以就是一个空想法,或者是一个空的概念。

各成员之间的定义顺序没有任何影响,各成员之间可以相互调用。但是要特别注意static修饰的成员不能访问没有static修饰的成员,也就是static修饰的成员不能调用没有static修饰的成员的意思。这句话先记住就行,以后还会重点讲解。

注意下面开始提到的"实例"和上文提到的"对象"是一个意思。

成员变量:用来定义该类或该类实例所包含的状态数据。
成员方法:方法则用来定义该类或该类实例的行为特征或者功能实现。
构造器:用于构造该类的实例,通俗的说就是用来创建对象用的。Java语言通过new关键字来调用构造器,从而返回该类的实例。
也可以简单理解为通过关键字new就可以调用类中的构造器从而创建该类的对象。
注意:构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。因此,Java语言提供了一个功能(这个功能要牢记):如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认的构造器。一但程序员为一个类提供了一个构造器,系统将不再为该类提供构造器。——前期我们可以先这样理解——一个类肯定会有构造器的。例如上文的class A{}这个空类,虽然里面什么都没有,但是系统会默认给提供一个构造器的。

定义成员变量的语法格式:
[修饰符] 数据类型 成员变量名 [=对应的数值];
修饰符:public、protected、默认(也就是什么都不写。默认用英文default表示这个单词要记住)、private、static、final。
public、protected、默认(default)、private为访问权限控制符,这个后面会重点讲,现在先了解下,是不是有点眼熟? 在上面讲解类的语法的修饰符的时候,就出现了public。
public、protected、默认(default)、private只能出现一个,意思是要么一个也不写也就是默认(default)或者public、 protected、private三个选一个。 例如:
class A
{
int a;//默认(default)访问权限控制符一个都没写
public int b;
protected int c;
private int d;
//注意四个只能选一个
}
public、protected、默认(default)、private可以和static、final组合起来一起修饰成员变量,这点先了解即可,以后还会重点讲解

变量类型:可以是Java语言中的任何数据类型,包括基本数据类型和我们自己创建的数据类型(也就是通过我们自己定义的类创建的变量)例如有一个类B,我们可以通B b;来定义数据类型为B的变量名为b;
成员变量名:语法上一个合法的标识符即可,但是从语义角度来说:应该由一个或多个有意义的单词连缀而成,第一个 单词首字母小写,后面每个单词首字母大写,其他字母全部小写,单词与单词之间不要有任何分隔符。
例如:String iLoveJava;(String是字符串数据类型,后面会讲)、
因为成员变量主要是用来描述类或类的实例的数据状态,所以建议使用英文名词。
对应的数值:成员变量在定义的时候可以指定一个合法的数值例如:public int a = 5;//此时5就是赋给成员变量a的值。

定义成员方法的语法:
[修饰符] 方法返回值类型 方法名(形参列表也就是可以有0到多个参数)
{
//由零到多条可执行语句组成的方法体,简单来说这个大括号机器里面的内容就是方法体。
}

修饰符:public、protected、默认(也就是不写,对应的英文单词default)、private、static、final、abstract。是不是十分熟悉,只比成员变量定义语法所用的修饰符多一个abstract。那么注意了,使用方法和上面讲解的一样,这里也一起复习下吧。
public、protected、默认(default,也就是什么也不写的意思)、private为访问权限控制符。
public、protected、默认(default,也就是什么也不写的意思)、private在修饰成员方法的时候只能出现一个。例如:
public 方法返回值类型 方法名(形参列表){}
protected 方法返回值类型 方法名(形参列表){}
方法返回值类型 方法名(形参列表){}
private 方法返回值类型 方法名(形参列表){}
//public、protected、默认、private只能出现一个,要么什么都不写,要么public、protected、private三选一。

在讲解"方法返回值类型"和"形参列表"的时候,我们要先了解下方法这个概念这里我们先不考虑修饰符,重点弄懂"方法返回值类型"、“形参列表”、“方法体”(也就是上面那个大括号及其里面的内容)和"方法"本身:
方法就好比我们雇佣的私家侦探,我们打算请"方法"这名侦探帮助我们完成一项侦察任务,那么我们就需要告诉它关于该任务的一些信息,那么这个信息就是通过"形参列表"来告诉"方法侦探"的,当然也可以认为"方法侦探"是通过"形参列表"来接收我们传递给它的信息的。那么"方法侦探"了解了任务之后就会去具体的执行,此时就是需要"方法体"来执行具体的步骤,当然最后任务无论结果如何侦探都是要返回给雇主相应的信息的,这样才是一名合格的侦探。我们"方法侦探"当然也是一名优秀的侦探,所以通过"方法返回值类型"来传递给我们任务结果。好了,了解了这些我们来看下面关于"形参列表"、“方法返回值类型”、和"方法体"的主要讲解。

返回值类型:可以是Java语言的任何数据类型,基础数据类型和引用数据类型。注意,再次强调下,通过"类"定义的变量都属于引用数据类型,例如有一个类A,则A a = new A();其中变量a就属于引用数据类型变量,而new A();为我们实际创造出来的属于A类的对象,我们通过变量a间接的使用对象new A();所以称由类声明的变量类型为引用数据类型。
关于返回值,对于一个方法来说由两种情况,有或者没有。如果有,那么返回值的类型必须与预先制定的返回值类型相匹配
例如int a(){return 0;}虽然这是一个没有实际意义的方法,但我们可以用它来学习相关语法。注意看,返回值类型为int类型,返回的值必须由return关键字来修饰,后面跟需要返回的值。我们这里需要返回的值是0,它属于int类型,正好和返回值类型int相匹配所以是合法的。如果是其他数据类型则可能会出现语法错误,要知道Java语言是一门强类型的编程语言。
如果没有返回值呢?那么可以用void类型来表示,例如void a(){},注意此时,return可以写也可以不写建议最好写上。如果写的话是这个样子:void a(){return;}后面什么值都没有即可。那么既然可以写也可以不写为什么还要写呢?这个和return的作用有关,return除了可以返回相应的值之外还有一个十分重要的作用,就是对于一个方法来说,如果运行到了return语句,那么该方法就会结束。所以总结下return有两点作用:返回相应的值和标志方法的结束。

方法名:符合标识符的名命规则即可,与成员变量的名命规则基本相同。但是要注意方法用于描述该类或该类的实例的行为特征或功能实现,因此通常建议方法名以英文动词开头。
形参列表:用于定义该方法可以接受的参数,可以由零个到多个,不同的形参参数用逗号隔开,形参类型和形参名用空格隔开。例如public int a(int b, int c);b和c是不同的形参所以用逗号隔开了,而数据类型和变量名之间是用空格隔开的。
方法体:方法体由各个可执行语句组成,在方法体中各个执行语句有严格的执行顺序,通常情况下,在前面的先执行,后面的后执行。

讲解上面关于成员变量和成员方法提到的static修饰符
static是一个特殊的关键字:它的作用是表明成员变量和成员方法到底是属于类本身还是属于实例。用static修饰的成员方法和成员变量属于类本身,不用static修饰的成员变量和成员方法属于具体的实例。
到底什么是属于类而什么又是属于对象的呢。我们可以举一个简单的例子来让大家有个简单的认识。
例如我们每个正常的人都有两个眼睛,那么这一个特点或者说是属性即没个人都有两个眼睛就不是某个人特有的而是每个人都是两个眼睛,那么就可以说这是人这个类的属性。
在看我们每个人的名字。有的人可能没有名字,同时有名字的人也是各有特色少有重名。所以名字这一属性虽然几乎每个人都有,但是值是不同的,例如张三这一名字就为某个人特有,而不是所有的人都叫张三。
可以简单这样理解:因为类是对象的抽象所以在以后可以这样做,如果所有对象的该属性值都一样,那么可以用static来修饰该成员。如果各有特色那么就可以不用static来修饰。

对比下定义成员变量的语法规则和成员方法的语法规则,看看它们是不是很像,方便大家记忆。
[修饰符] 数据类型 变量名 [=默认值];
[修饰符] 方法返回值类型 方法名{0到多个可执行语句}

接下来我们需要记忆几个专用名词:由static修饰的成员
static修饰的成员变量为类成员变量(也可以简称类变量)、static修饰的成员方法为类成员方法(也可以简称类方法)。因为static在英文单词中有静态的意思,所以类成员变量(也可以简称类变量)也可以称为静态变量、类成员方法(也可以简称类方法)也可以称为静态方法。
再次记一下:static修饰的成员不能直接访问没有static修饰的成员
再看非static修饰的成员:
没有static修饰的成员变量为普通成员变量和没有static修饰的成员方法普通成员方法,简称普通成员和普通方法。
注意:成员变量包含类成员变量和普通成员变量
成员方法包含类成员方法和普通成员方法

构造器:主要有两点作用,1、用来创建对象。2、为普通成员变量赋值。
在学习构造器的语法的时候可以对比方法的定义语法来进行学习,二者十分接近,同时也可认为构造器是一个特殊的方法。
[修饰符] 构造器名(参数列表)
{
//由0到多条可执行语句组成的构造器执行体
}

修饰符:public、protected、默认(也就是不写)、private。它只有这四个访问权限控制符,还记得吗,它们四个是只能写一个的。
构造器名:这里要特别注意我们在定义构造器的时候,它的名字必须和类的名字一致。例如:
class A{
public A(){}//注意看构造器的名字和类的名字都是A
}
再顺遍复习下前面说的,还记得构造器我们如果自己不创建的时候,系统会默认帮我们创建一个,系统默认创建的构造器就和上面写的一样哦。是没有参数,大括号中也是没有人和语句的。

形参列表:和定义方法形参列表格式完全相同。

特别注意:构造器和方法的区别首先是没有返回值的类型,其次是构造器的名字必须和类的名字一样。
注意看接下来的例子:
class A
{
public void A(){}//因为有返回值类型,它只是一个普通的方法,跟构造器没有任何关系,即便名字和类名一样。
public B(){}//因为没有写返回值类型,且名字和类名不一样,所以会报语法错误,认为你在定义方法的时候没有写返回值类 //型
public A(){}//因为没有返回值类型,且名字和类名一样,所以它是一个构造器。
//因为构造器和方法在定义上十分相似,所以要特别注意区分构造器和方法的区别,到底怎样才算是构造器。
//1、构造器没有返回值类型
//2、构造器的名字和类的名字一样。二者缺一不可。
}

练习,自己定义几个类并且用类来创建相应的对象吧。
//我打算创建人这个类,所以给它起名Person,因为Person本身就是英文单词人类的意思,所以很有语义
public class Person
{
public String name;//变量name是用来表示名字的
public int age;//age是用来表示年龄的

public void say(String content)//这个是用来随意说一句话的。
{
System.out.println(content);
}
}
//类定义完成之后,我们来通过该类创建对象。先看方法1:
Person p1 = new Person();//注意看等号的右边,new 构造器()。
//因为我们定义的这个类没有写构造器所以系统会默认给我们一个默认的构造器, //系统给的构造器是没有参数的构造器。且构造器体中没有任何语句。
//注意该语句整体属于初始化语句。将变量类型为
//Person名字为p1的值初始化为new Person()这一对象。

//我们再来看方法2:
Person p2;//注意该语句为声明语句,声明有一个变量类型为Person,名字为p2的变量
p2 = new Person();//该语句为赋值语句,将对象new Person()赋值给p2

注意,在访问权限允许的情况下,我们是可以通过对应的引用类型变量来间接访问对象的。还记得吗,访问权限是由访问权限控制符决定的,它们分别是public、protected、默认(也就是什么也不写)、private。
看例子:
p1.age = 10;//通过变量名p1来访问对应的new Person()对象中的年龄,注意这里用到了一个新的运算符".",该运算符为成员访问控 //制符专门用来访问对象中的成员的。该语句是将p1对应的对象的年龄age赋值成10岁。
p1.name = “张三”;//同上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值