Java 11 面向对象—参数传递

本文详细介绍了Java中对象的概念,强调对象是通过new运算符在堆内存中创建的,并讨论了引用如何保存对象的内存地址。此外,文章还探讨了参数传递的机制,指出Java中参数传递是按值传递,但对象参数实际上是传递对象的引用。通过实例展示了构造方法、this关键字的使用,以及静态与非静态方法的区别。最后,通过代码示例总结了this关键字的使用场景及其在实例方法和构造方法中的作用。

对象 和 引用

对象: 目前在使用 new 运算符 在堆内存中开辟的内存空间 称为 对象。
堆内存的 空间

引用: 是一个变量,不一定是局部变量。还可能是成员变量,引用保存了内存地址,指向了堆内存当中的对象。
空间的 地址

所有访问实例相关的数据,都需要通过 “引用” 的方式访问, 因为 只有通过引用才能找到对象。

只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。

class Student{
	Computer com; //com是一个引用的实例变量
public static void doSome(){
	Computer cc; //cc是一个引用的局部变量
	}

参数的传递

方法在调用的时候,参数是如何传递的?

java语言中,方法调用的时候,涉及到参数传递问题,
参数传递实际上是传递的变量中保存的具体的值。


int i = 10;
add(i);

等同于 add(10);


public class Test {
  public static void main(String[] args) {
    int i = 10;
    add(i);
    System.out.println("main--->" + i); // 10
  }

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

在这里插入图片描述

传递 对象地址 举例:

/*


*/
public class Test {
  public static void main(String[] args) {
    User u = new User(20);
    add(u);
    System.out.println("main--->" + u.age); // 21
  }

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


class User{
  //实例变量
  int age;
  //构造方法
  public User(int i){
    age = i;
  }
}

在这里插入图片描述
小结:
方法调用的时候,涉及参数传递的问题,就是将变量中 保存的 “值” 传递过去,只不过有时候这个值 是一个字面值10,有时候,这个值是另一个java对象的内存地址。

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

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

总结

OOA OOD OOP
封装 继承 多态
转换作用
类:抽象概念,抽象模板;包含两部分:状态 + 行为。
对象—>类 抽象
类—>对象 实例

成员变量:方法体外,全局变量
局部变量: 实例变量 和 静态变量
访问实例对象 得首先 创建对象,因为实例变量存储在 java堆内存中,需要先创建对象new,才能调用(通过引用访问)。

封装:将复杂的问题,封装起来,对外提供一个简单的操作入口,操作人员只能通过入口操作。
保证数据安全,操作简单,增加可移植性和可复制性。
1.属性私有化 private
2.提供两个方法 set 和 get,set修改实例变量,get读取数据。set涉及数据修改,需要做安全控制。

方法带static 类名.方法名
方法不带static 引用.方法名
set和get都不带static。

构造方法:作用:创建对象,初始化实例变量,构造方法不需要写返回值类型。
特点:方法名和类名一样
调用:new 运算符
调用后,返回一个数据变量,指向堆内存的开辟的空间

实例变量是在构造方法 创建对象 初始化的时候创建的
构造方法 的初始化,不写,系统默认有。

this关键字

this 保存内存地址,指向自身

关于java语言当中的this关键字:
        1this是一个关键字,翻译为这个
        2this是一个引用,this是一个变量。this变量保存了内存地址,指向自身。
        3this在实例方法中,this指向当前正在执行的动作的对线。(this代表当前对象)、this可以省略不写

在这里插入图片描述
当使用c1去访问该对象的话,整个过程中出现的this就是c1。
当使用c2去访问该对象的话,整个过程中出现的this就是c2。

package test3;


/*
关于java语言当中的this关键字:
        1、this是一个关键字,翻译为这个
        2、this是一个引用,this是一个变量。this变量保存了内存地址,指向自身。
        3、this在实例方法中,this指向当前正在执行的动作的对线。(this代表当前对象)、this可以省略不写
        4、this不能使用在static的方法当中
 */
public class Customer {

    //姓名 「对内存的对象内部中存储,所以访问该数据的时候,必须先创建对象,通过引用方式访问」
    String name; //实例变量: 必须采用引用的方式

    //构造方法
    public Customer(){

    }

    //不带有static关键字的一个的方法
    //顾客购物的行为
    // 每一个顾客购物的最终结果是不一样的
    // 所以购物这个行为属于对象级别的行为
    // 由于每一个对象在执行购物这个动作的时候最终结果不同,所以购物这个动作必须有对象的参与。

    // 没有static关键字的方法 实例方法,实例方法 必须 通过 引用 访问
    // 没有static关键字的变量 实例变量
    // 当一个行为执行的过程,需要对象的参与,那么这个方法一定要定义为 实例方法,不要带static。

