Java小结

[b]一.继承,多态,重写[/b]
[u]1.继承 :[/u]降低工作量,降低程序的复杂性,使程序提高可扩展性......
一个类继承另一个类(一个接口继承另一个接口)的关键字是extends,类之间的继承只能一对一,不能继承多个类。
继承的格式:public class 子类名 extends 父类名{}
一个类继承接口的关键字是implements;一个类可以继承多个接口,接口之间用逗号隔开;
继承的格式:public class 类名 implements 接口名,接口名……{}
继承到了什么
子类继承到了父类的所有公有属性和公有方法,构造函数是不能被继承的。
[u]2.多态:[/u]多态是指:虽然是同一类型的对象,但在具体的调用时,由于继承和重写机制,方法执行的结果不同。也就是,只有运行时才知道结果是什么,这是Java和其他编程语言的一个不同点。
[u]3.重写:[/u]重写是指,在子类中对从父类继承来的方法进行重写,即保持方法定义的不变,但方法内部实现同父类的不同。下面用一个列子来把这三个东东联系起来。
先写一个StudentModle接口
public interface StudentModle{
public void study();
public void play();
}
写一个Student类继承StudentModle接口
public class Student implements StudentModle{
//实现接口中的方法
public void study(){
System.out.println(“我在学习中……”);
}
public void play(){
System.out.println(“我在游戏中……”);
}
}
好了,在写一个UNStudent子类来继承父类Student类
public class UNStudent extends student{
//重写父类的study方法
public void study(){
System.out.println(“我是大学生,我在学习……“);
//子类特有的方法
public void makeGF(){
System.out.println(“我在约会呢……”);
}
}
}
线索已经十分清晰了,UNStudent类的对象可以掉用父类中的所有方法,同时又具有自己独特的方法。
[b]二.数据类型、值传递和引用传递有什么区别,String是什么传递[/b]
[u]1. 数据类型:[/u]Java中的数据类型分为两大类,即原始数据类型和对象类型(或引用类型),后者是由Java类生成的对象的类型。
其中基本类型包括:byte(1字节),int(4字节),short(2字节),long(8字节),char(2字节),float(4字节),double(8字节),boolean(true/flase)。
[u]2. 值传递:[/u]值传递只要指在基本数据类型之间在调用传递时遵守的规则。
即:将目标变量的值重新拷贝一份,传递到新的变量中,这样就形成了两份独立的数据。如果对新的变量的值做任何修改,是不会影响到目标变量的值;反之一样。
[u]3. 引用传递:[/u]引用传递:适用于所有的类类型(自定义的类类型) ,创建对象的时候,对象名中保存的是对象实例在内存中的地址,如果对对象名做修改,对象实例是不会受到影响的。
[u]4. Sting的传递:[/u]首先,Sting是Java里面的一个特殊的类,而不是一种基本数据类型,它有自己的方法和属性,所以Sting的传递是引用传递。
[b]三.3.Set如何遍历,有哪些子类、List如何遍历,有哪些子类、Map如何遍历,有哪些子类
Map中是否可以放入null的key或Vlaue?Set,List呢?[/b]Set是一个接口,不能直接创建对象,它实现的子类有:HashSet、TreeSet、LinkedHashSet、JobStateReasons、EnumSet>、CopyOnWriteArraySet、ConcurrentSkipListSet、AbstractSet,其中常用的有HashSet、TreeSet两个。它的对象是一个无序的集合,要遍历则得到对象的迭代器,方法为:java.util.Iterator iterator=对象名. iterator(),遍历时的格式为:
while(iterator.HasNext){
for(int i=0;i<对象名.size();i++){
System.out.println(iterator.next());
}
}
List也是一个接口,它实现的子类有:AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector,其中,比较常用的有ArrayList,它的遍历方法用for循环来。格式为:
for(int i=0;i<变量名.size();i++){
System.out.println(变量名.get(i));

}
Map 同样是一个接口,它的子类有:AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap。它的遍历比前面两个都复杂。它首先要得到Key的集合。格式为:java.util.Set set = 变量名.keySet();然后再得到set的迭代器:java.util.Iterator iterator = set.iterator();最后通过while循环;
while (iterator.hasNext()) {
E string = iterator.next();
Value值类型 count = map.get(string);
System.out.print(string + "\t" + count + "\n");
}
[b]四. 递归与循环的区别[/b]一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。使用递归时应该注意:1) 递归就是在过程或函数里调用自身;
2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
在很多种情况下,迭代和递归都可以完成相同的功能, 不过递归有些功能迭代就完成不了。 并且代码没有递归简洁,熟练使用递归后能提高代码质量。
循环是指一个过程或函数在其定义或说明中不断地重复某个过程,当不满足条件时退出循环,循环也必须有出口,否则就是死循环。其实递归是循环的一种特殊的形式。

[b]五.I/O流继承体系结构图和分类。文件复制的实现,原始数据类型读写[/b]2.文件复制的实现:
源码:

