java线程的总结

java线程的总结
java线程的总结

线程

Java中的进程、线程和多线程

一、进程:进程就是一个正在执行的程序。

二、线程:线程是进程执行的一条线索或路径。进程中至少有一个线程存在。

三、多线程:顾名思义,一个进程中的多个线程。

线程的开始:当要运行一个程序时,JVM首先会找到main函数,然后从main函数开始执行(也就是说,程序是从main函数开始运行的),

此时,程序就成为一个进程,既然是进程肯定有线程的存在。此时的线程就是主线程,主线程会向下顺序执行代码。

如果程序中存在一个庞大的循环语句,主程序就会一直在这里运行,直到循环语句结束,下面的代码才能被执行到。

这可能要花费较长的时间,影响了程序运行的效率。所以,为了提高程序的效率,就引入了多线程。由主线程开辟另一个或多个线程,

让这些线程都去执行代码。

线程线程是一个程序内部的控制流

java的线程是通过java.long.Thread类实现的,VM启动时会有一个主方法public static void main(){}的线程

1 可以通过Thread的实例来创建一个新的线程,必须通过start来开始一个线程,每个线程都是通过特定的Thread对象来调用run方法来完成其操作的,方法run()称为线程体。

类直接继承Thread也可以形成线程,但是这样该类就只能继承一个类

而实现接口的话,可以实现多个接口,从而更加灵活。

2 实现Runnable接口,复写run方法。

用Thread来new一个线程对象,并将Runnable的子类对象传入Thread的构造方法中。我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示。我们首先这样编写这个程序:

1public class ThreadDome1{

2public static void main(String[] args){

3ThreadTest t = new ThreadTest();

4t.start();

5t.start();

6t.start();

7t.start();

8}

9}

10class ThreadTest extends Thread{

11private int ticket = 100;

12public void run(){

13while(true){

14if(ticket > 0){

15System.out.println(Thread.currentThread().getName() +

16"is saling ticket" + ticket--);

17}else{

18break;

19}

20}

21}

22}

上面的代码中,我们用ThreadT est类模拟售票处的售票过程,run方法中的每一次循环都将总票数减1,模拟卖出一张车票,同时该车票号打印出来,直接剩余的票数到零为止。在ThreadDemo1类的main方法中,我们创建了一个线程对象,并重复启动四次,希望通过这种方式产生四个线程。从运行的结果来看我们发现其实只有一个线程在运行,这个结果告诉我们:一个线程对象只能启动一个线程,无论你调用多少遍start()方法,结果只有一个线程。

我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:

1public class ThreadDemo1{

2public static void main(String[] args){

3new ThreadTest().start();

4new ThreadTest().start();

5new ThreadTest().start();

6new ThreadTest().start();

7}

8}

9class ThreadTest extends Thread{

10private int ticket = 100;

11public void run(){

12while(true){

13if(ticket > 0){

14System.out.println(Thread.currentThread().getName() +

15" is saling ticket" + ticket--);

16}else{

17break;

18}

19}

20}

21}

这下达到目的了吗?

从结果上看每个票号都被打印了四次,即四个线程各自卖各自的100张票,而不去卖共同的100张票。这种情况是怎么造成的呢?我们需要的是,多个线程去处理同一个资源,一个资源只能对应一个对象,在上面的程序中,我们创建了四个ThreadTest对象,就等于创建了四个资源,每个资源都有100张票,每个线程都在独自处理各自的资源。

经过这些实验和分析,可以总结出,要实现这个铁路售票程序,我们只能创建一个资源对象,但要创建多个线程去处理同一个资源对象,并且每个线程上所运行的是相同的程序代码。在回顾一下使用接口编写多线程的过程。

1public class ThreadDemo1{

2public static void main(String[] args){

3ThreadTest t = new ThreadTest();

4new Thread(t).start();

5new Thread(t).start();

6new Thread(t).start();

7new Thread(t).start();

8}

9}

10class ThreadTest implements Runnable{

11private int tickets = 100;

12public void run(){

13while(true){

14if(tickets > 0){

15System.out.println(Thread.currentThread().getName() +

16" is saling ticket " + tickets--);

17}

18}

19}

20}

上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadT est对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows 上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。

实现Runnable接口相对于继承Thread类来说,有如下显著的好处:

