java入门——类与对象(认知篇)


类的认识

什么是类呢?首先举个简单的例子:
在这里插入图片描述

这是一个学生类,学生下面有不同的对象Student1,Student2,…… Studentn,学生有自己的姓名,性别,身高,年龄等信息,这些信息是学生类的属性,而每个学生有着自己的行为,比如:努力学习,参加竞赛,唱歌等等行为,由此说明类有着自己的属性和行为,在类中我们通过成员变量来描述属性,通过成员方法来描述行为。

通过上述描述,我们可以有很明显的感觉,类是抽象的,我们不能够详细地描述出来,但是对象是实实在在存在的个体。具有相同的属性和行为的对象共同的组成了一个类,就像上述的学生类,每个学生都有自己的姓名,身高等,同样学生需要学习,做自己的事情等。

类的创建

📖类的定义格式

[类修饰符] class 类名{

[修饰符] 数据类型 成员变量名;

[修饰符] 返回值的数据类型 方法名(参数1,参数2,…,参数n){

方法体;

return [表达式];

​ }

}

🥠类的举例

public class Student{
    String name;
    double height;
    char sex;
    int age;
    public void read(){
        System.out.println("在看书");
    }
    public double average(double Chinese,double English){
		double aver=(Chinese+English)/2;
        return aver;
    }
}

需要注意的是:

🍥相互对立的修饰符不能同时在一个类中使用;

🍥一个成员变量可以被两个以上的修饰符同时修饰,但是有些修饰符不能同时使用;

🍥成员方法与成员变量类似。

我们可以轻易地发现在类中有变量,在方法中也可以有变量,但是这两种变量究竟有什么区别呢?

在类中定义的变量称为成员变量,而在方法中定义的变量称为局部变量。

  • 修饰符有异同;
  • 从内存角度看,成员变量属于对象的一部分,而对象是存在于堆内存中的,局部变量是存在栈内存当中的;
  • 从生存时间看,由于成员变量是对象的一部分,所以有对象就有成员变量,也就是说随着对象的创建而存在,局部变量是属于方法的一部分,当方法被调用时,局部变量产生,当方法结束时,局部变量自动消失;
  • 成员变量一般情况下没有被赋值,会被自动地根据类型进行赋值。局部变量必须赋值后才能使用。

对象的创建和使用

对象的生命周期是:创建–>使用–>销毁。

对象是类的实例,对象是属于某个已知的类。所以创建一个对象我们可以通过下列步骤创建:

//步骤1:声明指向“由类所创建的对象”的变量
Student s1;
//利用new运算符创建新的对象,并将其指派给上面所创建的变量S1
s1=new Student(); //变量s1指向new创建的新的对象

由于步骤1中有s1,步骤2中也有s1,所以我们可以猜想是否可以合并一下变成下面的形式:

Student s1=new Student();

答案是可以的。对于新创建的对象s1,因为是通过Student类创建而来的,所以它具有保存数值的变量name、height、sex、age变量,拥有read、average方法。

我们以Student作为变量类型在栈空间中定义了变量s1,用来指向通过new运算符在堆内存中创建的一个Student类的实例对象。

我们来看一下内存分配情况:

在这里插入图片描述

实际上,s1变量是指向由Student所创建的对象,故s1可以看做是对象的名称,s1并不是对象本身,我们可以理解s1起到的是引导作用。

我们所定义的变量都需要赋初值,当对象被创建时,对象中各种类型的成员变量都会自动初始化。

成员变量类型初始值成员变量类型初始值成员变量类型初始值
byte0long0Lbooleanfalse
short0float0.0Fchar‘\u0000’
int0double0.0D所有引用类型null

对象创建的作用就是为了我们能够访问到对象的成员,访问格式如下:

🍥对象名.对象成员

为了更好的记忆,我们可以将格式中的.理解为"的"的意思。简单举例:s1.name代表的是对象s1的name成员,也就是s1的名字。对对象的成员赋值例如下面格式:s1.name=“张三”。

在类定义内部,方法与方法之间也可以实现相互调用,比如说我们数学上学的圆柱体,首先我们需要有底面圆半径和圆柱高,通过半径计算底面圆面积,借用面积与高实现体积的计算。