public class ReadFile {
public static void main(String args[]) {
ReadFile rf = new ReadFile();
// 文件的路径
String path = "C:\\Documents and Settings\\Administrator\\桌面\\MATLAB基础教程.pdf";

String dest = "C:\\Documents and Settings\\Administrator\\桌面\\2.pdf";

//得到系统的时间戳
long start = System.currentTimeMillis();
// 写文件
rf.copyFile(path, dest);
long end = System.currentTimeMillis();
long res = end-start;
System.out.println("复制完毕,耗费时间:"+res+"ms");
}

/**
* 文件拷贝
*
* @param src:被拷贝的文件路径
* @param dest:拷贝后的文件路径
*/
public void copyFile(String src, String dest) {
try {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
int i = fis.read();
while (i != -1) {
// 将读取到的字节写出去
fos.write(i);
// 读取下一个字节
i = fis.read();
}
fos.flush();
fos.close();
fis.close();
} catch (Exception ef) {
ef.printStackTrace();
}
}
}

3. 原始数据读写:
源码:
public class DataText {

public static void main(String args[]) {
DataText text = new DataText();
String path = "C:\\Documents and Settings\\Administrator\\桌面\\保存";
text.saveFile(path);
text.OpenFile(path);
}
public void saveFile(String path) {
try {
java.io.FileOutputStream out = new java.io.FileOutputStream(path);
java.io.DataOutputStream outs = new java.io.DataOutputStream(out);
outs.writeByte(123);
outs.writeInt(123234545);
outs.writeChars("fefsdfsafgrwtq");
} catch (Exception ef) {
ef.printStackTrace();
}
System.out.println("保存成功");
}
public void OpenFile(String str) {
try {
java.io.FileInputStream in = new java.io.FileInputStream(str);
java.io.DataInputStream ins = new java.io.DataInputStream(in);
byte b = ins.readByte();
int c = ins.readInt();
int lenth=ins.available();
} catch (Exception df) {
df.printStackTrace();
}
}
}

[b]六.线程:线程有几种创建方式?线程在程序中有几种状态?[/b]1.线程的创建方式:[u]第一种方式:[/u]通过继承Thread类创建
[u]第二种方式:[/u]通过实现Runnable接口创建
使用第二种方式创建的好处:多个线程共享同一份资源;可以避免由于java单继承性带来的局限性。
[u]2. 线程在程序中的状态:线程有四种状态,任何一个线程肯定处于这四种状态中的一种:[/u]
[b]1) 产生(New):[/b]线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。
[b]2) 可执行(Runnable):[/b]每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。
[b]3) 死亡(Dead):[/b]当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。
[b]4) 停滞(Blocked):[/b]当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。3. class Object下常用的线程函数
wait()、notify()和notifyAll()这三个函数由java.lang.Object类提供,用于协调多个线程对共享数据的存取。
[b]3.1 wait()、notify()和notifyAll()[/b]1) wait()函数有两种形式:第一种形式接受一个毫秒值,用于在指定时间长度内暂停线程,使线程进入停滞状态。第二种形式为不带参数,代表waite()在notify()或notifyAll()之前会持续停滞。
2) 当对一个对象执行notify()时,会从线程等待池中移走该任意一个线程,并把它放到锁标志等待池中;当对一个对象执行notifyAll()时,会从线程等待池中移走所有该对象的所有线程,并把它们放到锁标志等待池中。
3) 当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
[b]七.static用法与注意事项,==和equals的区别?[/b]1. static用法与注意事项:
static 可以修饰方法,也可以修饰属性
静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法声明为static的方法有以下几条限制:它们仅能调用其他的static 方法。它们只能访问static数据。它们不能以任何方式引用this 或super。 “类名.方法名”,静态方法的使用很简单如上所示。
静态变量 声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间.
2. ==和equals的区别
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
equals()方法的默认实现与==运算符相同,都是比较对象在内存中的地址是否相同。例如: Test test1=new Test(); Test test2=new Test(); Test test3=test1; System.out.println(test1.equals(test2)); System.out.println(test3.equals(test1)); System.out.println(test1==test2); System.out.println(test1==test3); 输出为false,true,false,true。
[b]十、自己的学习到的经验,碰到典型的难题及如何解决。[/b]经过几个月对Java的学习,我学会了如何使用Java语言来编写一些小项目,也学会了如果解决在编写程序中出现的问题,自己的动手能力有所提升了,学会了独立思考。在编写程序时最常见的经典难题有,空指针异常,还有就是参数的传递,这两个问题是最纠结的,也是每个写程序的人一定遇到的。我刚开始遇到这个问题时,真的不知道怎么解决,只能请教别人,后来也学会了自己解决一些简单的,我想这种东西,不能一遇到不懂得就去问别人,要先自己思考解决的方法,实在不懂时才去请教别人,这样自己才能有所提升。

你可能感兴趣的:(Java,多线程,Matlab,数据结构,游戏,java小结)