【java】写Naive Bayesian过程中用到的

本文详细解析了Java中的静态关键字、抽象类与接口的区别,以及如何利用Java进行高效文件读写。通过实例代码,深入理解面向对象编程思想在Java中的应用,掌握文件操作的关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串行贝叶斯写完了,跟范师兄商量后决定并行的下周再开始写,今天也周五了,事情不太多,就总结下写并行中遇到的问题及解决。

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]];
			}
		}


6.Set与HashSet的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值