在这里插入图片描述

在体积的计算中,我们需要借用面积,而用语言表达则是,在求体积的方法中调用求面积的方法,这就是在类的内部实现方法之间的调用。

🍪一丢丢的小细节:

🍥在类的内部中,本类的某个方法需要调用本类中其他方法时,不需要加上对象名;

🍥如果强调是对象本身的成员的话,则可以再成员名前加this关键字

🍥当成员变量与成员方法中的局部变量同名时,在方法内对同名变量的访问是指的局部变量,当我们特指成员变量时,需要用this关键字。

参数的传递

以变量为参数调用方法

示例:

    public void average(double Chinese,double English){
		double aver=(Chinese+English)/2;
         System.out.println(aver);
    }

在方法中的参数变量Chinese,English都是局部变量,它们的作用范围为average方法内部,超出范围无效。

以数组为参数或返回值的方法调用

传递数组示例:

pubilc static void main(String[] args){
int a[]={6,23,4,7};//定义一维数组
    MinNumber min_1=new MinNumber();
    min_1.least(a);//将一维数组a传入laest()方法
}
class MinNumber{//定义一个类
    public void least(int arr[]){//参数arr接收一维整型数组
	int temp=arr[0];
        for(int i=0;i<arr.length;i++)
            if(temp>arr[i])
                temp=arr[i];
        System.out.println("最小的数为:"+temp);
    }
}

返回值为数组类型的方法示例:

pubilc static void main(String[] args){
    int a[][]={{1,2,3},{4,5,6},{7,8,9}};//定义二维数组
    int b[][]=new int[3][3];
    Change_1 pose=new Change_1();
    b=pose.transpose(a);
}
class Change_1{
    int temp;
    int [][] transpose(int arr[][]){//返回值和参数均为二维数组
	for(int i=0;i<arr.length;i++)
        for(int j=i+1;j<arr[i].length;j++){
			//实现行列交换
            temp=arr[i][j];
            arr[i][j]=arr[j][i];
            arr[j][i]=temp;
        }
    return array;//返回二维数组
    }
}

方法中的可变参数
📖语法格式

返回值类型 方法名(固定参数列表,数据类型…可变参数名)

{

​ 方法体

}

数据类型…可变参数名由于个数可变,所以相当于数组。可变实参实际上以数组的形式被保存下来,而可变参数名就是数组名。

🍥如果方法中有多个参数,可变参数必须放在最后一位;

🍥可变参数符号"…"要位于数据类型和数组名之间,其前后可有空格;

🍥调用可变参数方法时,在方法体中以数组的形式访问可变参数。

匿名对象

在生活中匿名代表着什么——没有名字,这里的匿名对象也是没有名字,举个例子,我们之前创建对象是这样创建的:

Student s1=new Student();
s1.average(80.5,78.5);
//当我们采用匿名对象时
new Student().average(80.5,78.5);

从上述代码段看,我们将第一行的s1整体代换到第二行的s1中,在第四行代码中,new Student()就是匿名对象。当方法执行完后,该对象就成为了垃圾。

那么问题来了,我们什么时候使用匿名对象呢?

🍥如果对一个对象只需要一次调用,我们使用匿名对象;

🍥将匿名对象作为实参传递给一个方法调用时。比如我们定义一个方法getMessage需要接收Student类对象作为参数则:

public static void getMessage(Student s1){

}
//我们可以用这样的语句调用getMessage方法
getMessage(new Student());

小结

🍥类是把事物的数据和相关功能封装在一起,形成的一种特殊结构;

🍥同一个java程序中,最多只能有一个类声明为public,此时文件名要和public类名保持一致;

🍥若方法本身没有返回值,则必须在方法定义的前面加上关键字void。

📖回顾:

🍪匿名对象是什么?

🍪成员变量和局部变量有哪些异同?

🍪创建属于某类的对象需要那些步骤?

🍪在类的外部我们能否访问到类内部的成员?

🍪当需要强调"对象本身的成员"时,我们应该怎么做?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会写呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值