Java学习(四)
标签(空格分隔): Java
线程
/**
* 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序,该顺序是一个
* 执行路径,或者叫一个控制单元
* 线程:就是进程中的一个独立的控制单元,线程控制着进程的执行 *
* 一个进程中至少有一个线程
*java vm 启动的时候会有一个进程java.exe
*该进程中至少有一个线程,负责java程序的执行,而且这个线程运行的代码存在于
*main方法中
*该线程称为主线程
*
*
*扩展:其实更细节说明jvm,jvm启动不止一个线程还有负责垃圾回收机制的线程
*
*1.如何在自定义的代码中,自定义一个线程呢
*
*通过对api的查找,java已经提供了对线程这类事物的描述,就Thread类'
*创建线程的第一种方式:继承Thread类
*步骤:
*1.定义类继承Thread
*2.复写Thread类中的run方法
*目的:将定义的代码存贮在run方法中,让线程运行
*3.调用线程的start方法,该方法两个作用:
*启动线程,调用run方法
*
*发现运行结果每一次都不同,因为多个线程都获取cpu的执行权.cpu执行
*到谁,谁就运行
*明确一点,在某一个时刻,只能有一个程序在运行(多核除外)
*cpu在做着快速的切换,以达到看上去是同时运行的效果.
*我们可以形象把多线程的运行行为在互相抢夺cpu的执行权
*这就是一个多线程的特性:随机性
*谁抢到谁执行,至于执行多长时间,cpu说的算.
*
*
*
*为什么要覆盖run方法
*
*
* Thread类用于描述线程
* 该类就定义了一个功能,用于存储线程要运行的代码.该存储功能就是run方法
*
*
* 也就是说Thread类中的run方法,用于存储线程要运行的代码
*/
class Demo extends Thread
{
public void run()
{
for(int x=0;x<60;x++)
System.out.println("demo run");
}
}
public class ThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo d=new Demo();//创建好一个线程
d.run();//仅仅是对象调用方法,而线程创建了,并没有运行
//d.start();//开启线程并执行该线程的run方法
for(int x=0;x<60;x++)
{
System.out.println("hello world");
}
}
}
Stack类
/**
* java中stack的使用方法,堆栈是一种"后进先出"(LIFO)的数据结构,只能在一端进行插入(称为"压栈")或删除(称为"出栈")数据的操作.
* Java中,使用java.util.Stack类的构造方法创建对象
* public class Stack extends vector
* 构造方法:public Stack()创建一个空Stack
* 1.public push(item)把item压入栈顶.其作用与addElement(item)相同
* 2.public pop移除栈顶对象,并作为函数的值返回该对象
* 3.public peek()查看栈顶对象而不移除它
* 4.public boolean empty()测试堆栈是否为空
* 5.public int search(Object object)返回对象在堆栈中的位置
*/
import java.util.Enumeration;
import java.util.Stack;
/**
* 学习Stack的用法
* @author Android将军
*
*/
public class StackTest {
public static void main(String[] args) {
//创建堆栈对象
Stack stack=new Stack();
System.out.println("aaaa,bbbb,cccc三个元素入栈");
//向栈中压入字符串aaaa
stack.push("aaaa");
//显示栈中的所有元素
printStack(stack);
stack.push("bbbb");
printStack(stack);
stack.push("cccc");
printStack(stack);
String s=new String("aaaa");
System.out.println("元素aaaa在堆栈的位置"+stack.search(s));
s=new String("bbbb");
System.out.println("元素bbbb在堆栈的位置"+stack.search(s));
System.out.println("aaaa,bbbb,cccc三个元素出栈");
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
}
private static void printStack(Stack stack)
{
if(stack.empty())
{
System.out.println("堆栈是空的,没有元素");
}
else
{
System.out.print("堆栈中的元素:");
//得到Stack中的枚举对象
Enumeration items=stack.elements();
//显示枚举(stack)中的所有元素
while(items.hasMoreElements())
{
System.out.print(items.nextElement()+"");
}
}
System.out.println();//换行
}
}
final的用法
final在java中并不常用,然而它却为我们提供了诸如在c语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被重写或继承等功能,这些特点使final在java中拥有了一个不可或缺的地位,也是学习java时必须要知道和掌握的关键字之一。
final成员:当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说是其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中,注意,这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句。然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
final方法:将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而影响效率,所以你要慎用final进行方法定义。
final类:当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
https://blog.csdn.net/android_jiangjun/article/details/41593609