Java的数据传递

前言:

程序的目的是通过编制方法(函数)得到想要的数据。归根结底,编程只做了三件事:原始数据输入,传递(共享)数据,数据运算。在Java中,并没有全局变量这个概念,所以数据的传递显得比较重要。那么它是怎么传递数据的呢?尝试一些编程方法来总结

持续更新。。。

目录:

1.类继承

2.对象成员

3.接口

----------------------------------------------2023.2.4Update-------------------------------------------------------------

重要说明:

各位朋友,俺感到非常抱歉,因为这篇帖子的思路不是太好,容易把人带偏,所以停止更新。问题出在俺对继承关系的理解不够,实际代码如果照这样写,估计会被人打的掩面。您可以在有一定熟悉程度情况下再随便看看

既然写了俺也不准备删了,就当给在学习道路上走过的弯路留个记录。

对第2部分的对象成员,准确表述应该是“引用类型作成员变量”,引用类型指除了基本数据类型以外的类型,包括类,接口。引用类型相当于指针那部分倒是没有什么问题。

-------------------------------------------2022.11.16Update-------------------------------------------------------------

1.类继承

建立父类Father.java和子类Son.java,一个测试类App.java

Father.java

package test2;

public class Father {

    private static int data;
    private static int dataAdd;
    private int userAge;
    private String userName;
    /*静态方法产生静态数据*/
    public static void classAdd(int a,int b){
        int c=a+b;
        Father.dataAdd=c;
    }

    public static int getDataAdd() {
        return dataAdd;
    }

    public static void setDataAdd(int dataAdd) {
        Father.dataAdd = dataAdd;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public static int getData() {
        return data;
    }

    public static void setData(int data) {
        Father.data = data;
    }
}

Son.java

package test2;

public class Son extends Father{
    /*可以用,使用了父类对象*/
    public int add(int a,int b,Father father){
        int c=a+b;
        father.setUserAge(c);
        return c;

    }
/*不能用,和父类对象没联系*/
//    public int add(int a,int b){
//        int c=a+b;
//        super.setUserAge(c);
//        return c;
//    }
    /*可以用,交给父类静态数据*/
    public void add(int a,int b){
        int c=a+b;
        super.setData(c);
    }
}

App.java    -----表现类

package test2;
/*
* 测试能否把子类数据传到父类
* */
public class App {
    public static void main(String[] args) {
        Father father = new Father();
        Son son = new Son();
        /*可以用,传给父类静态数据*/
        son.add(3,14);
        System.out.println(Father.getData());
        /*可以用,传给父类对象*/
        son.add(3,4,father);
        System.out.println(father.getUserAge());
        /*父类静态方法产生静态数据*/
        Father.classAdd(3,20);
        System.out.println(Father.getDataAdd());
    }
}

分别用了两种方法:

一是将父类对象成员userAge作为共享数据;

二是将父类的静态成员Data作为共享数据;

还有一个静态成员dataAdd,采用父类静态方法生成数据,和共享数据没有关系。

------------------------------------------------------2022.11.22update--------------------------------------------------

2.对象成员 

个人认为这是Java的核心之一,实际上Java的程序组织都是通过对象成员来实现的,而比较少用到类继承的方法,即上一种思路。

顺带提一下,类是数据模板,对象是数据,对象中的属性也是数据,接口定义对象方法,这基本上是Java的标准写法。

步骤一:定义数据类User.java,以及getter和setter方法

package test4;

public class User {
    public static int  Number=3;
    private String name="jack";
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

步骤二:定义测试类TestUser.java

package test4;

public class TestUser {
    private User user1;
    /*构造方法传入数据对象*/
    public TestUser(User user) {
        this.user1 = user;
    }
    /*获取数据对象*/
    public User getUser() {
        return user1;
    }

    public void setUser(User user) {
        this.user1 = user;
    }
    /*当前对象设置数据对象的属性的方法*/
    public void change(String name){
        user1.setName(name);
      }

    public static void main(String[] args) {
        User user = new User();
        String name;
        TestUser testUser = new TestUser(user);
        /*当前对象获取数据对象中的属性name*/
        name = testUser.getUser().getName();
        System.out.println(name);
        /*数据对象设置自身属性name*/
        user.setName("gogo");
        name = testUser.getUser().getName();
        System.out.println(name);

        /*当前对象设置数据对象的属性name*/
        testUser.getUser().setName("middle");
        name = testUser.getUser().getName();
        System.out.println(name);

        /*当前对象修改数据对象属性*/
        testUser.change("after");
        System.out.println(user.getName());

        /*访问数据对象的静态属性直接通过类访问,不推荐对象访问,idea有提示*/
//      int Number = testUser.getUser().Number;
        int number = User.Number;
        System.out.println(number);

    }
}

下面是测试截图:

 可以看出测试类对象testUser下的user1的哈希值(地址){User@485}和数据类对象user的哈希值一致,说明两个对象是同一个。

开始可能会有疑问:把数据对象传入新对象中,修改新对象中的成员对象user1不会对原始数据对象产生影响。而从程序看来,修改传入的对象数据user1,同时原始数据对象user的值也被修改。

下面name的值为什么还是“middle”,因为没有用name去接收testUser.change("after");的返回值,其值仍然等于上一步的返回值:

name = testUser.getUser().getName();

小结:

上述表达的含义如下:当一个类用了另一个类对象作为成员,即可完全控制该对象的数据

                                    和C语言对比:对象的传递相当于指针的传递,对象相当于指针。因为先学C语言,所以指针的概念放进来便于理解。C语言中用指针传递数据表示可以改变原始数据,所以在java中用对象传递数据,也可以改变原始数据,也就是通常所说的java用值传递。

------------------------------------------------------2022.12.8update--------------------------------------------------

3.接口

 如果用对象成员可以解决所有数据传递的问题,那么使用接口则在此基础上更进一步,在抽象层面上完成数据传递。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jllws1

你的鼓励是我创作的动力,谢谢

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

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

打赏作者

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

抵扣说明:

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

余额充值