JAVA基础day06: 面向对象——类、对象的创建和使用
面向对象(上)
(本人也是初学编程,结合B站尚硅谷的JAVA视频,谈谈自己的理解,如有错误,欢迎评论指正)
面向过程和面向对象
-
面向过程编程,强调的是功能行为,以函数为最小单位,考虑怎么做。
-
而面向对象不同,强调的是具备了某些功能的对象,以类/对象为最小单位,考虑谁来做。
JAVA的类和对象
类和对象的理解
-
类(Class)和对象(Object)是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)
-
比如:人会说话、唱歌、吃饭;
- 这里的“人”,其实就是一个类,他是抽象的概念,所有的人都会说话、唱歌、吃饭
- 小明会说话、唱歌;这里的“小明”就是对象,是“人”这个类的实例化,或者叫类的对象
下面我们先快速创建一个类,并创建类的对象;文章后半段会详细讲解里面的知识。
类及类的创建
- 类(class)的成员有:
- 属性:对应类中的成员变量
- 方法:对应类中的成员方法
格式:
权限修饰符 class 类名 {
属性声明;
方法声明;
}
说明:修饰符public:类可以被任意访问
类的正文要用{}括起来
代码演示:
创建一个类
我们先创建一个Person类:
class Person {
}
好了!
类的属性的使用
然后我们往里面添加 属性
class Person {
//属性,或成员变量
String name;//定义一个String型的name变量,但未赋值;
int age = 25;//定义一个int型的age变量,赋值25;
}
人有姓名和年龄,所以我们在Person这个类中,定义了两个属性,name和age
类的方法的使用
- 方法:描述类应该具有的功能。
- 比如之前接触的Scanner类,用来接受用户键盘输入的nextXxx()方法。
方法的声明格式:
权限修饰符 返回值类型 方法名 (形参列表){
方法体;
}
现在我们给Person类定义一些方法。
人有那些行为呢?会唱歌,会说话,所以:
class Person {
//属性,或成员变量
String name;
int age = 25;
//方法,或函数
public void sing (String name){//定义一个String型的参数name,此处不必赋值,调用该方法时传入name参数值
//修饰符 返回值类型 方法名 (形参列表){
System.out.println(name + "会唱歌。");
}
public String talk (String language) {
return "会讲" + language;
}
}
好了,整个Person类已经定义好了,但这只是个类,是个抽象的概念;
在实际使用时,需要创建具体的对象(实例);
实际的应用场景,往往是指定的具体对象,比如具体是“谁”(小明?还是小红?),年龄是25岁,还会唱歌。
对象的创建和使用
还记得之前使用的Scanner类吗?用来接受用户键盘输入,我门当时是这么写的:
//new一个Scanner类的对象,命名为:scan
Scanner scan = new Scanner(System.in);
//再去调用方法:scan.方法()
int i = scan.nextInt();
- 创建对象语法: 类名 对象名 = new 类名()
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
上上个代码块,我们创建了一个Person类,现在我们创建一个Person类的对象(类的实例化)
//这是我们定义的Person类
class Person {
**上一个代码块的内容;**
}
//具体使用
public class PersonTest {
public static void main (String[] args) {
//创建Person类的对象(类的实例化)
Person p1 = new Person();//实例一个具体的人,变量名叫p1
p1.name = "小明";//创建类时,name这个变量我们没有赋值,现在给name赋值
System.out.println(p1.name);
System.out.println(p1.age + "岁");//创建类时,age已赋值,直接调用
p1.sing(p1.name);
p1.talk("Chinese");
}
}
输出:
小明
25岁
小明会唱歌。
会讲chinese
- 在上面的代码块中,我们再创建一个对象p2
Person p2 = new Person();
p2.name = "小红";
p2.age = 22;//此时,我们重新定义小红的age为22
System.out.println(p2.name);
System.out.println(p2.age);//同一个age,属于不同对象,有各自不同的值
p2.sing(p2.name);
p2.talk("English");
输出:
小明
25岁
小明会唱歌。
会讲Chinese
小红
22岁
小红会唱歌。
会讲English
- 对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
- 意味着:如果我们修改一个对象的属性a,则不影响另外一个对象的属性a的值。
类的成员——属性的详解
下面,我们对上面创建类和对象的过程中的一些细节进行讲解。
属性(成员变量) 和 局部变量
-
相同点
- 定义变量的格式:数据类型 变量名 = 变量值
- 必须先声明,后使用
- 都有其对应的作用域
-
不同点:
- 在类中的声明位置不同
- 属性直接定义在类的一对{}内
- 局部变量声明在:方法内、方法形参、代码块内、构造器形参、构造器内部的变量
- 在类中的声明位置不同
class Person {//这是一个类
String name;//属性(成员变量),直接声明在类的{}内
int age = 25;
//这是方法
public void sing (String name){//name就是形参,name为局部变量
System.out.println(name + "会唱歌。");
}
public void talk (String language) {
String s = language //s为局部变量
System.out.println("会说" + s);
}
}
-
关于权限修饰符的不同
- 属性:可以在声明属性时,指明其权限,使用权限修饰符(private、public、protected、缺省)
- 局部变量:不可使用权限修饰符号
-
默认初始化值的情况:
- 属性:类的属性,根据其类型,有对应的默认初始化值。(整型为0,浮点型为0.0,字符型为0或’\u0000’,布尔型为false,引用数据类型为null)
- 局部变量:没有默认值,必须先赋值。特别的:形参在调用时赋值就可以了。
类的成员——方法的详解
先看我们之前定义的Person类的方法:
方法的声明格式
权限修饰符 返回值类型 方法名 (形参列表){
方法体;
}
//方法
public void sing(String name){
//修饰符 返回值类型 方法名(形参列表){
System.out.println(name + "会唱歌。");
//方法体
}
权限修饰符
- 关于权限修饰符
- 默认方法的权限修饰符使用public
- Java规定的4种权限修饰符:private、public、缺省、protected -->讲到封装性再细说
返回值类型
-
返回值类型: 有返回值 vs 没有返回值
- 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
//类中定义: public String talk(String language){ return "会讲" + language; } //...................................... //实例中调用 p1.talk("Chinese"); //注意,只是这样写,不会打印“小明会讲Chinese”,这句代码只是一个“值”,是return返回的值。 String info = p1.talk("Chinese"); System.out.println(info); //打印:小明会讲Chinese
- 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。
-
方法名
- 属于标识符,遵循标识符的规则和规范,“见名知意”
定义多个形参
- 形参列表
- 方法可以声明0个,1个,或多个形参,格式:数据类型1 形参1,数据类型2 形参2,…
- 例如:(String name,int age)
输出://类中定义: public String birthday (String month,int day){//多个形参 return "生日是:" + month + "月," + day + "日"; } //......................................... //实例中调用: String birth = p1.birthday("九",24);//传入两个对应类型的参数 System.out.println(birth);
生日是:九月,24日
return关键字的使用
- return关键字的使用:
- 使用范围:使用在方法体中
- 作用:① 结束方法; ② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据
- 注意:return关键字后面不可以声明执行语句,因为不会执行。
拓展:递归方法
- 方法A中可以调用方法B;也可以调用方法A本身:递归方法。
- 但是方法中,不可以再嵌套定义方法。
public void func1(){
方法体;
}
public void func2(){
func1();//调用另一个方法
func2();//调用自身:递归
}
//错误示范
public void func3(){
public void func4(){}
}
- 注意:使用递归方法时,注意终止条件,否则容易无限循环
例题:用面向对象的方法设计一个程序
接受用户输入m和n,打印m行n列的“*”矩阵,并输出矩阵的面积。
文件名为:mnArraytest.java
import java.util.Scanner;
//先定义类
class mnArray {
public int method(int m,int n){
for (int i = 0;i < m;i++) {
for (int j = 0;j < n;j++) {
System.out.print("* ");
}
System.out.println();
}
return m * n;
}
}
//**********************************************
public class mnArraytest {
public static void main (String[] args) {
mnArray a1 = new mnArray();//类的实例化
Scanner scan = new Scanner(System.in);
System.out.print("请输入行数:");
int hang = scan.nextInt();
System.out.print("请输入列数:");
int lie = scan.nextInt();
System.out.println("面积为:" + a1.method(hang,lie));//a1.method()调用对象a1的method方法
}
}