串行贝叶斯写完了,跟范师兄商量后决定并行的下周再开始写,今天也周五了,事情不太多,就总结下写并行中遇到的问题及解决。
ps: 对java不熟的菜菜伤不起。现在这些东西,也只是刚好能使用,一没完全弄透个中原理,二没发挥Java的强大功能。
1.static关键字.Static可以修饰method,也可以修饰variable,它表示该变量或方法可以被直接访问而不许要类创建对象。相当于C++里的全局变量。比如在class A中有一个方法定义为public static void cmp();则在类A中,任何其他方法中都可以以cmp();的形式调用它。但是,在static修饰的方法中,也只能使用被static修饰的variables。我觉得这一机制是为了保持方法与你变量作用域一致,避免出现由于调用static的方法而误改了类中的局部变量。
2.interface和abstract class的区别。Java中interface和abstract class都可以用来定义抽象类,同时,它们都不能用来创建对象,只有被继承他们的类或者实现他们的类才可以创建对象。我们知道,Java是一种面向对象的语言,一切皆对象。而abstract class和interface则是给出了一个实体的抽象框架,便于其继承类在这个基础框架上施展拳脚。还是写个代码比较能清楚表达。
/*
*抽象类abstract class和接口interface的定义方法
*但它们都是定义的关于Door的抽象概念,不能用其来创建对象
*/
abstract class Door{
abstract void open();
abstract void close();
}
interface Door{
void open();
void close();
}
现在,我们给Door增加一个方法,void alarm(),则定义为:
abstract class Door{
abstract void open();
abstract void close();
abstract void alarm();
}
interface Door{
void open();
void close();
void alarm();
}
现在,我们来继承和实现Door这个抽象类和接口
//实现abstract class 的继承
public class DoorAlarm extends Door{
@Override
void open() {
// TODO Auto-generated method stub
System.out.println("open");
}
@Override
void close() {
// TODO Auto-generated method stub
System.out.println("close");
}
@Override
void alarm() {
// TODO Auto-generated method stub
System.out.println("alarm");
}
public static void main(String[] args){
DoorAlarm door = new DoorAlarm();
door.open();
door.close();
door.alarm();
}
}
//实现interface 的继承
public class DoorAlarm implements Door{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("open");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("close");
}
@Override
public void alarm() {
// TODO Auto-generated method stub
System.out.println("alarm");
}
public static void main(String[] args){
DoorAlarm door = new DoorAlarm();
door.open();
door.close();
door.alarm();
}
}
它们的区别在于1)对于抽象类的继承不能多重继承,即一个类只允许有一个extends。而对于interface的implements则是不限的.2)它们最实质的区别在于:abstract class A的意思是继承它的那个类B is contained by A.that is B⊆ A. 而interface更侧重于实现一个抽象定义的方法,像是C++中的函数重载,而抽象类则像是C++中的纯虚函数。它们共同使用,才能完美地体现面向对象的理念。如上述AlarmDoor的例子,alarm本不是Door的一般属性,按照面向对象的思想,它更倾向于属于一个Alarm接口,除了alarm()外,还有setAlarm(), getAlarm()方法等,并且它在不同的对象上的实现的方式也不尽相同,比如在door上,car上等。但是我们却把它硬拉进了Door的基本抽象概念类型中。这不科学。一种好的实现方式是Door和Alarm分属两个类,对于AlarmDoor来讲,它是一种Door,而alarm是Alarm接口的一种方法的具体实现,所以可以定义类AlarmDoor为class AlarmDoor extends Door implements Alarm{ }。
3.不同的class之间,如果想要把class A中的变量修改后传递到另一个class B中,可以使用的方式:1)可以在B中使用到A中变量的方法的参数列表中加上一个A的对象 2)可以在类B中new一个A的对象,再根据这个对象来获取A中的那几个变量,不过这就要注意到设置那几个参数的方法与低当前B中方法的调用的先后顺序,否则取不到正确的值。
4.Java中的文件读写。记住:一切皆对象。实现方法之一:
BufferedReader in = new BufferedReader(new FileReader("filepath1"));
/*现在就可以用in这个对象来操作读文件了。比如:,读取一行*/
String s = in.readLine();
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("filepath2")));
out.println(s);//向file2中写入从file1中读取的一行s。
//最后,记得关闭文件
in.close();
out.close();
5.有效率的存分配。在对于像2.3维数组的空间分配时,可能总的空间需要很大,但是并不要求它们是连续的,所以我们就可以采取分块分配的策略,以节省内存中的零散空间。以一个整形三维数组的内存分配为例:
int[][][] attrClass = new int[cn][][];
for(int i=0;i<cn;i++){
attrClass[i] = new int[an][];
for(int j=0;j<an;j++){
attrClass[i][j] = new int[al[j]];
}
}