扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
什么是类呢?首先举个简单的例子:
这是一个学生类,学生下面有不同的对象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起到的是引导作用。
我们所定义的变量都需要赋初值,当对象被创建时,对象中各种类型的成员变量都会自动初始化。
成员变量类型 | 初始值 | 成员变量类型 | 初始值 | 成员变量类型 | 初始值 |
---|---|---|---|---|---|
byte | 0 | long | 0L | boolean | false |
short | 0 | float | 0.0F | char | ‘\u0000’ |
int | 0 | double | 0.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;iarr[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 //实现行列交换
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。
📖回顾:
🍪匿名对象是什么?
🍪成员变量和局部变量有哪些异同?
🍪创建属于某类的对象需要那些步骤?
🍪在类的外部我们能否访问到类内部的成员?
🍪当需要强调"对象本身的成员"时,我们应该怎么做?
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流