(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

线程的状态与生命周期

1. 新建状态当创建一个Thread类或子类的对象时,该线程称为新建的线程

2. 就绪:线程创建后,处于就绪状态,等待start()方法被调用

3. 运行:线程开始执行进入运行状态

4. 睡眠:线程的执行可以通过调用sleep()方法来暂时中止

5. 等待:如果调用了wait()方法,线程将处于等待状态。用于两个或多个线程并发运行时

6. 挂起(Suspended):在临时停止或中断线程的执行时,线程就处于挂起状态

7. 阻塞(Blocked):在线程等待一个事件时,例如输入输出操作,就称其处于阻塞状态

8. 死亡:在run()方法已完成执行或stop()方法被调用后,线程处于死亡状态

优先级

设置线程的优先级,用setPriority()方法,该方法也是thread类成员。它的通常形式为:final void setPrority(int level)

这里level指定了对所调用的线程的新的优先权的设置。level的值必须在MIN_PRIORITY到MAX_PRIORITY范围内。通常,它们的值分别是1和10.要返回一个线程为默认的优先级,指定NORM_PRIORITY,通常值为5.这些优先级在Thread中都被定义为final型变量。

通过调用thread类的getPriority()方法可以获得当前的优先级设置。方法如下:final int getPriority()

如果t1的优先级比t2高,并不是说t2不执行,而是t1执行时间多点,t2执行时间少

正常停止一个线程的方法,不是调用interrupt ,stop,而是定义一个变量,bollean f=true; class M yThread extends Thread{

public void run(){

bollean f=true;

while(true){

System.out.println("1");

try{

sleep(1000);

}catch(InterruptedException e){

return;

}

多线程的安全问题

什么时候会出现线程安全问题?

满足3个条件时,会出现:

1.存在多个线程

2.多个线程共享数据(共享数据一般是成员变量,局部变量不是)。

3.操作共享数据的语句至少要有两条。

出现安全问题的原因:多个线程执行共享数据的代码块时,其中的一个线程还没有执行完代码块,另一个线程就开始执行代码块,这会造成共享数据的错误。从而出现安全问题。

多线程安全问题的解决:同步。因为同步可以保证多线程代码只能被持有锁的线程运行,其

它线程不能运行。

任意时刻,一个锁只能被一个线程拥有。(持有锁的线程会在执行完多线程代码时

释放锁,这样锁就能被其它线程拥有。)

1.同步代码块;将要同步的代码放synchronized中,并加锁。

synchronized(对象)//只要是个对象就行,这个对象就是锁

{要被同步的代码}

2.同步函数:synchronized能将代码封装并同步,函数只能将代码封装,所以用synchronized 修饰函数,让函数既能封装又能同步。

同步函数也有锁。非静态同步函数的锁是this,同步函数所属对象的引用;静态同步函数的锁是:类名.class,函数所属类的字节码文件对象。

需注意的是:1.不需要同步的代码不要放入同步函数中。2.synchronized

放在函数返回值类型前

public synchronized void show()

{ 要被同步}

找到要被同步的代码的方法:

1.先找到多线程所有要运行的代码(可能是一个run方法被多个线程使用同,也可能是一个run方法只被其中的一个线程使用);

2.多线程的共享数据(一般成员变量都是);

3.多线程要运行的代码中操作共享数据的代码就是要被同步的代码。

注意:有时使用了同步仍然不成功,出现这种现象的原因可能是:需要被同步的代码可能放在程序的不同位置,有的代码要用到同步代码块,有的要用同步函数

那么怎么才能使同步成功?

1.首先判断要被同步的代码是否正确,确定所有要被同步的代码都被同步了。

2.同步代码块和同步函数中的锁是同一个锁,即必须是多个线程使用同一个锁

线程同步的问题

1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前。即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。锁定后别的线程不能调用该方法B,但是其他线程可以调用别的未锁定的方法A,访问方法A就有可以改变方法B中的变量。解决方法时,将两个方法全部加锁.

针对某变量,想要同步,涉及改该变量的方法都要加锁,而读该变量的方法不需要加锁

public class T T implements runnable{

int m=100;

public synchronized void m1()throws Exception {

m=1000;

Tread.sleep(5000);

System.out.println(m);

}

public void m2{

m=2000;}

public void run(){

try{ m1(); }catch(){}

}

}

public staticvoid mian (String[] args) throws Exception{

TT tt =new TT();

Thread t = new Thread(tt);

t.start();

tt.m2();

System.out.println(m);

}

进程t先锁定m1方法,改变m为1000,在睡眠,主线程继续执行,通过m2方法改变m为2000,最后m1,m2方法的打印m均为2000.

2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块。public int synMethod(int a1){

synchronized(a1) { //一次只能有一个线程进入}

}

3.synchronized后面括号里是一对象,此时,线程获得的是对象锁。例如:

public class MyThread implements Runnable {

public static void main(String args[]) {

MyThread mt = new MyThread();

Thread t1 = new Thread(mt, "t1");

Thread t2 = new Thread(mt, "t2");

Thread t3 = new Thread(mt, "t3");

t1.start();

t2.start();

t3.start();

}

public void run() {

synchronized (this) {

System.out.println(Thread.currentThread().getName());

}

}

}

对于3,如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行。在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,可以如下所示使用虚拟对象来上锁:

class FineGrainLock {

MyMemberClass x, y;

Object xlock = new Object(), ylock = new Object();

public void foo() {

synchronized(xlock) { //access x here

}

synchronized(ylock) { //access y here

}

}

public void bar() {

synchronized(this) {

//access both x and y here

}

4.synchronized后面括号里是类。例如:

class ArrayWithLockOrder{

private static long num_locks = 0;

private long lock_order;

private int[] arr;

public ArrayWithLockOrder(int[] a)

{ arr = a;

synchronized(ArrayWithLockOrder.class) {//--------这里类

num_locks++; // 锁数加1

lock_order = num_locks; }// 为此对象实例设置唯一的lock_order。

}

public long lockOrder()

{ return lock_order; }

public int[] array()

{ return arr; }

}

class SomeClass implements Runnable

{

public int sumArrays(ArrayWithLockOrder a1, ArrayWithLockOrder a2)

{

int value = 0;

ArrayWithLockOrder first = a1; // 保留数组引用的一个ArrayWithLockOrder last = a2; // 本地副本。

int size = a1.array().length;

if (size == a2.array().length)

{

if (a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定

{ // 顺序。

first = a2;

last = a1;

}

synchronized(first) { // 按正确的顺序锁定对象。

synchronized(last) {

int[] arr1 = a1.array();

int[] arr2 = a2.array();

for (int i=0; i value += arr1[i] + arr2[i];

}

}

}

return value;

}

public void run() {

//...

}

}

对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁。

以上4种之间的关系:

锁是和对象相关联的,每个对象有一把锁,为了执行synchronized语句,线程必须能够获得synchronized 语句中表达式指定的对象的锁,一个对象只有一把锁,被一个线程获得之后它就不再拥有这把锁,线程在执行完synchronized语句后,将获得锁交还给对象。

在方法前面加上synchronized修饰符即可以将一个方法声明为同步化方法。同步化方法在执行之前获得一个锁。如果这是一个类方法,那么获得的锁是和声明方法的类相关的Class类对象的锁。如果这是一个实例方法,那么此锁是this对象的锁。synchronzied块后面跟类的具体详细例子、public class DB2_JDBCFactory {private static DB2_JDBCFactory instance = null; public static final ThreadLocal threadLocal = new ThreadLocal(); private DB2_JDBCFactory() {

} public static DB2_JDBCFactory getInstance() {

if(instance == null) {

synchronized(DB2_JDBCFactory.class) { //synchronized后面跟一个类

instance = new DB2_JDBCFactory();

}

}

return instance;

} public Connection getConnection_JNDI_localhost(){

Connection c = (Connection) threadLocal.get();

try {

if (c == null || c.isClosed()) {

InitialContext ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/localhost");

c = ds.getConnection();

threadLocal.set(c);

}

} catch (Exception ex) {

System.err.println("getConnection_JNDI Initial failed. " + ex);

return null;

}

return c;

}}外面的对象访问这个类的需要通过调用它的getInstance()

死锁的例子

public class T estDeadLock implements Runnable{

public int flag = 1;

static Object o1 = new Object();

static Object o2 = new Object();

public void run(){

System.out.println("flag="+flag);

/*

if(flag ==1){

synchronized(o1)

{

try{Thread.sleep(5000);}

catch(Exception e){e.printStackTrace();}

}

synchronized(o2)

{

System.out.println("1");

}

} //这种情况是if语句中的两个锁并列,即便没有o2的锁,o1的语句也一样能执行完毕,锁在执行完毕后立即返还,可以供别的对象使用。

if(flag ==1){

synchronized(o1)

{

try{Thread.sleep(5000);}

catch(Exception e){e.printStackTrace();}

synchronized(o2){System.out.println("1");}

}

} //此时有了O1的锁还必须要O2的锁,才能执行完O1语句,从而返还锁O1.

if(flag ==0){

synchronized(o2)

{

try{Thread.sleep(5000);}

catch(Exception e){e.printStackTrace();}

synchronized(o1){System.out.println("0");}

}

}

}

public static void main(String[] args){

TestDeadLock td1 = new TestDeadLock();

TestDeadLock td0 = new TestDeadLock();

td1.flag=1;

td0.flag=0;

Thread t1 = new Thread(td1);

Thread t0 = new Thread(td0);

t1.start();

t0.start();

}

}

线程中使用wait方法,该方法位于java.long.Object中

必须要先有synchronized方法或对象,才能正常调用wait()方法,并且调用wait()方法后,结束锁定该对象,wait结束则重新锁定该对象

而sleep方法,即便执行了该方法,锁定依旧不结束

Java多线程和输入输出流

班级:13科技2班学号:201324131225 姓名:许耿宁 Java多线程和输入输出流 一、实验目的: 1.熟悉利用Thread类建立多线程方法。 2.熟悉利用Thread接口建立多线程方法。 3.熟悉Java的文件读写机制,练习输入输出流的使用。 二、实验内容: 1.阅读下列程序,分析并上机检验其功能。 public class DelayRunnable implements Runnable{ private static int count=0; private int no; private int delay; public DelayRunnable(){ count++; no=count; } public void run(){ try{ for (int i=0;i<10;i++){ delay=(int)(Math.random()*5000); Thread.sleep(delay); System.out.println("Thread "+no+" with a delay "+delay); } }catch(InterruptedException e){} } } class MyRunnable{ public static void main(String args[]){ DelayRunnable r1 = new DelayRunnable();

DelayRunnable r2 = new DelayRunnable(); Thread thread1=new Thread(r1); Thread thread2=new Thread(r2); thread1.start(); thread2.start(); try{ Thread.sleep(1000); }catch(InterruptedException e){ System.out.println("Thread wrong"); } } } 2.将上列程序利用Runnable接口改写,并上机检验。 3.创建简单的程序ThreeThread.java,该程序将创建三个线程,每个线程应当显示它所运行的时间(可以考虑使用Date类或Calendar类)。 4.键盘输入10个整数,从小到大进行排序。 5.接收键盘输入的字符串,用FileInputStream类将字符串写入文件,用 FileOutputStream类读出文件内容显示在屏幕上。 6.将一个文本文件的内容按行读出,每读出一行就顺序加上行号,并写入到另一个文件中。 三、实验要求: 1.通过实验掌握Thread 、Runnable使用方法; 2.程序必须能够实现多线程; 3.程序必须能够完成题目要求; 4.通过实验掌握文件输入输出流的使用方法; 5.程序必须能够从键盘接收字符串并保存在文件中; 6.程序必须能够读出文件内容显示在屏幕上; 7.写出实验报告。 四、实验代码及截图: 第一题: 在编译器上运行程序得到截图所示结果:

Java集合类知识点总结

Java集合类 Java集合类 (1) 1.Map (3) 1.1.HashMap (3) 1.1.1.底层实现 (3) 1.1.2.特点 (3) 1.1.3.源码分析 (4) 1.1.4.多线程可能出现的问题 (5) 1.2.ConcurrentHashMap (6) 1.2.1.底层实现 (6) 1.2.2.源码分析 (7) 1.3.HashTable (9) 1.3.1.HashTable是线程安全的,因为所有方法上都加了synchronized关键 字。9 1.3.2.HashTable的key和value都不可以为null。 (9) 1.3.3.扩容时,capacity=2*capacity+1 (9) 1.3.4.数组默认大小为11 (9) 1.3.5.查找下标时,没有使用hash&length-1,而是直接进行计算的 (9) 1.4.TreeMap (9) 1.4.1.底层实现为红黑树 (9) 1.4. 2.TreeMap是一个有序的key-value集合,基于红黑树实现。该映射根据 其键的自然顺序进行排序,或者根据创建时提供的Comparator进行排序 (10) 1.4.3.接口实现 (10) 1.4.4.Entry (11) 1.5.LinkedHashMap (11) 1.5.1.底层是数组+链表+红黑树+双向链表 (11) 1.5.2.维护链表顺序和访问顺序 (11) 1.5.3.LinkedHashMap 可以通过构造参数 accessOrder 来指定双向链表是否在 元素被访问后改变其在双向链表中的位置。 (11) 1.5.4.当accessOrder为true时,get方法和put方法都会调用recordAccess 方法使得最近使用的Entry移到双向链表的末尾;当accessOrder为默认值 false时,recordAccess方法什么也不会做。 (11) 1.5.5.LRU实现 (11) 2.Collection (11) 2.1.List (12) 2.1.1.ArrayList (12) 2.1.2.LinkedList (13) 2.1.3.CopyOnWriteArrayList (13) 2.2.Set (14) 2.2.1.HashSet (14)

实验5 JAVA常用类

山西大学计算机与信息技术学院 实验报告 姓名学号专业班级 课程名称 Java实验实验日期成绩指导教师批改日期 实验5 JAVA常用类实验名称 一.实验目的: (1)掌握常用的String,StringBuffer(StringBuilder)类的构造方法的使用;(2)掌握字符串的比较方法,尤其equals方法和==比较的区别; (3)掌握String类常用方法的使用; (4)掌握字符串与字符数组和byte数组之间的转换方法; (5)Date,Math,PrintWriter,Scanner类的常用方法。 二.实验内容 1.二进制数转换为十六进制数(此程序参考例题249页9. 2.13) 程序源代码 import java.util.*; public class BinToHexConversion{ //二进制转化为十六进制的方法 public static String binToHex(String bin){ int temp; //二进制转化为十六进制的位数 if(bin.length()%4==0) temp = bin.length()/4; else temp = bin.length()/4 + 1; char []hex = new char[temp]; //十六进制数的字符形式 int []hexDec = new int[temp];//十六进制数的十进制数形式 int j = 0; for(int i=0;i=0&&dec<10) return (char)('0'+dec-0); else if(dec>=10&&dec<=15) return (char)('A'+dec-10); else return '@'; }

Java专业实习总结(精选3篇)

Java专业实习总结(精选3篇) Java专业实习总结 紧张又充实的实习生活又将谢下帷幕,回顾这段时间的实习经历,收获的不仅岁月,还有成长,为此就要认真思考实习总结如何写了。那么如何把实习总结做到重点突出呢?以下是收集整理的Java 专业实习总结,欢迎阅读,希望大家能够喜欢。 Java专业实习总结1 初次涉及Java领域,感觉到Java入门是好像没有C,C++入门快,工具也没有什么TurboC,VisualC++好用,什么JA_HOME,CLASSPATH,虚拟机等概念都是初次基础,旁边的人都很少用Java的。感觉Java就是做Applet的。让我不可思议的是JA2,JDK,J2SE,J2EE,J2ME等新名词在自己的脑海里蔓延。搭起Java开发环境后,记得刚开始还是用UltraEdit编辑并编译的慢慢的改用JCreator了,要开始干项目了,以前从书上看到的东西,在项目中有了很好的机会去温习,开始主要是用Swing,开发桌面系统,放置一个按钮怎么也放不好,后来才知道有一个布局管理器。后来开始涉及到数据库访问,JDBC。随后Java规范了。最开始*的规范是JDBCSpecification,很多概念一目了然,尤其是DATABASE的事务性控制,自己对于她的理解慢慢的有了较为深入的了解。对于开发C/S结构,比如,Swing+JDBC,开发数据库应用系统,让我学会开发两层结构的应用系

统。 开发豆豆网时,基于Linux+JSP+JavaBean+Oracl的系统。不同于Swing+JDBC的开发模式,系统之间多了一层;同时,很多开发技术和面向左面系统不一样,比如分页技术。 完成项目后,自己对于Java的很多方面都比较了解了。开始思考一个问题,J2EE是什么东西?。我们学习Java大概有3个方向,第一,桌面系统,包括C/S结构;第二,J2ME,面向无限领域,很有潜力的家伙,看*的手机用户就知道了。第三,面向企业应用、计算的平台,J2EE。 通过实习,我自身发生了重大的转变,我相信我会在JA开发这条路上走的更长更远。 实习虽然结束了但是给我的感触很大。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名即将毕业的大学生更应该把学习作为保持工作积极性的重要途径。 实习,是开端也是结束。展现在自己面前的是一片任自己驰骋的沃土,也分明感受到了沉甸甸的责任。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我。 实习的同时也让我了解到了自己的不足,我会继续努力,完善自我。对于学校的精心安排和指导老师的用心辅导非常感谢。 Java专业实习总结2 在经过三年的专业课系统的学习之后,在今年的暑假我迎来了第一次的实习。经过深思熟虑之后,我选择了软件开发的实习与学习。

it人员的实习工作总结

it人员的实习工作总结 it人员实习工作总结 时光飞逝,转眼了大三就结束了,经过三年的校园专业知识的学习,我将要步入社会参加工作,暑假到了,此时的我和同学们在学院领导老师的安排下,利用暑假时间,参加了这次专业实习。 此次实习的地点是xx一个IT公司,时间是一个月,我选的专业实习方向是大数据开发;大数据开发是以Java编程为基础,然后做大数据架构,数据导入,HDFS分布式文件系统,Hadoop 体系,环境搭建,云计算;因为时间相当有限,因此我们这次实习只学习了Java编程的基础。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java 语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2] 。Java可以编写桌面应用程序、Web应用程序、分

布式系统和嵌入式系统应用程序等。桌面应用程序,又称为GUI 程序(Graphical User Interface),但是和GUI 程序也有一些区别。桌面应用程序将GUI 程序从GUI具体为“桌面”,使冷冰冰的像块木头一样的电脑概念更具有人性化,更生动和富有活力。运行桌面应用程序时,用户界面会出现在运行应用程序的机器屏幕上。应用程序和它的用户界面之间的消息通过机器的操作系统进行传递。通常情况下,这里只涉及到一台机器,不存在网络。 我们是通过做项目实战来学习Java编程的,在这一个月中,我们做了两个Java项目,一个是桌面应用程序:图书进销存系统,另一个是web应用程序:学生信息管理系统。 第一个项目是图书进销存系统,图书进销存系统是CS结构的,CS结构即客户端-服务器结构,使用的是eclipse集成开发环境,MySQL数据库进行该软件的开发;该系统的主要有出版社管理、书本管理、书的入库管理、销售管理等功能,通过这些简单的功能,可以让我们了解如何利用JDBC进行数据库操作、如何使用Java的反射机制以及如何对系统进行分层等知识点。在实现功能前,我们需要为这个系统建立界面和设计数据库。该系统共有六个界面,包括登录界面、销售管理界面、入库管理界面、书本管理界面、种类管理界面、出版社管理界面。设计数据库方面,该系统使用的是MySQL5.0作为数据库。在设计数据库前,我们可以确定,系统相关的表,从最基础开始,有出版社表、书

java实习总结

河北科技师范学院 欧美学院 《JA V A程序设计课程设》 个人实习总结 实习类型教学实习 实习单位欧美学院 指导教师丁亚周 所在院(系)信息技术系 班级 1202 学生姓名于红 学号 9211120214

一、实习时间和地点 时间:2015.3.17-2015.4.17 地点:欧美学院F311,F310 二、实习的内容 (1)本组课题及本人任务; 我们小组设计的是图书管理系统,包括图书信息管理,读者信息管理,管理员信息管理,借阅信息管理,还书信息管理,逾期罚款或损坏赔偿信息管理和数据库。我负责的是图书信息管理,包括对图书信息的查阅,删除,修改和增加。可以满足图书馆的一些日常活动 (2)程序功能简介; 这次实践课我们小组设计的图书管理系统包括了图书信息管理,读者信息管理,管理员信息管理,借阅信息管理,还书信息管理,逾期罚款或损坏赔偿信息管理。主要包含对信息的查找,增加,删除和修改。如下图所示: (3)主体内容(简要说明总体情况,详细介绍本人任务部分): 1.设计分析; 图书管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立前端应用程序的开发两个方面.对于前者要求建立起数据一致性和完整性强、数据安全性好的库.而对于后者则要求应用程序功能完备,易使用等特点.本组结合简单图书馆的要求,设计了数据库结构和应用程序.系统运行结果证明,本文所设计的图书管理系统可以满足图书馆工作人员的需要.

2.程序结构(画流程图) 3.各模块的功能及程序说明; 我所负责的模块是图书信息管理,主要包含四个方面,对图书信息的查找,增加,修改,删除。查找:可以满足图书管理者查询数目的要求,在这个模块,可已使用多种方式查找,包括无条件查询和条件查询,无条件查询是将所有的书一起都找出来,条件查询又包括图书编号查询和模糊条件,这个可以满足图书管理者对具体的一本书查询的要求;增加:按照传统的增加方式进行增加,在新买书时,可以方便图书管理者对数据库进行增加;修改:可以修改图书的名称,适合在录入信息错误时使用;删除:当撤销破旧书目时,可以使用,我所做的所有操作都会对数据库产生影响。 4. 源程序; case 1: System.out.println(" 图书信息: "); System.out.println(" 1. 查询图书信息: "); System.out.println(" 2. 插入图书信息: "); System.out.println(" 3. 删除图书信息: ");

JAVA线程程序设计(小时钟)实验报告(附完整代码)

线程程序设计 一、课题内容和要求 内容:设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。 要求:本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。 二、设计思路分析 class Clock:一个指针式时钟的主类 class Layout: 添加窗口和时钟组件 class ClockPaint:定义时钟组件 三、概要设计 public class Clock extends JFrame { public static void main(String[] s) ; } class Layout extends JFrame { public Layout(); } class ClockPaint extends JPanel implements Runnable { int x, y, r; int h, m, s; double rad = Math.PI / 180; public ClockPaint(int x, int y, int r); public void paint(Graphics g); public void run(); } 时钟的绘制:

运行时钟: 四、详细设计 import java.awt.*; import javax.swing.*; import java.util.*; public class Clock extends JFrame { public static void main(String[] s) { new Layout(); } } class Layout extends JFrame {// 添加窗口和时钟组件public Layout() { ClockPaint cp = new ClockPaint(20, 20, 70); add(cp);

java开发技术总结

数据库 oracle-->数据库管理系统-->SQL、PL/SQL-->Java(JDBC+SQL) DBA,数据库编程程序员 1.概念导论 1)什么是数据库 有组织和结构存储数据。可以存储 字符、字节、图形、图像等类型数据 DB(数据库):数据集合 DBMS(数据库管理系统):对数据集合进行管理和操作的软件 --Oracle --DB2 --MySQL --SQLSERVER JDBC 1.什么是JDBC 全称Java DataBase Connection,Java数据库访问。 JDBC是Java访问数据库的一项技术 JDBC是SUN推出的Java访问数据库的一套标准。由一系列接口构成。 各个数据库厂商负责提供JDBC接口API的实现包。 开发者只需要掌握JDBC接口的使用,就可以实现对各种数据库的操作,不需要了解开发商的实现类。 XML 1、什么是xml(xtendsible markup language可扩 展的标记语言)? 1)定义 基于文本的通用的数据保存格式。 (1)通用的点的坐标 Point类point对象(x=10,y=20) a,序列化 b,数据库表 c,文件 ... (2)数据格式 10 20

HTML 知识准备 1、分层:表现层:UI界面(DOS界面、桌面类型、web类型) 业务层: 数据层:文件、Oracle数据库 2、Web类型的应用程序----B/S类型 打开Browser,输入URL,浏览器将请求发送到服务器 服务器得到请求,分析,返回响应 浏览器得到响应,解析(翻译),显示为页面 3、web学习阶段 客户端技术:HTML+CSS+Javascript---Web基础 服务器端技术:JSP、PHP、https://www.360docs.net/doc/d115240230.html, 4、web基础的课程 HTML:页面的创建 CSS:页面的外观 JavaScript:页面的动态效果和交互行为--3 一:HTML概述 1、超文本标记语言:一种编写页面的纯文本的标记语言,文件以.html或者.htm为后缀,依靠浏览器运行显示----解释性的语言 2、标记:一些用<>括起来的内容,特殊的显示 3、主流浏览器:IE/Firefox/Chrome/ 4、浏览器兼容性:符合标准规范,具体问题 CSS 一:CSS概述 1、CSS:级联样式表(层叠样式表) 2、特征:为页面定义外观的语言,实现内容和表现的分离,多个样式可以合为一个,如果冲突,以优先级为准 二:基础语法 1、语法:属性名称:值;属性名称:值;比如--color:red; 2、如何应用 方式一(内联方式):<元素style=""/>---将样式直接定义在元素的style属性里 方式二(内部样式表):在页面的head里的style里定义样式 方式三(外部样式表):定义一个单独的.css的文件(定义样式);然后,在页面的head里用link引入---推荐方式 3、外部样式表的优点:实现内容和表现的分离,提高代码的可重用性和可维护性

Java常用类和方法面试题+答案

2015年12月20日18:25:21 Java常用类和方法重点总结 作者:数据分析玩家 1、简述Java中内存分配的问题 1>凡是new()出来的东西,都是在堆中进行分配的 2>局部变量【数据类型+变量名】都是在栈中进行分配的 3>静态变量【static】和字符串常量【“String”】都是在数据区进行分配的 4>方法【代码】都是在代码区进行存放的 2、简述Java中Object类的地位 1>Java中所有的类【自己定义的类以及Sun公司提供的类】都默认自动继承了Object类 2>Java中所有的类都从Object类中继承了toString()方法、hashCode()方法和equals()等方法 3、简述Object类中toString()方法的注意事项 1>toString()方法的返回值是一个字符串 2>toString()方法返回的是类的名字和该对象的哈希码组 成的一个字符串,即toString()方法返回的是该对象的字符串表示形式 3>在Java中System.out.println(类对象名)实际输出的是该对象的toString()方法返回的字符串,即括号中的内容等价于类对象名.toString(),toString方法的好处是在碰到

println方法的时候会被自动调用,不用显示的写出来 4>建议所有的子类都重写从Object类中继承过来toString 方法,否则toString方法的返回值没有什么实际含义 4、简述Object类中equals()方法的注意事项 1>equals方法的返回值为true或false 2>Object类中equals方法只有在两个对象是同一块内存区域时,即不但内容相同、地址还必须相同时才返回true,否则即便内容相同、如果地址不同只会返回false 3>重写Object类中的equals方法目的在于:保证只要两个对象的内容相同,equals方法就返回true 5、简述Object类中hashCode()方法的注意事项 1>哈希码原本指的是内存空间地址的十六进制表示形式 2>hashCode()方法返回的是该对象的哈希码、即该对象的真实内存地址的十六进制表示形式,但是重写完hashCode()方法之后,返回的不再是该对象真实内存地址的十六进制表示形式 6、学习Java中toString方法、equals方法、hashCode方法共同的一个注意事项 在Java中,凡是动态分配的内存都是没有名字的,而是将其地址赋给一个指针变量【引用】,用指针变量去代表这个事物,所以引用和动态分配的内存有本质上的区别,但是在学习Java中的toString方法、equals方法和hashCode方

java的布局管理

https://www.360docs.net/doc/d115240230.html,/liujun13579/article/details/7772215 java.awt包中大约有 FlowLayout 流式布局 BorderLayout 边框式布局 GridLayout 网格布局 CardLayout 卡片布局 GridBagLayout 复杂的网格布局 javax.swing包中大约有如下布局 BoxLayout 盒式布局 OverlayLayout 重叠布局 ScrollPaneLayout 类JScrollPane使用的布局管理器ViewportLayout 类JViewport使用的布局管理器 详解:

实例:对齐方式 // FlowLayoutDemo.java importjavax.swing.*; importjava.awt.*; public classFlowLayoutDemo extends JFrame { public FlowLayoutDemo() { //设置窗体为流式布局,无参数默认为居中对齐setLayout(new FlowLayout()); //设置窗体中显示的字体样式 setFont(new Font("Helvetica",Font.PLAIN, 14)); //将按钮添加到窗体中

getContentPane().add(newJButton("Button 1")); getContentPane().add(new JButton("Button 2")); getContentPane().add(new JButton("Button3")); getContentPane().add(newJButton("Button 4")); } public static void main(String args[]) { FlowLayoutDemo window = newFlowLayoutDemo(); window.setTitle("流式布局"); //该代码依据放置的组件设定窗口的大小使之正好能容纳你放置的所有组件 window.pack(); window.setVisible(true); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setLocationRelativeTo(null); //让窗体居中显示 } }

JAVA暑期实习报告

实习总结报告 实习总结报告 一、实习目的 Java语言是一种高级计算机语言,具有简单,面向对象,安全,跨平台,支持多线程的特点。这次实习的目的是使我们掌握JA V A的基本知识,能运用JA V A来编写程序,解决一般性的问题,使得我们在完成本课程学习后,掌握JA V A的基本知识和初步的编程能力,为以后的学习和工作提供了一个非常有用的工具。 2、实习内容 1.鼠标拖动小球运动 …

MouseMotionListener{ //Graphics代表画笔 super.paint(g);//调用父类的paint方法 //设置画笔颜色 g.setColor(Color.BLUE); /*x,y代表要填充的圆弧的左上角坐标 代表填充圆弧的宽度 代表填充圆弧的高度 相对于开始角度,圆弧的跨越度*/ } @Override

x=e.getX();//获得圆心坐标 y=e.getY(); repaint();//重新画一个小球} @Override x=e.getX();//获得圆心坐标 y=e.getY(); repaint();//重新画一个小球 } x=200; y=200;//为小球坐标赋初始值 //为当前面板添加鼠标移动事件监听 this.addMouseMotionListener(this); }

public class MouseBallFrame extends JFrame{ public static void main(String[]args){ MouseBallFrame frame=new MouseBallFrame(); MouseBallPanel panel=new MouseBallPanel(); frame.add(panel); frame.setSize(1024,768); frame.setTitle("鼠标控制小球"); frame.setVisible(true); } } 这是第一次成功的设置窗口,面板,并将JA V A程序结果在窗口内显示,这似乎打开了另外一扇门,有更多的知识等着我去探索。(结果如图1) 图1 2.小球运动的屏幕保护程序

java基础总结

第一章初识java 一、java语言的历史 ●第一代java语言:Oak 二、java语言的现状 ?Java SE:主要用于桌面程序的开发。 ?Java EE:主要用于网页程序的开发。 ?Java ME:主要用于嵌入式系统程序的开发。(安卓)三、java语言的特点 ●跨平台(不同的操作系统都可运行) ●简单(没有直接使用指针) ●面向对象(世间万物皆为对象) ●半编译半解释(java文件---class文件----虚拟机) ●分布式(多个客户端访问、通过服务器的配置分发到 不同的服务器) ●健壮(异常的处理) ●安全(任何语言都具备、虚拟机沙箱原理) ●多线程、高性能、动态 四、java语言与C、C++语言的不同与区别 ●自动内存管理:Java对于内存的分配是动态的,并具 有垃圾回收机制。 ●不在类外定义全局变量。 ●Java中将不再使用goto语句。

●Java中取消了指针。 ●运行时系统对类型转换进行类型相容性检查 ●Java不支持头文件,使用import与其它类通讯。 ●Java中不包含结构和联合;所有的内容都封装在类中。 ●Java中不支持宏,它通过final 关键字来声明一个常 量。 ●Java不支持多重继承,可以通过Java中的接口实现 多重继承的功能。 ●CC++ 一般情况下都是偏硬件的,java一般偏软件(应 用、基于浏览器) ●(补充).net、php (网页制作比较快捷)、在安全级 别要求高的企业一般使用java(银行、政府系统) 五、环境的搭建 1、默认路径如下 ●C:\Program Files\Java\jdk1.6.0_02:提供编程中需要 的api包 ●C:\Program Files\Java\jre1.6.0_02:虚拟机文件所在的 位置 2.安装后各个文件夹代表的含义

2019最新Java面试题,常见面试题及答案汇总

ava最新常见面试题+ 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要后面的框架和JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。 适宜阅读人群 需要面试的初/中/高级java 程序员 想要查漏补缺的人 想要不断完善和扩充自己java 技术栈的人 java 面试官 具体面试题 下面一起来看208 道面试题,具体的内容。 一、Java 基础 1.JDK 和JRE 有什么区别? 2.== 和equals 的区别是什么? 3.两个对象的hashCode()相同,则equals()也一定为true,对吗? 4.final 在java 中有什么作用? 5.java 中的Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与String str=new String(“i”)一样吗? 9.如何将字符串反转? 10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用final 修饰吗?

14.接口和抽象类有什么区别? 15.java 中IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和Collections 有什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和Hashtable 有什么区别? 22.如何决定使用HashMap 还是TreeMap? 23.说一下HashMap 的实现原理? 24.说一下HashSet 的实现原理? 25.ArrayList 和LinkedList 的区别是什么? 26.如何实现数组和List 之间的转换? 27.ArrayList 和Vector 的区别是什么? 28.Array 和ArrayList 有何区别? 29.在Queue 中poll()和remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和ListIterator 有什么区别? 34.怎么确保一个集合不能被修改?

JAVA实训总结

J A V A程序设计课程实训报告 一、实训目的 知识目标 1.了解图形用户界面的编程思路及方法; 2.了解事件及事件处理机制; 3.掌握常用的图形用户界面组件; 4.掌握容器布局的设置方法及组件的添加方法; 5.掌握常见事件类型及事件处理方法; 能力目标 1.与客户沟通的基本能力; 2.团队协作的基本能力; 3.编程的良好习惯; 4.软件调试和测试的能力; 5.查阅文献的能力; 二、项目设置: 1、实训内容 利用所学Java程序设计语言实现一个图形化的计算器。 2、实训要求 1.程序运行正常无误,系统层次清晰合理; 2.实训内容里的要求必须要全面实现; 3.实训过程中要仔细操作,细心观察,勤于思考,注意记录; 4.实训报告要做到文字通畅、论点正确、论述有据; 5.要求学生在指导教师的指导下,独立完成实训的全部内容; 6.在规定时间内完成实训的全部任务,并按规定格式上交实训报告; 三、实训设备 硬件:个人电脑、 软件:、JDK1.6.0_23 四、实训过程 以上的图表示实训编写的程序没有错误,可以正常的运行

以上的图是运行程序时所显示出来的小小计算机的界面 为了实际的运行一下计算机的功能,此时输入1加2 此时计算机上显示的是数字1和数字2相加的结果,3. 为了实际的运行一下计算机的功能,此时输入数字1乘数字2 此时计算机上显示的是数字1和数字2相乘的结果,2. 因为上述的两个小算数成功的运算出正确的结果所以此时关闭小小简单计算机的界面此时出现的编程图面为: 计算机程序的源码: .*; import .*;,insert); addButton("=",command); addButton("+",command); add(panel,; } privatevoidaddButton(Stringlabel,ActionListenerlistener) { JButtonbutton=newJButton(label); (listener); (button);//按钮监听器类,用于显示 } privateclassInsertActionimplementsActionListener { publicvoidactionPerformed(ActionEventevent) { Stringinput=(); if(start) { (""); start=false;

java线程学习总结

java线程学习总结1(java thread培训总结1) 1.线程中一些基本术语和概念 (2) 1.1线程的几个状态 (2) 1.2 Daemon线程 (2) 1.3锁的定义 (2) 1.4死锁 (2) 1.5.Java对象关于锁的几个方法 (3) 1.6锁对象(实例方法的锁) (3) 1.7类锁 (4) 1.8.线程安全方法与线程不安全方法 (4) 1.9类锁和实例锁混合使用 (4) 1.10锁的粒度问题 (4) 1.11.读写锁 (5) 1.12 volatile (5) 2.线程之间的通讯 (5) 2.1屏障 (6) 2.2.锁工具类 (6) 2.3.条件变量 (6) 3. Java线程调度 (7) 3.1 Java优先级 (7) 3.2. 绿色线程 (7) 3.3 本地线程 (7) 3.4 Windows本地线程 (7) 3.5线程优先级倒置与继承 (8) 3.6循环调度 (8) 4.线程池 (8) 5工作队列 (9) 6.参考资料 (10)

1.线程中一些基本术语和概念 1.1线程的几个状态 初始化状态 就绪状态 运行状态 阻塞状态 终止状态 1.2 Daemon线程 Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。 1.3锁的定义 为了协调多个并发运行的线程使用共享资源才引入了锁的概念。 1.4死锁 任何多线程应用程序都有死锁风险。当一组线程中的每一个都在等待一个只 有该组中另一个线程才能引起的事件时,我们就说这组线程死锁了。换一个说法就是一组线程中的每一个成员都在等待别的成员占有的资源时候,就可以说这组线程进入了死锁。死锁的最简单情形是:线程 A 持有对象X 的独占锁,并且在等待对象Y 的锁,而线程 B 持有对象Y 的独占锁,却在等待对象X 的锁。除非有某种方法来打破对锁的等待(Java 锁定不支持这种方法),否则死锁的线程将永远等下去。

java集合类总结

1.本讲内容:集合collection (数组和集合90%功能相似,但是最大的区别是,数组在初始化的时候必须确定大小,而集合不用,而且集合是一堆的类,使用起来非常方便。) 讲集合collection之前,我们先分清三个概念: 1colection 集合,可用来存储任何对象的一种数据结构(容器)。 2Collection 集合接口,指的是,是Set、List 和Queue 接口的超类接口 3Collections 集合工具类,指的是类。 SCJP考试要求了解的接口有:Collection , Set , SortedSet , List , Map , SortedMap , Queue , NavigableSet , NavigableMap, 还有一个Iterator 接口也是必须了解的。 SCJP考试要求了解的类有:HashMap , Hashtable ,TreeMap , LinkedHashMap , HashSet , LinkedHashSet ,TreeSet , ArrayList , Vector , LinkedList , PriorityQueuee , Collections , Arrays 下面给出一个集合之间的关系图: 上图中加粗线的ArrayList 和HashMap 是我们重点讲解的对象。下面这张图看起来层级结构更清晰些。 我们这里说的集合指的是小写的collection,集合有4种基本形式,其中前三种的父接口是Collection。 4List 关注事物的索引列表 5Set 关注事物的唯一性 6Queue 关注事物被处理时的顺序 7Map 关注事物的映射和键值的唯一性 一、Collection 接口 Collection接口是Set 、List 和Queue 接口的父接口,提供了多数集合常用的方法声明,包括add()、remove()、contains() 、size() 、iterator() 等。 add(E e) 将指定对象添加到集合中 remove(Object o) 将指定的对象从集合中移除,移除成功返回true,不成功返回false contains(Object o) 查看该集合中是否包含指定的对象,包含返回true,不包含返回flase size() 返回集合中存放的对象的个数。返回值为int clear() 移除该集合中的所有对象,清空该集合。 iterator() 返回一个包含所有对象的iterator对象,用来循环遍历 toArray() 返回一个包含所有对象的数组,类型是Object toArray(T[] t) 返回一个包含所有对象的指定类型的数组 我们在这里只举一个把集合转成数组的例子,因为Collection本身是个接口所以,我们用它的实现类ArrayList做这个例子:例子1: package edu.xjfu;

java中常用关键字总结

Java中的关键字总结 final 关键字 1、用final修饰的类不能被继承,没有子类; 2、用final修饰的方法,方法不能被重写; 3、用final修饰变量,变量的值不能被修改,表示常量,(书写规范:全部字母都要大写;多个单词,可以使用下划线(_)分开;) 注意:如果被final修饰的变量是一个引用类型的数据,那么通过这个引用改变堆空间中的数据,不会报错;如果被final修饰的变量是一个引用类型的数据,那么通过这个引用改变堆空间中的数据,不会报错; 4、final用于成员变量表示该成员变量为常量,不能被修改,必须在变量定义时赋值。 5、final用于局部变量表示该局部变量为常量,不能被修改,可以在变量定义时赋值,也可以先定义变量后赋值。 什么时候用final关键字? 有的时候不想别人重写我的方法就使用final关键字修饰该方法; static关键字 1、static用于成员变量表示该变量只有一份,也就是说静态成员变量属于类而不属于某个具体的类实例对象,所有的类实例对象共享这个静态成员变量;静态函数是不需要对象的,直接可以使用类名来调用; 2、非静态函数可以调用静态函数;静态函数不能调用非静态函数(非静态函数都是通过对象调用的);静态函数不能使用非静态成员变量,但可以使用静态成员变量; 3、静态函数调用时不需要对象的,所以不能使用和对象有关的关键字;(this;super;) 4、构造函数不能使用static修饰(构造函数是创建对象,开辟空间,给所有成员变量赋默认值之后,有JVM调用进栈,用来给对象的成员变量赋初始值的) static用于类,这里指的是内部类,那么在别的地方就可以通过外部类名来引用这个静态的内部类。 5、static还可以用于类的代码块,叫做静态代码块,静态代码块在类加载的时候就执行完毕,而类只加载一次;是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先

java布局(java布局)

java布局(java布局) java布局(java布局) GridBagLayout Free setting component location Before use, set the layout to setLayout (), and the parameter is empty, that is, setLayout (null). Create a layout for the component's (x, y) coordinates, as well as the width and height as parameters. SetBonds (new, Rectangle (int, x, int, y, int, W, int, H)): parameters are coordinates and width, height. The setSize (int, int) sets the size of the component The setLocation (int, int) sets the coordinates of the components Example: Rectangle, re=new, Rectangle (10,10,50,30); Button.setBounds (re); Sequential layout (FlowLayout) Constructor: FlowLayout (): establish the sequence layout manager by default that the components on each row will be centered; FlowLayout (int): Specifies alignment, no arguments, FlowLayout.CENTER, or 1: the components on each row will be centered; arguments FlowLayout.LEFT or 0: left justified; arguments FlowLayout.RIGHT or 2: right aligned.

相关文档
最新文档