大白成为Java软件攻城狮的第十九天(java构造方法、构造器、对象与引用的概念、参数传递)

构造方法

关于java类中中的构造方法:

1、构造方法又被称为构造函数/构造器/Constructor

2、构造方法语法结构:
[修饰符列表] 构造方法名(形式参数列表){ 构造方法体; }

3、回顾普通方法的语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){ 方法体; }

4、对于构造方法来说,“返回值类型”不需要指定,并且也不能写void。只要写上void,那么这个方法就成为普通方法了。

5、对于构造方法来说,构造方法的方法名必须与类名保持一致。

6、构造方法的作用?

  • 构造方法存在的意义是,通过构造方法的调用,可以创建对象。

7、构造方法应该怎么调用?

  • 普通方法是这样调用的:方法修饰符中有static的时候:类名.方法名(实参列表)、方法修饰符列表中没有static的时候:引用.方法名(实参列表)
  • new 构造方法名(实参列表)

8、构造方法调用执行之后,有返回值吗?

  • 每一个构造方法实际上执行结束之后都有返回值,但是这个“return 值;”这样的语句不需要写。构造方法结束的时候java程序自动返回值。
  • 并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要编写。

9、注释和取消注释:Ctrl + /、 多行注释:ctrl + shift +/\

10、当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。

11、当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动的为当前类提供无参数的构造方法。因为无参数的构造方法太常用了。

构造方法的作用

  • 1、创建对象
  • 2、创建对象的同时,初始化实例变量的内存空间。

成员变量之实例变量,属于队象级别的变量,这种变量必须先有对象才能有实例变量。

实例变量没有手动赋值的时候,系统默认赋值,那么这个系统默认赋值是在什么时候完成的呢?是在类加载的时候么?

  • 不是的,因为类加载的时候只加载了代码片段,还没来得及创建对象。所以此时实例变量并没有初始化。
  • 实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的,完成初始化的。
  • 系统在默认赋值的时候,也是在构造方法执行过程当中完成的赋值。

对象与引用

对象与引用的概念

  • 对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。
  • 引用:是一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向了堆内存当中的对象。
  • 所有访问实例相关的数据,都需要通过“引用.”的方式访问,因为只有通过引用才能找到对象。
  • 只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。

参数传递

主要研究和学习的是方法在调用的时候,涉及到参数传递的问题,到底是怎样传递数据的呢?

  • 值传递

int i = 10;
int j = i ; i传递给j,实际上只是将i变量中保存的10传递给了j,j实际上是一个全新的内存空间

User u = 0x1234;
User u2 = u;
u传递给u2,实际上是将0x1234这个值赋给u2了,u和u2实际上是两个不同的局部变量,但是他们这两个变量指向堆内存中的同一个java对象。

java语言当中方法调用的时候涉及到的参数传递的问题

参数传递实际上传递的是变量中保存的具体值

例一:

public class Test01()
{
    
    
	public static void main(String[] args){
    
    
		
		//int i = 10;
		//add(i)等同于:add(10)
		int i = 10;
		add(i);//add方法调用的时候,给add方法传递了一个变量i,实际上传递的是变量中保存的具体值
		System.out.println("main-->"+ i );
	}

	public static void add(int i){
    
    
		i++;
		System.out.println("add-->"+ i);
	}
}

编译结果:
编译结果
例二:

public class Test02(){
    
    
 public static void main(String[] args){
    
    
        User u = new User(20);
      
       //User u =0x1234;
       //add(u)等同于:add(0x1234)
        add(u);//传递u给add方法的时候,实际上传递的是U变量中保存的值,只不过这个值是一个java对象的内存地址
        System.out.println("main-->"+ u.age);
    }

    public static void add(User u ){
    
    
        u.age++;
        System.out.println("add-->"+ u.age);
    }
}

class User
{
    
    
    int age;
    public User(int i){
    
    
        age = i;
    }
}

编译结果:
在这里插入图片描述
最终结论:

方法调用的时候,涉及到参数问题,传递的时候,java只遵循一种语法机制,就是将变量中保存的“值”传递过去了,只不过有时候这个值是一个字面值10,有的时候是另一个java对象的内存地址0x1234。

猜你喜欢

转载自blog.csdn.net/qq2632246528/article/details/113062589