前言:
程序的目的是通过编制方法(函数)得到想要的数据。归根结底,编程只做了三件事:原始数据输入,传递(共享)数据,数据运算。在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.接口
如果用对象成员可以解决所有数据传递的问题,那么使用接口则在此基础上更进一步,在抽象层面上完成数据传递。