前言
暑假的时候学过一段时间的Java,但只是自己买一本书来看,书中的一大段一大段文字显得十分生硬,因此学完之后感觉自己对于一些概念还是一知半解。于是国庆假期我在慕课网重新学习了Java,一来是可以复习曾经学过的知识,二来是可以弄清楚自己曾经感到模糊的概念,三来还可以了解到各路大神对Java这门语言的见解,加深自己对其的认知与理解。下面我就整理了一些我认为在Java的学习过程比较关键的内容(这里只阐述一些基本概念,具体操作请参考本文最下方提供的参考资料):
一、类与对象
和我们所熟悉的C++一样,Java也是面向对象编程的语言,因此对象便是Java的核心。
一些概念:
对象:
在现实世界中,客观存在的事物就是对象,例如人类、书桌、计算机等。而对于计算机来说,面向对象就是指关注具体事物的信息。
类:
类是对象的类型,确定对象了对象拥有的特征和行为,翻译成计算机语言就是属性和方法。类是具有相同属性和方法的对象的集合,可以把多个具有相同属性和方法的对象有一个类来表示。但和对象不同,类并不是客观存在的事物。
对象的属性:
对象的属性就是对象具有的各种特征,而对于每个对象来说,每个特征都具有特定值。
对象的方法:
对象的方法就是对象执行的操作,也可以理解为对象能干什么。
说了一大堆概念,下面举一个更直观的例子来说明:手机是一个总称,可以把它看成是一个类,而具体到某一品牌某一型号的手机则是手机类中的一个对象。以最新的苹果产品iPhone7为例(我真的没有在卖广告),它的屏幕有大小、内存有大小、还有价格,因此屏幕、内存和价格便是它这个对象的特征(属性),而屏幕的大小、内存的大小、具体的价格就是特征的值(属性值);除了这些,iPhone7还有打电话、发短信的功能,这便是它这个对象的行为(方法),即能打电话、能发短信。试想一下,是不是所有手机都有屏幕、内存和价格这些特征,都有打电话、发短信这些行为呢(当然有些手机功能更先进,会拥有其它手机没有的功能,这要用到接口的概念,以后将会介绍)?可想而知是的,因此手机便是一个类,而iPhone7就是手机类中的一个具体对象。同样,三星Note 7 、华为P9这些手机也是手机类中的具体对象。
成员变量和局部变量:
成员变量在类中定义,用来描述对象的属性;局部变量在类的成员方法中定义,用来存放临时数据。
区别:
- 作用域:成员变量的作用域为整个类;局部变量的作用域为所在的成员方法
- 初始值:Java会给成员变量赋一个初始值,但不会给局部变量赋一个初始值(这一点比较容易忽略的,如果不给局部变量赋初始值,则程序会报错)
- 名称:在同一个方法中不能有同名的局部变量,但在不同的方法中可以有同名的局部变量(局部变量的作用域能很好地解释这一点:第一个方法中的局部变量并不会在第二个方法中生效。因此同名的两个(或多个)局部变量是不同的局部变量,只不过名称相同罢了)
- 优先级:当成员变量和局部变量同名时, 局部变量具有更高的优先级(这在Java中是允许的,但调用这个局部变量时优先取局部变量的值而不是成员变量的值)
构造方法:
构造方法是定义类中用来初始化对象的方法。与上面介绍的对象的方法有所不同,构造方法不代表对象能干什么,但它能创建这个对象并给对象初始化。
在创建对象的过程中,用new
关键字来创建:类名 对象名 = new 类名()
。这里的类名()
其实就是调用这个类的无参构造方法(不管是有参还是无参,构造方法都与类同名)。
注意:
- 当没有指定构造方法时,系统会自动调用无参的构造方法
- 当指定了构造方法时,无论这个方法是有参的还是无参的,系统都不会调用无参的构造方法(举个例子,通过两种构造方法来初始化对象:
类名 对象名 = new 类名()
、类名 对象名 = new 类名(参数类型 参数名)
,如果此时已经定义了有参(或者无参)的方法的话,类名 对象名 = new 类名()
这里系统就会报错,即系统不会调用原本默认的无参的构造方法来创建对象,只能通过已定义的有参(或者无参)的构造方法来创建对象) - 构造方法不但可以给对象的属性赋值(即初始化对象), 还能够保证给对象的属性赋一个合理的值(举个例子,现实生活中我们知道如今手机屏幕的大小不可能为负数,也不可能太大,因此当我们定义一个有参的构造方法的时候就可以给手机的屏幕大小这一属性赋一个合乎常理的值,当传入的参数小于0或者大于8(单位为英寸),就可以通过构造方法强制把屏幕大小设定为一个正常值)
权限修饰符:
权限修饰符控制着对类、类的成员变量和类的成员方法的访问,种类和作用范围如下图所示:
权限修饰符的种类和作用范围对类和对象的操作:
定义类:
简单来说,定义Java中的类分为三个步骤:
1.定义访问权限、类名等
2.编写类的属性
3.编写类的方法
即为:
[权限修饰符] class 类名{
//属性(成员变量)
[权限修饰符] 属性1的类型 属性1;
[权限修饰符] 属性2的类型 属性2;
[权限修饰符] 属性3的类型 属性3;
...
//方法
方法1;
方法2;
方法3;
...
}
注意:
- 这里的属性和方法可为一个或多个,也可以没有
- 类名通常以大写字母开头
- []代表可有可无的内容,下同
定义属性:
定义属性就是声明变量并赋初始值。
注意:如果变量有初始值就赋初始值,无初始值则赋0(int型、long型)或者0.0(double型)或者" "(String型),以此类推。
定义方法:
[权限修饰符] 返回值类型 方法名(参数类型 参数名){
//方法体
return 返回值;
}
注意:
- 方法名后的括号内容可以为空,即代表无参的方法
- 方法也可以无返回值,此时返回值类型为
void
- 方法体可以为空
- 返回值的类型一定要与第一行所声明的返回值类型相符,否则程序会报错
- 方法名如果由多个单词构成,不使用下划线,而是除第一个单词外其余单词首字母大写,其余字母均小写,以此区分
调用对象的属性:
对象名.属性
调用对象的方法:
对象名.方法名()
二、封装
首先要强调,面向对象同时也是Java三大特性:封装、继承与多态。
封装:
封装是指将类的某些信息隐藏在类的内部,不允许外部程序直接访问,只能通过该类提供的成员方法来实现对这些信息的访问与操作。这样使得外部程序只能通过规定的方法访问和操作类中的数据,提高了程序的安全性。
封装的实现步骤为:
1.修改成员变量(属性)的可见性(将权限修饰符设为private,即只能在本类中调用)
2.创建getter和setter方法,用于属性的读写(这里不必纠结于这两种方法的名称,知道它们的具体代码和作用就好。实际上只要正确,用其他方法也可以实现属性的读写,但规范来说应使用getter和setter方法)
3.在getter和setter方法中加入一些控制语句,对属性值是否合法(合乎常理)进行判断
this关键字:
在Java中,this关键字被隐式地用来引用本类中的成员变量和成员方法,常常与封装联系起来使用。
现在以上文提到的手机类为例描述封装的具体实现,先定义Phone类:
package com.project;//声明包
public class Phone{//定义Phone类
private float screen;//定义屏幕属性(单位为英寸)
private float CPU;//定义内存属性(单位为G)
private int price;//定义价格属性(单位为元)
//这里封装了3个属性,用private修饰它们的访问权限
public float getScreen(){//定义screen属性的getter方法
return screen;//返回screen属性的值
}
public void setScreen(float screen){//定义screen属性的setter方法
this.screen = screen;//把screen属性的值设置为传入的参数的值
}
}
这样就定义好了Phone类中screen属性的getter和setter方法,外部程序可以通过对象名.getScreen()
和对象名.setScreen(float型数据)
来获得对象的screen属性值和设置对象的screen属性值。
PS:利用开发工具(Eclipse、Myeclipse)能快速创建getter和setter方法,小伙伴们可以自行试试应该怎么操作。
在倒数第三行代码中出现了this关键字,在这里它的作用是引用phone类中的成员变量screen,而this.screen = screen
语句中第二个screen是指形参screen,这条语句的作用就是将形参screen的值赋给成员变量screen。由于它们同名,因此需要使用this关键字来区分它们。
此外,this关键字还可以引用本类中的成员方法,还是以上文的Phone类为例:
package com.project;
public class Phone{
...
public void call(){//定义无参无返回值的call方法
System.out.println("手机具有打电话的功能");//打印输出“手机具有打电话的功能”这句话
}
public void sendMessage(){//定义无参无返回值的sendMessage方法
System.out.println("手机具有发短信的功能");//打印输出“手机具有发短信的功能”这句话
}
public void function(){//定义无参无返回值的function方法
System.out.println("手机具有以下功能");
this.call();
this.sendMessage();
}
}
新建一个项目测试类用于测试功能的实现:
package com.project;
public class Test {
public static void main(String[] args) {
Phone iPhone7 = new Phone();//创建Phone类对象iPhone7
iPhone7.function();调用iPhone7的function()方法
}
}
控制台界面会输出以下信息:
控制台显示说明this关键字既可以引用本类中的成员变量,又可以引用本类中的成员方法。
网友评论