    //以下方法定义为实例方法,因为每一个顾客在执行购物的时候,最终的结果是不同的。
    public void shopping(){
        System.out.println(this.name + " is shopping.");
//        System.out.println(name + " is shopping."); 0
    }

    public static void doSome(){
//        System.out.println(this.name); //erreor 执行过程中,没有当前对象,不存在this,因为this代表 当前对象
    }

    public static void doOther(){
        //可以采用以下方案,但是以下方案,绝对不是访问当前对象的name
        Customer c = new Customer();
        System.out.println(c.name); // 这里的name是创建出来c对象的name
    }
}

package test3;

/*

 */

public class Test {
  public static void main(String[] args) {
  // 创建Customer对象
    Customer c1 =new Customer();
    c1.name = "zs";
  // 再创建Customer对象
    Customer c2 = new Customer();
    c2.name = "ls";

    c1.shopping(); //zs在购物
    c2.shopping(); //ls在购物

    //调用doSome方法(修饰符上有static)
    // 采用 类名.方法名 的方式访问(不需要对象的参加)
    Customer.doSome();

    Customer.doOther();
  }
}

实例方法一定是 有了对象之后,才能调用的。
带有static的方法不能直接访问实例变量和实例方法,因为没有对象的存在,当然new了一个之后就可以用了。

package test3;

/*

 */

public class Test {
  int num = 10;
  public static void main(String[] args) {

    //访问当前对象的属性
//    System.out.println(num); //error
    //想访问num怎么办? ---》 new对象
    Test t = new Test();
    int num = t.num;

    doSome(); //带static方法调用

    t.doOther();// 实例方法调用: 引用.方法名
  }

  //带有static
  public static void doSome(){
    System.out.println("do Some!");
  }

  //实例方法
  public void doOther(){
    System.out.println("do Other!");
  }
}
创建对象 构造函数 构造方法 一起使用 综合例子
package test3;
/*
用来区分局部变量 和 实例变量的时候不可以省略
 */
public class User {

    //属性
    private int id; //这里id是局部id
    private String name;
    // 构造函数 set and get
    public void setId(int id){
        this.id = id; //this表示当前对象  ,这里 id是局部变量
    }

    // 构造方法
    public User(int id, String name){
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package test3;

/*

 */

public class Test {

  public static void main(String[] args) {

    User u1 = new User(100, "zs");
    System.out.println(u1.getId());
    System.out.println(u1.getName());

    //修改名字
    u1.setName("ls");
    System.out.println(u1.getId());
    System.out.println(u1.getName());
  }
}

例子2:
创建日期类
当程序员调用无参的构造方法。默认日期是1970-1-1
对外提供可以讲日期打印输出到输出台

package test3;

public class Date {

  // 属性
  private int year;
  private int month;
  private int date;

  // 构造函数
  public Date(int year, int month, int date) {
    this.year = year;
    this.month = month;
    this.date = date;
  }

  public Date() {
//    this.year = 1970;
//    this.month = 1;
//    this.date = 1;

    //构造方法的调用
    // 这种方法不会创建新的java对象,但同时又可以调用其他的构造方法
    this(1970,1,1);
  }

  public int getYear() {
    return year;
  }

  public void setYear(int year) {
    this.year = year;
  }

  public int getMonth() {
    return month;
  }

  public void setMonth(int month) {
    this.month = month;
  }

  public int getDate() {
    return date;
  }

  public void setDate(int date) {
    this.date = date;
  }

  public void print(){
    System.out.println(this.year + "年" + this.month + "月" + this.date + "日");
  }
}

package test3;

/*

 */

public class Test {

  public static void main(String[] args) {

    Date time1 = new Date();

    Date time2 = new Date(2008,8,8);

    time1.print();

    time2.print();
  }
}

根据以上例子总结—>This 用在哪里

1.可以用在 实例方法当中,代表对当前对象调用。
2.可以用在 构造方法当中,通过当前的构造方法调用其它方法,但是只能放在第一行,

将以上内存穿起来的例子

package test3;

/*

 */

public class Test {

  //带有static的方法
  public static void method1(){
    //调用doSome
      //完整方式的调用
    Test.doSome();
      //省略方式的调用
    doSome();
    //调用doOther
    Test t = new Test();
    t.doOther();
    //访问i
    int t2 = t.i;
  }
  //没有static的方法
  public void method2(){
    //调用doSome
    //完整方式的调用
    Test.doSome();
    //省略方式的调用
    doSome();
    //调用doOther
    this.doOther();
    //访问i
    int t2 = this.i;
  }

  // 主方法
  public static void main(String[] args) {

    //调用method1
    method1();
    //调用method2
    Test t = new Test();
    t.method2();
  }
  //没有static的变量
  int i = 10;

  //带有static的方法
  public static void doSome(){
    System.out.println("do Some!");
  }

  //没有static的方法
  public void doOther(){
    System.out.println("do Other!");
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值