构造方法与对象的创建
在面向对象语言中,用类声明的变量被称为对象,在用类声明对象后还需要创建对象。
构造方法
类中的构造方法名字必须和它所在的类的名字完全相同,而且没有类型
可以在类中构造方法,允许一个类中编写若干个构造方法,但必须保证它们的参数不同,参数不同是指参数的个数不同,或参数个数相同但参数列表中对应的某个参数的类型不同
需要注意的是,若类中没有编写构造方法,系统会默认该类中有一个构造方法,该默认方法是无参数且方法体中无语句,该构造方法也叫 默认构造方法
若类中定义了一个或多个构造方法,那么java不提供默认的构造方法
注意:构造方法没有类型
public class Demo3 {
int a,b;
Demo3(){ //是构造方法
}
void Demo3(int n,int m){ //不是构造方法,该方法类型是void (有参无返)
a = n;
b = m;
}
int Demo3(){ //不是构造方法,该方法类型是int
return 0;
}
}
创建对象
创建对象分为两个步骤: 对象的声明和声明的对象分配变量
class Text{
int num1;
int num2;
void go(String s){
System.out.println(s);
}
}
public class Application {
public static void main(String[] args) {
//Text eg01; //声明对象
//eg01 = new Text(); //为对象分配变量
Text eg02 = new Text();//同时完成以上两项
eg02.go("测试测试测试");
}
}
new 运算符用来创建对象
一个类可以通过使用new运算符创建多个不同的对象
new标识符只能和类的构造方法进行运算,运算的最后结构是一个十六位进制的数,这个数称作对象的引用 eg: new Text( ) 的值是一个引用
注意:对象的引用存放在栈中,对象的实体(即分配给对象的变量)存放在堆中
(图片来自【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili)
对象的使用
class Text{
int num1;
int num2;
void go(String s){
System.out.println(s);
}
}
public class Application {
public static void main(String[] args) {
Text eg02 = new Text();
eg02.num1 = 10; //对象给自己的变量赋值
eg02.num2 = 20;
eg02.go("测试测试测试");// 赋值加调用
}
}
注意:
一个类声明的两个对象如果具有相同的引用,两者就具有完全相同的变量。当程序用一个类创建两个对象后,两者的引用是不同的,但可以通过赋值操作让它们具有相同的引用。
public class Application {
public static void main(String[] args) {
Text01 eg1 = new Text01(); //声明对象eg1
Text01 eg2 = new Text01(); //声明对象02
//Java中允许 同一个类 的两个对象eg1和eg2进行如下赋值操作
eg1 = eg2;
//注意: 此时eg1中存放的将是eg2的值,也就是eg2的引用,因此他们就具有完全相同的变量(实体)
}
}
例:
public class Application {
public static void main(String[] args) {
Text02 s1 = new Text02(10,15);
Text02 s2 = new Text02(2,6);
System.out.println(s1.a+ "\t"+s1.b); //10 15
System.out.println(s2.a+"\t"+s2.b); //2 6
s1 = s2;//此时把s2的引用赋值给了s1,所以s1和s2本质上是一样的
System.out.println(s1.a+ "\t"+s1.b); //2 6
System.out.println(s2.a+"\t"+s2.b); //2 6
}
}
参数的传值
参数属于局部变量,当对象调用方法时,参数被分配内存空间,同时也要求调用者向参数传递值
习惯上称方法的参数为形参,称向其传值的变量或常量为实参
注意:程序如果改变形参的值,不会影响实参的值,同样,改变实参的值(实参是变量)也不会影响形参的值。
基本数据类型参数的传值
对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别。eg:不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。
可变参数
指在声明方法时不用给出参数列表中从某项开始直至最后一项参数的名字和个数,但这些参数的类型必须相同
public void f(int...x)
在f()的参数列表中,从第一个直至最后一个参数类型都是int型,但连续出现的int型参数的个数不确定,称x是方法f()参数列表中的可变参数的"参数代表"。
public void g(double a,int...x)
在方法g()的参数列表中,第一个参数是double类型,第二个直至最后一个参数都是int类型,但连续的个数不确定,称x是方法g()的参数列表中的“参数代表”。
"参数代表"必须是参数列表中的最后一个
public class Application {
public static void main(String[] args) {
Add eg = new Add();
System.out.println( eg.sum(20,30,50,60)); //相当于子类sum方法中:x[0]=20,x[1]=30
.......
}
}
class Add {
public int sum(int...x){
int sum = 0;
for(int i = 0;i<x.length;i++){
sum += x[i];
}
return sum;
}
}
参数列表可以通过下标运算来表示参数列表中的具体参数,即x[0]、x[1]..........x[n]分别表示x代表的第1~n个参数。
对于可变参数,可以使用增强的for循环语句来遍历参数代表所代表的参数
for(声明循环变量:参数代表){
}
class Add {
public int sum(int...x){
int sum = 0;
for(int example:x){
sum += example;
}
return sum;
}
}