Java中的类和对象
在前面的章节中我们学习了程序设计的基本知识和流程控制语句,现在我们即将学习一些新的技术——面向对象程序设计,英语缩写为OOP。对于面向对象程序,我们首先应该了解类和对象、有参方法和无参方法以及字符串。那它们又分别有什么作用呢?现在让我们一起来探讨吧!
一、类和对象
什么是类呢?俗话说:物以类聚,人以群分。类其实也就是一个虚拟的东西;而对象就是一个实实在在存在的东西。例如:乌龟就属于爬行类中的有足类,眼镜蛇就属于爬行类中的无足类,这些现实世界中客观存在的事物就称为对象。在Java的世界中,“万物皆对象”,因为对象可以是有形的,也可以是无形的。为了方便区分,每一个对象都有自己的特征,包括静态特征(属性)和动态特征(方法)。静态特征是可以用某些数据来描述的特征,如人的姓名、年龄等;动态特征是对象所表现的行为或对象所具有的功能,如购物、收款等。
对象的属性和方法
对象的属性是用来描述对象静态特征的一个数据项,该数据项的值即为属性值;而方法是用来描述对象动态特征的一个动作序列。对象的属性是被存储在一些变量里的,对象的行为则通过定义的方法来实现。对象的属性和方法是相辅相成的,不可分割,它们共同组成了实体对象,因此,对象具有封装性。
类和对象的关系
类和对象之间有区别也有联系,它们的关系就如同模具和用这个模具制作出来的物品之间的关系,也就是抽象和具体的关系。类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。类也是一个虚拟的抽象名次,对象是具体存在的实物,对象所拥有的特点和行为都只能来源于类。类其实就是对象的类型,事实上,定义类就是抽取同类实体的共性自定义的一种数据类型。
类
类其实就是一个集合,它定义了对象将会拥有的特征(属性)和行为(方法)。例如:所有顾客都有姓名,因此,姓名可以称为“顾客类”的属性,只是不同对象的这一属性值不同,如顾客张三和顾客李四的姓名不同,对象执行的操作称为类的方法。
Java是完全面向对象的编程语言,在程序设计中,类是程序的基本单元,所有的程序都是以类为组织单元的。那么我们如何描述类呢和对象?
Java的类模板语法:
public class <类名>{
//定义属性部分
属性1的类型 属性1; //如:String name; int a;
属性2的类型 属性2;
……
属性3的类型 属性3; //可以有多个属性
//定义方法部分
方法1; //如:public void show(){}
方法2;
……
方法n; //可以有多个方法
}
创建类给它命名时,类似于变量命名,也要遵循一些规则:
(1)不能使用Java中的关键字;
(2)不能以数字开头;
(3)不能包含任何嵌入的空格或点号“.”,以及除下划线“_”、字符“$”外的特殊字符。
类定义了对象将会拥有的属性和方法,定义一个类的步骤如下:
1、定义类名,语法:
public class 类名{
//编写代码
}
2、编写类的属性,通过变量来描述类所具有的属性,这些变量称为类的成员变量,如:String name;
3、编写类的方法,通过在类中定义方法来描述类所具有的行为,这些方法称为类的成员方法。语法:
访问修饰符 返回值类型 方法名(){
//方法体
}
定义好类了,接下来就是创建对象,语法:
类名 对象名 = new 类名();
如:
School center = new School();
center对象的类型就是school类型,在Java中,要引用对象的属性和方法,需要使用“.”操作符,其中,对象名在圆点的左边,属性或方法名在圆点右边。语法:
对象名.属性 //引用对象的属性
对象名.方法名() //引用对象的方法
如:
center.name = "北京中心"; //给name属性赋值
center.showCenter(); //调用showCenter()方法
在类里面定义属性时可以给它赋初值,也可以不赋,Java中数据类型的默认值分别是:
类型 | 默认值 |
---|---|
int | 0 |
double | 0.0 |
char | ‘/u0000’ |
boolean | false |
String | null |
对于类和对象我们也有了大概的了解,现在,我们就来实践一下,例如:编写管理员类,其属性包括用户名、密码;方法为show(),显示输出管理员信息。代码如下:
//创建一个管理员类
public class Administrator {
//定义两个属性
String name;
String password;
//定义一个方法用来输出信息
public void show() {
System.out.println("用户名:" + name + "\n密码:" + password);
}
}
//创建一个测试类,用来运行代码,测试是否正确
public class Administratorsj1 {
public static void main(String[] args) {
Administrator cust = new Administrator(); //创建一个管理员类的对象
cust.name = "张三"; //对象名.属性,给属性赋值
cust.password = "123456";
cust.show(); //对象名.方法名,调用方法输出信息
}
}
输出结果为:
以上的代码中,方法名后面的小括号里是空的,表示它是无参方法,下面我们就来了解一下它。
二、类的无参方法
类的每一个方法都实现了一个功能,它的作用就是输出中心的信息,创建类的对象后,可以直接调用这个方法,而且方法的具体实现封装在类中,实现了信息隐藏。
那么我们如何定义类的方法呢?类的方法必须包括以下三个部分:
(1)方法的名称;
(2)方法的返回值类型;
(3)方法的主体。
方法执行后可能会返回一个结果,该结果的类型称为返回值类型,使用return语句返回返回值。
语法:
return 表达式;
返回值类型定义的是什么类型,return返回的就是什么类型,如果方法没有返回值,则返回值类型为void(空),例如前面所写代码show()方法没有返回值,所以返回值类型为void。
在编写程序时,我们一定要注意方法中声明的返回值类型和方法体中真正的返回值类型是否匹配,如果不匹配,就会报错。
其实,这里return语句也是跳转语句的一种,它主要的作用是:跳出方法和给出结果。
Java中类是程序的基本单元,类的不同成员之间也可以相互调用,同一个类中的方法,直接使用方法名调用该方法;不同类的方法,首先创建对象,再使用“对象名.方法名”来调用。
成员变量和局部变量
在类中定义的变量称为类的成员变量,在方法中定义的变量是局部变量。
成员变量:一个类里面可以直接调用该类定义的方法,如果其他类的方法要访问它,必须首先创建该类的对象,然后才能通过操作符“.”来引用。
局部变量:它的作用域仅仅在定义该变量的方法内,因此只有在这个方法中能够使用。
总的来说,我们需要注意它们的是:
(1)作用域不同。局部变量的作用域仅限于定义它的方法,在该方法外无法访问;而成员变量的作用域在整个类内部都是可见的。
(2)初始值不同。对于成员变量,如果在类定义中没有给它赋初值,Java会给它一个默认值,基本数据类型的值为0,引用数据类型的值为null。但是Java不会给局部变量赋初始值。
(3)在同一个方法中不允许有同名的局部变量。
(4)局部变量可以和成员变量同名,并且局部变量有更高的优先级。
JavaDOC注释
一个完美的程序应该配有许多的注释,增加代码的可读性、相对持久性和可维护性。JavaDoc注释是能够从程序源代码中抽取类、方法、成员等,介绍该类、类的方法和成员变量的文档。它以"/**"开头,以“ */”结尾,一般以“@”为前缀,常用的JavaDoc标签如下:
标签 | 含义 |
---|---|
@author | 作者名 |
@parameter | 参数及其意义 |
@return | 返回值 |
@version | 版本标识 |
@since | 最早使用该方法/类/接口的jdk版本 |
@throws | 异常类及抛出条件 |
那么我们有什么方法生成JavaDoc文档呢?
(1)使用命名行方式生成;
(2)使用M有Eclipse工具生成。(选择“File”,"Export"选项,弹处“导出”对话框,选择“Java”菜单中的“JavaDoc”选项,提交即可)
三、带参数的方法
调用带参方法和调用无参方法的语法相同,但是在调用带参方法时必须传入实际的参数值。
语法:
对象名.方法名(参数1,参数2,……,参数n)
定义带参方法的类的语法为:
public void show(<参数列表>){
//方法的主体
}
在定义方法和调用方法时,把参数分别称为形式参数和实际参数,简称形参和实参,形参时在定义方法时对参数的称呼,实参是在调用方法时传递的方法处理的实际的值。
如:
//定义一个有参方法
public void addName(String name) {
for(int i = 0;i < names.length;i++) { //循环比较数组
if(names[i] == null) { //如果数组的值为空
names[i] = name; //就给数组的位置赋值
break;
}
}
}
Customer cut = new Customer(); //创建对象
cut.addName(newName); //调用带参方法
记住,在使用带参方法时,需要注意形参和实参要类型一致、数量一致、顺序一致。
在生活中,保存文档经常用到文件夹,给文件实行归类,便于查找、管理,在代码的class文件中就会利用包,包的主要作用就是保护类、数据和方法,防止命名冲突。声明包时,只需要写:package 报名; 即可。package是关键字,包的声明必须是Java源文件中的第一条非注释性语句,而且一个源文件只能有一个包声明语句。在命名包时,也有一定的规则:
(1)Java包的名字通常由小写字母组成,不能以圆点开头或结尾;
(2)一个唯一包名的前缀通常是全部小写的ASCLL字母;
(3)包名的后续部分依不同机构各自内部的规范不同而不同。
要使用不在同一个包中的类,需要将包显示的包括在Java程序中,这个过程称为导入包,语法:
import 包名.类名;或import 包名.*;
如:import java.util.*; //导入java.util包
四、字符串
String类型
字符串相信大家都不陌生吧,在我们使用字符串之前我们需要定义并初始值字符串,语法:
String s= “hello world!”;
String s = new String(); //创建一个空字符串
String s = new String(“hello world”); //创建一个字符串对象“hello world”
现在让我们来了解一下字符串的相关方法:
1、字符串的长度
str.length(); //用来计算字符串中的字符数目
如:
System.out.print("请输入密码:"); //输出提示语
pwd = in.next(); //从键盘输入一个字符串
if(pwd.length() >= 6) { //判断字符串的长度是否大于等于6
System.out.print("注册成功!"); //条件为真时输出
}else {
System.out.print("密码长度不能小于6位!"); //条件为假时输出
}
2、字符串的比较
语法:str1.equals(str2);
在使用equals()方法比较两个字符串时,它逐个对照组成两个字符串的每个字符是否相同,如果相同,返回true,否则返回false,且区分大小写。
如:
System.out.print("请输入用户名:"); //输出提示语
uname = in.next(); //从键盘输入用户名
System.out.print("请输入密码:"); //输出提示语
pwd = in.next(); //从键盘输入密码
if(uname.equals("Tom") && pwd.equals("1234567")) { //比较两个字符串是否相等
System.out.println("登陆成功!");
}else {
System.out.println("用户名或密码不匹配,登陆失败!");
}
双等号(==)和equals()虽然都应用于两个字符串,但是它们之间还是有区别的,简单来讲,双等号判断的是两个字符串对象在内存中的首地址是否相等,而equals()判断的是两个字符串对象的值是否相等。
但是有时候我们会碰到大小写的验证的情况,这时我们就需要使用另外一种方法:equalsIgnoreCase()方法,语法:str1.equalsIgnoreCase(str2);
3、转换字符串的大小写
toLowerCase():转换字符串中的英文字母为小写
toUpperCase():转换字符串中的英文字母为大写
它们分别返回字符串的大小写形式
4、字符串的连接
str1.concat(str2); str2被连接到str1的后面,返回连接后的新字符串。
将两个字符串拼接起来也可以使用”+“,当”+“连接字符串和int(或double)类型时,”+“将int(或double)类型数据自动转换成String类型。
如:
int sql = 80; //SQL成绩
int java = 90; //Java成绩
double html = 86.7; //HTML成绩
String scoreSheet = "SQL:" + sql + " Java:" + java + " HTML:" + html; //成绩单
System.out.println(scoreSheet); //打印成绩
运行结果为:
上面所写的是”+“进行拼接的效果,现在使用concat拼接字符串进行对比,代码如下:
//定义两个字符串变量并赋初值
String s = new String("你好,");
String name = new String("张三!");
String sentence = s.concat(name); //使用concat拼接字符串并把新字符串赋给一个字符串变量
System.out.println(sentence); //输出新字符串
运行结果为:
5、indexOf()方法
该方法是在字符串内搜索某个指定的字符或字符串,它返回出现第一个匹配字符(或字符串)的位置,如果没有找到匹配,则返回-1。如:
String s = "青春无悔"; //定义一个字符串类型的变量
int index = s.indexOf('春'); //求‘春’字的位置
index的值为1。
6、lastIndexOf()方法
该方法也是在字符串内搜索某个指定的字符或字符串,但是它返回最后一个出现的字符(或字符串)的位置,如:
String s = "青春无悔"; //定义一个字符串类型的变量
int index = s.indexOf('春'); //求‘青春’的位置
index的值为6,它虽然搜索的是字符串,但是返回的值是字符串的第一个字符的位置。
7、substring(int index)方法
该方法用于提取从位置索引开始的字符串部分,调用时,括号中写的是要提取的字符串的开始位置,方法的返回值就是要提取的字符串。如:
String s = "青春无悔"; //定义一个字符串类型的变量
String result = s.substring(1); //提取从1开始的后续字符串
result的值为”春无悔“。
8、substring(int beginIndex,int endIndex)方法
该方法用于提取位置beginIndex和位置 endIndex之间的字符串部分,要注意的是:对于beginIndex,字符串的首字母从0开始,但是对于endIndex,字符串的首字母位置从1开始计算。如:
String s = "青春无悔无悔青春"; //定义一个字符串类型的变量
String result = s.substring(2,6); //提取从2开始到6结束的后续字符串
result的值为:”无悔无悔“。
9、trim()方法
删除掉多余空格,该方法可以忽略字符串前后的空格。但是如果是字符串中间的空格是删不了的,如:
//定义一个变量并赋初值
String s = new String(" 你 好 ");
String sentence = s.trim(); //调用trim()方法,将新字符串返回到变量中
System.out.println(sentence); //输出字符串
结果为:
10、字符串的拆分
语法:str1.split(String separator,int limit); //将一个字符串拆分为多个字符串
separator可选项,标识拆分字符串时使用一个或多个字符,如果不选择该项,则返回包含该字符串的所有单个字符的元素数组;limit可选项,该值用来限制返回数组中的元素个数。如:
//给字符串数组赋初值,并输出原数组,拆分后输出新的字符串数组
String words = "长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山";
String[] printword = new String[100]; //定义接收数组
System.out.println("***原歌词格式***\n" + words);
System.out.println("\n***拆分后歌词格式***");
printword = words.split(" "); //按照空格进行拆分
for(int i = 0;i < printword.length;i++) {
System.out.println(printword[i]); //打印输出
运行结果为:
StringBuffer类
在Java中除了可以使用String类存储字符串之外,还可以使用StringBuffer类存储字符串,它类似于String类型,而且它是比String类更高效的存储字符串的一种引用数据类型,特别是对字符串进行连接时,使用StringBuffer类可大大提高程序的执行效率。
使用StringBuffer类也需要两步完成:
(1)声明StringBuffer对象并初始化,语法:
StringBuffer sb1 = new StringBuffer(); //声明一个空的StringBuffer对象
StringBuffer str = new StringBuffer (”青春无悔“); //声明一个字符串”青春无悔“
(2)使用StringBuffer 对象
StringBuffer 类提供了很多方法以供使用,调用时使用”.“操作符完成。
常用的StringBuffer 类方法
1、转换字符串
语法:str1.toString(); //将StringBuffer 类型的str1转换为String类型的对象并返回
如:
String s1 = sb2.toString();
2、连接字符串
语法:str1.append(str2); //将str2连接到str1后并返回
该方法和String类的concat()方法一样,都是把一个字符串追加到另一个字符串后面,所不同的是String中只能将String类型的字符串追加到一个字符串后,而StringBuffer 可以将任何类型的值追加到字符串之后。
3、插入字符串
str.insert(位置,参数);
将参数插入str的指定位置(int类型)后并返回,参数可以是包括String类型的任何类型。如:
//接收数字串,存放于StringBuffer类型的对象中
System.out.print("请输入一串数字:");
String nums = in.next();
StringBuffer str = new StringBuffer(nums);
//从后往前每隔三位添加逗号
for(int i = str.length()-3;i > 0;i = i-3) {
str.insert(i,',');
}
System.out.print(str);
输出结果为:
好了,到此我们的Java语言的了解就结束了,对于程序员来说,这些复杂的代码就是他们的朋友,不知道陪伴着他们度过了多少个日夜,我们这些人也应该多多了解它们。