java中关于其他类方法改变主类属性的一些存在过的疑虑和自己的理解

在主类中实例化其他的实例对象,list是主类的成员方法,通过构造方法传入一个ArrayList的参数List,被调用类为什么能改变主类的List?传参进去不就是另一个list了吗,调用类的list给他加入元素为啥主类的list同时也添加?我之前一直不理解,后来想想就想通了,因为list是个引用数据类型啊,引用数据类型是通过确定参数的地址来获取值得,主类的list和调用类的list实际上是指向同一个地址所以调用类的list改变当然能引起主类list的改变啦。就和C语言的传址调用函数是一个道理

 ,传址调用就是把参数真实地参与函数过程,通过函数改变传入参数的值。
这是详细代码
被调用类ModifyStudentView.java

package a;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ModifyStudentView {
JTextField nameText;
JTextField sexText;
JTextField ageText;
List<Student> list;
JFrame frame;
int a;
File file = new File("C:/Users/cxjaq/Desktop/stu.txt");
StudentTableModel model;

public ModifyStudentView(List<Student> list, StudentTableModel model,int a) {
this.list = list;
this.model = model;
this.a=a;
}

public void init() {

frame = new JFrame();
frame.setSize(300, 400);
frame.setLocationRelativeTo(null);
frame.setTitle("修改学生");

JPanel mainPanel = (JPanel) frame.getContentPane();
BoxLayout boxLayout = new BoxLayout(mainPanel, BoxLayout.Y_AXIS);
mainPanel.setLayout(boxLayout);

JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
JPanel panel3 = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
JPanel panel4 = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));

mainPanel.add(panel1);
mainPanel.add(panel2);
mainPanel.add(panel3);
mainPanel.add(panel4);
// 姓名
JLabel nameLabel = new JLabel();
nameLabel.setText("姓名");
panel1.add(nameLabel);

nameText = new JTextField();
nameText.setPreferredSize(new Dimension(120, 30));
nameText.setText(list.get(a).getName());

panel1.add(nameText);
// 性别
JLabel sexLabel = new JLabel();
sexLabel.setText("性别");
panel2.add(sexLabel);

sexText = new JTextField();
sexText.setPreferredSize(new Dimension(120, 30));
sexText.setText(list.get(a).getSex());
panel2.add(sexText);
//年龄
JLabel ageLabel = new JLabel();
ageLabel.setText("年龄");
panel3.add(ageLabel);

ageText = new JTextField();
ageText.setPreferredSize(new Dimension(120, 30));
ageText.setText(String.valueOf(list.get(a).getAge()));
panel3.add(ageText);



JButton saveBtn = new JButton();
saveBtn.setText("保存");
saveBtn.setPreferredSize(new Dimension(90, 30));
panel4.add(saveBtn);
saveBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
String name = nameText.getText();
String sex = sexText.getText();
int age = Integer.parseInt(ageText.getText());
list.get(a).setName(name);
list.get(a).setSex(sex);
list.get(a).setAge(age);
frame.dispose();
save();
model.fireTableDataChanged();
JOptionPane.showMessageDialog(null, "修改成功","标题",JOptionPane.WARNING_MESSAGE);
}
});
frame.setVisible(true);

}

public void save() {
try {
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
oos.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

 

 

 

主类Student.java

List<Student> list = new ArrayList<Student>();

File file = new File("C:/Users/cxjaq/Desktop/stu.txt");
StudentTableModel model;
JTextField nameText;
JTextField sexText;
JTextField ageText;
int a=1;

JTable table ;
String name;
String sex;
String age;

JButton modifyBtn = new JButton();
modifyBtn.setText("修改");
modifyBtn.setPreferredSize(new Dimension(90, 30));
panel3.add(modifyBtn);

modifyBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// a=table.getSelectedRow();
// ModifyStudentView msv = new ModifyStudentView(list, model,a);
// msv.init();
try {
a=table.getSelectedRow();
ModifyStudentView msv = new ModifyStudentView(list, model,a);
msv.init();
} catch (ArrayIndexOutOfBoundsException e2) {
// TODO: handle exception
JOptionPane.showMessageDialog(null, "请选中修改项","标题",JOptionPane.WARNING_MESSAGE);
}
}
});

posted @ 2017-08-07 09:22  南亚传奇  阅读(165)  评论(0编辑  收藏  举报