Java入门篇(六)——类和对象
写到这里终于写到了入门篇的最后一个知识点了。类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能。Java是面向对象的语言,因此掌握类与对象是学习Java语言的基础。
类和对象的概念就不在此描述了,这篇随笔还是主要从代码方面入手,在学习本篇前建议先了解一下类和对象的概念、实例的概念以及面向对象程序的特点,也即封装、继承、多态。
一、类
类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。
1. 类的构造方法
构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,构造方法分为有参构造方法和无参构造方法,区别就在于有没有参数。说这么多概念是不是感觉有点麻木,直接看下面的例子吧。
public class Example { public Example() { // 定义无参构造方法
System.out.println("无参构造方法");
} public Example(String name) { // 定义有参构造方法
System.out.println("有参构造方法");
} }
在定义构造方法时,构造方法没有返回值,且构造方法不需要void关键字进行修饰。“public”是构造方法的修饰符,“Example”是构造方法的名称。
在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。
2. 类的主方法
主方法其实我们已经见过很多次了,Java编译器通过主方法来执行程序,是类的入口点,语法格式如下:
public static void main(String[] args) {
// ...
}
“static”是指主方法是静态的,若在其中调用其它方法,则该方法也必须是静态的;”void”是指主方法没有返回值;“String[] args”是指主方法的形参为数组,用args[0]~args[n]分别表示程序的第一到第n个参数,可以使用args.length获取参数的个数。
3. 成员变量
对象的属性称为成员变量,也可称为属性。下面以学生类(可比作学生证)举个例子:
public class Student {
private int id; // 定义一个int型成员变量,学号
private String name; // 定义一个String型成员变量, 姓名 public Student() { // 定义无参构造方法 }
public Student(int id, String name) { // 定义有参构造方法
this.id = id;
this.name = name;
} public void setName(String name) { // 定义一个setName()方法,用于导入学生姓名
this.name = name; // 将参数值赋给成员变量
}
public String getName() { // 定义一个getName()方法,用于获取学生姓名
return this.name;
} public Student getStudent() { // 返回Student类引用
return this;
}
}
这就是个比较全的例子了,在Java语言中使用class关键字来定义类,Student是类的名称;在Student类中定义了三个成员变量,分别为学号和姓名,可设置初始值也可不设置初始值,若不设置初始值则会有默认值;private关键字用于定义一个私有成员,后面会介绍public、protected和private。接下来的两个构造方法上面已经提到过了,this关键字用于引用对象的成员变量和方法,在后面会有所介绍。一般在这样的类中每一个变量都会有set和get方法,set方法是带参数的方法没有返回值,get方法是有返回值的方法,用于获取。最后还有一个getStudent()方法,它的类型是Student类的,用于返回Student类的引用,用this关键字实现。
4. 成员方法
成员方法对应类的行为,就是上述实例中的getName()和setName()方法,分别为获取学生姓名和设置学生姓名的方法,语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
// ...
return 返回值;
}
若无返回值,返回值类型用void关键字表示,如上述setName()方法。若有返回值,返回值类型要与方法返回值类型一致。
5. 局部变量
如果在成员方法中定义一个变量,那么这个变量别称为局部变量。例如在上述Student类中的getName()方法中定义一个局部变量id如下:
public String getName() {
int id = 0; // 定义一个局部变量
return id + this.name;
}
局部变量是在方法执行时创建,在方法执行结束时被销毁,使用时必须赋值或初始化。所以局部变量的有效范围从该变量的声明开始到该变量的结束为止。
若一个方法中含有与成员变量同名的局部变量,则方法中对这个变量的访问以局部变量进行访问。例如id,在上述方法中id=0,而不是Student类中的成员变量id的值。
6. 静态变量、常量和方法
由static修饰的变量、常量和方法被称作静态变量、常量和方法。静态成员是属于类所有的,区别于个别对象,可以在本类或其他类中使用类名和“.”运算符调用,这个在之前的篇幅中的例子也出现过,语法格式为: 类名.静态类成员 。
public class StaticTest {
final static double PI = 3.1415926; // 在类中定义静态常量
static int id; // 在类中定义静态变量 public static void demo01() {
System.out.println("test");
}
public static void main(String[] args) {
System.out.println(StaticTest.PI); // 调用静态常量
System.out.println(StaticTest.id); // 调用静态变量
StaticTest.demo01(); // 调用静态方法
} }
7. 权限修饰符
Java中的权限修饰符主要包括private、public和protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问。区别见下表:
访问位置 | 类修饰符 | ||
private | protected | public | |
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
若一个类的访问权限为不可见,这个类将隐藏其内的所有数据,以免用户直接访问它。当声明类时不使用public、protected或private修饰符设置类的权限,则这个类预设为包存取范围,即只有同一个包中的类可以调用这个类的成员变量或成员方法。
要特别注意以下情况,在项目中com.adamjwh包下创建AnyClass类,该类使用默认权限时:
package com.adamjwh; class AnyClass {
public void doString() {
// ...
}
}
此时,即使AnyClass类中的doString()方法又被设置成public访问权限,其访问权限也与AnyClass类的访问权限相同。因为Java规定,类的权限设定会约束类的成员上的权限设定,所以上述代码等同于下面的代码:
package com.adamjwh; class AnyClass {
void doString() {
// ...
}
}
8. this关键字
在Java中,this关键字被隐式地用于引用对象的成员变量和方法,如前面“成员变量”中的例子:
public void setName(String name) { // 定义一个setName()方法,用于导入学生姓名
this.name = name; // 将参数值赋给成员变量
}
setName()方法中,this.name指定的就是Student类中name变量,而“this.name=name”语句中第二个name则指定的是形参name。实质上,setName()方法实现的功能就是将形参name的值赋予成员变量name。
this除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。如前面“成员变量”中的例子:
public Student getStudent() { // 返回Student类引用
return this;
}
在getStudent()方法中,方法的返回值为Student类,所以方法体中使用return this这种形式将Student类的对象进行返回。
二、对象
Java是面向对象的程序设计语言,对象是由类抽象出来的,所有的问题都是通过对象来处理,对象可以操作类的基本属性和方法解决相应的问题。
1. 对象的创建
在Java中可以使用new操作符调用构造方法创建对象,语法格式如下:
Test test = new Test();
Test test = new Test("a");
test对象被创建出来时,test对象就是一个对象的引用,这个引用在内存中为对象分配了存储空间,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法。
在Java中对象和实例事实上可以通用,下面看一个创建对象的实例。
public class CreateObject {
public CreateObject() { // 构造方法
System.out.println("test");
}
public static void main(String[] args) {
new CreateObject(); // 创建对象
在上述实例的主方法中使用new操作符创建对象,在创建对象的同时,自动调用构造方法中的代码。
2. 访问对象的属性和行为
当用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。话不多说,直接上代码。
public class ObjectTest { int i = 2018; // 成员变量
public void call() { // 成员方法
for(i=0; i<3; i++) {
System.out.print(i + " ");
if(i == 2 ) {
System.out.println(); // 换行
}
}
} public ObjectTest() { // 构造方法
} public static void main(String[] args) {
ObjectTest o1 = new ObjectTest(); // 创建一个对象
ObjectTest o2 = new ObjectTest(); // 创建另一个对象
o2.i = 60; // 给第二个类成员变量赋值 System.out.println("第一个实例对象调用变量i的结果为:"+ o1.i);
o1.call();
System.out.println("第二个实例对象调用变量i的结果为:"+ o2.i);
o2.call();
} }
运行结果如下:
这里我们可以看到,虽然使用两个对象调用同一个成员变量,结果却不相同,因为在打印这个成员变量的值之前将该值重新赋值为60,但在赋值时使用的是第二个对象o2调用的成员变量,所以在第一个对象o1调用成员变量打印该值时仍然是成员变量的初始值。所以两个对象的产生是相互独立的。
如果希望成员变量不被其中任何一个对象改变,可以使用static关键字,也即改第三行代码为 static int i = 2018; ,运行结果如下:
这里由于第19行代码“o2.i=60;”改变了静态成员变量的值,所以使对象o1调用成员变量的值也变为了60;当“o1.i”执行完后,再次调用call()方法,使i的值又重新赋值为0,循环打印,最后i为3,退出循环,所以对象o2调用成员变量的值变成了3。
3. 对象的引用、比较和销毁
对象引用的语法格式为: 类名 引用对象名称 ,例如一个Student类的引用可以为: Student student; ,引用与对象相关联的语法为: Student student = new Student(); .
对象的比较有“==”运算符和equals()方法两种,区别在上一篇中已经介绍过了。equals()方法是String类中的方法,用于比较两个对象引用所指的内容是否相等;而“==”运算符比较的是两个对象引用的地址是否相等。
对象的销毁利用的是Java中的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器将回收无用的占用内存的资源。会被Java虚拟机视为垃圾的对象主要包括以下两种情况:
(1) 对象引用超过其作用范围;
(2) 将对象赋值为null;
虽然垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象。所以Java中提供了一个finalize()方法,如果用户在类中定义了finalize()方法,在垃圾回收时首先调用该方法,并且在下一次垃圾回收动作发生时,才能真正的回收对象占有的内存。由于垃圾回收不受人为控制,Java还提供了System.gc()方法强制启动垃圾回收器,作用是告知垃圾回收器来清理。
到此就是Java入门篇的全部内容了,要熟练使用Java语言还有许多知识等着我们去挖掘,掌握入门篇的知识应付学校的考试之类的是没有问题的,如果还想做一些游戏或项目,还需要进一步学习Java语言的知识,下一篇开始就是Java的进阶篇了,主要内容包括接口、继承、多态、异常处理、输入输出、Java集合类以及Swing程序设计(图形界面)等等。
Java入门篇(六)——类和对象的更多相关文章
- 【SSRS】入门篇(六) -- 分组和总计
原文:[SSRS]入门篇(六) -- 分组和总计 通过[SSRS]入门篇(五) -- 设置报表格式的设计,一份简单格式的报表已产生,如下图: 这节来说说分组和总计: 根据日期.订单对数据进行分组 添加 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- java提高篇(六)-----使用序列化实现对象的拷贝
我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能的提升非常 ...
- [java核心外篇]__Object类与对象类型的转型
前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...
- Java编程里的类和对象
像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...
- Java入门——(3)面对对象(下)
关键词: 类的继承.final关键字.多态.接口.异常.包.访问控制 一.类的继承 1.类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类 ...
- Java入门——(2)面对对象(上)
关键词:面对对象.类..构造方法.this.static.内部类 一.面对对象的概念:把解决的问题安装一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.其特点可概括为封装性.继承 ...
- Java从零开始学十一(类和对象)
一.面象对象 二.什么是类 我肯定说,不知道.不清楚. 简单讲类是java中的基本单元,类是具有相同特性和行为的对象集合 三.类的定义 3.1.类的定义 class 类名称{ 数据类型 属性 ; … ...
- Java入门基础(类)
类 在Java中表示自定义的数据类型,一个class可以是若干基本类型的组合. public class Student { public String id;//学号 public String n ...
随机推荐
- C/C++调用Golang 一
C/C++调用Golang 一 (开发环境: 操作系统: windows 7 32位操作系统 C++: visual studio 2010 Golang:go version go1.9 windo ...
- linux shadowsocket 安装和启动
http://blog.csdn.net/hanshileiai/article/details/49302865
- 一起学Linux03之Linux系统目录结构
我们用XShell登录Linux后,如果你是用root用户登录的,那么直接使用ls命令(List files 列出文件(信息). 注: Linux命令为了方便使用,都是简写.所以,每出现一个新的命令, ...
- RAID常用级别的比较
[转]RAID常用级别的比较 特点 硬盘及容量 性能及安全 典型应用 raid 0 用于平行存储,即条带.其原理是把连续的数据分成几份,然后分散存储到阵列中的各个硬盘上.任何一个磁盘故障,都将导致数据 ...
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected single错误
在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.springframework.beans. ...
- SSM整合---实现全部用户查询
SSM整合 准备 1.创建工程 2.导入必须jar包 链接: https://pan.baidu.com/s/1nvCDQJ3 密码: v5xs 3.工程结构 代码 SqlMapConfig < ...
- angular4.0单个标签不能同时使用ngFor和ngIf
这个问题估计是ng4严格了语法规范的原因. 介于这篇太短,附上图助助兴致 解决办法: <div *ngFor="表达式"> <ng-container *ngIf ...
- 未知宽高图片水平垂直居中在div
<BODY> <div class="box"> <span class="car"></span> <i ...
- FFmpeg编译iOS静态库
第一步:下载gas-preprocessor 1.1 下载https://github.com/libav/gas-preprocessor 1.2 拷贝 gas-preprocessor.pl 到 ...
- QuickChm 制作chm文档 chm文档脚本错误,乱码
最近学习bootstrap,到网上找了一些chm格式的文档,发现有些老旧,于是决定自己制作一个 用过以下这些chm制造器,包括easychm,chm精灵,chmeditor,chmfactory等等, ...