第一篇:java高级Inside_JVM读书笔记
本文首先介绍一下Java虚拟机的生存周期,然后大致介绍JVM的体系结构,最后对体系结构中的各个部分进行详细介绍。
(首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程;也就是JVM实例是进程级别,而执行引擎是线程级别的。)
一、JVM的生命周期
JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点,既然如此,那么JVM如何知道是运行class A的main而不是运行class B的main呢?这就需要显式的告诉JVM类名,也就是我们平时运行java程序命令的由来,如java classA hello world,这里java是告诉os运行Sun java 2 SDK的java虚拟机,而classA则指出了运行JVM所需要的类名。
JVM实例的运行:main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。
JVM实例的消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。
二、JVM的体系结构
粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。
下面将先介绍类装载器,然后是执行引擎,最后是运行时数据区
1,类装载器,顾名思义,就是用来装载.class文件的。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。(下面所述情况是针对Sun JDK1.2)
动类装载器:只在系统类(java API的类文件)的安装路径查找要装入的类
用户自定义类装载器:
系统类装载器:在JVM启动时创建,用来在CLASSPATH目录下查找要装入的类
其他用户自定义类装载器:这里有必要先说一下ClassLoader类的几个方法,了解它们对于了解自定义类装载器如何装载.class文件至关重要。
protected final Class defineClass(String name, byte data[], int offset, int length)
protected final Class defineClass(String name, byte data[], int offset, int length, ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name)
protected final void resolveClass(Class c)
defineClass用来将二进制class文件(新类型)导入到方法区,也就是这里指的类是用户自定义的类(也
就是负责装载类)
findSystemClass通过类型的全限定名,先通过系统类装载器或者启动类装载器来装载,并返回
Class对象。
ResolveClass: 让类装载器进行连接动作(包括验证,分配内存初始化,将类型中的符号引用解析为
直接引用),这里涉及到java命名空间的问题,JVM保证被一个类装载器装载的类所引用的所有类都被这个类装载器装载,同一个类装载器装载的类之间可以相互访问,但是不同类装载器装载的类看不见对方,从而实现了有效的屏蔽。
2,执行引擎:它或者在执行字节码,或者执行本地方法
要说执行引擎,就不得不的指令集,每一条指令包含一个单字节的操作码,后面跟0个或者多个
操作数。
(一)指令集以栈为设计中心,而非以寄存器为中心
这种指令集设计如何满足Java体系的要求:
平台无关性:以栈为中心使得在只有很少register的机器上实现java更便利
compiler一般采用stack向连接优化器传递编译的中间结果,若指令集以stack为基础,则有利于运行
时进行的优化工作与执行即时编译或者自适应优化的执行引擎结合,通俗的说就是使编译和运行用的数据结构统一,更有利于优化的开展。
网络移动性:class文件的紧凑性。
安全性:指令集中绝大部分操作码都指明了操作的类型。(在装载的时候使用数据流分析期进行一
次性验证,而非在执行每条指令的时候进行验证,有利于提高执行速度)。
(二)执行技术
主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行
其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM
采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式
自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调
用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。
3,运行时数据区:主要包括:方法区,堆,java栈,PC寄存器,本地方法栈
(1)方法区和堆由所有线程共享
堆:存放所有程序在运行时创建的对象
方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。
(2)Java栈和PC寄存器由线程独享,在新线程创建时间里
(3)本地方法栈: 存储本地方法调用的状态
上边总体介绍了运行时数据区的主要内容,下边进行详细介绍,要介绍数据区,就不得不说明JVM
中的数据类型。
JVM中的数据类型:JVM中基本的数据单元是word,而word的长度由JVM具体的实现者来决定
数据类型包括基本类型和引用类型,(1)基本类型包括:数值类型(包括除boolean外的所有的java基本数据类型),boolean(在JVM中使
用int来表示,0表示false,其他int值均表示true)和returnAddress(JVM的内部类型,用来实现
finally子句)。
(2)引用类型包括:数组类型,类类型,接口类型
前边讲述了JVM中数据的表示,下面让我们输入到JVM的数据区
首先来看方法区:
上边已经提到,方法区主要用来存储JVM从class文件中提取的类型信息,那么类型信息是如何存储的呢?众所周知,Java使用的是大端序(big—endian:即低字节的数据存储在高位内存上,如对于1234,12是高位数据,34为低位数据,则java中的存储格式应该为12存在内存的低地址,34存在内存的高地址,x86中的存储格式与之相反)来存储数据,这实际上是在class文件中数据的存储格式,但是当数据倒入到方法区中时,JVM可以以任何方式来存储它。
类型信息:包括class的全限定名,class的直接父类,类类型还是接口类型,类的修饰符(public,等),所有直接父接口的列表,Class对象提供了访问这些信息的窗口(可通过Class.forName(“”)或instance.getClass()获得),下面是Class的方法,相信大家看了会恍然大悟,(原来如此)
getName(), getSuperClass(), isInterface(), getInterfaces(), getClassLoader();
static变量作为类型信息的一部分保存
指向ClassLoader类的引用:在动态连接时装载该类中引用的其他类
指向Class类的引用:必然的,上边已述
该类型的常量池:包括直接常量(String,integer和float point常量)以及对其他类型、字段和方法的符号引用(注意:这里的常量池并不是普通意义上的存储常量的地方,这些符号引用可能是我们在编程中所接触到的变量),由于这些符号引用,使得常量池成为java程序动态连接中至关重要的部分
字段信息:普通意义上的类型中声明的字段
方法信息:类型中各个方法的信息
编译期常量:指用final声明或者用编译时已知的值初始化的类变量
class将所有的常量复制至其常量池或者其字节码流中。
方法表:一个数组,包括所有它的实例可能调用的实例方法的直接引用(包括从父类中继承来的)除此之外,若某个类不是抽象和本地的,还要保存方法的字节码,操作数栈和该方法的栈帧,异常表。举例:
class Lava{
private int speed = 5;
void flow(){}
}
class Volcano{
public static void main(String[] args){
Lava lava = new Lava();
lava.flow();
}
}
运行命令java Volcano;
(1)JVM找到Volcano.class倒入,并提取相应的类型信息到方法区。通过执行方法区中的字节码,JVM
执行main()方法,(执行时会一直保存指向Vocano类的常量池的指针)
(2)Main()中第一条指令告诉JVM需为列在常量池第一项的类分配内存(此处再次说明了常量池并非
只存储常量信息),然后JVM找到常量池的第一项,发现是对Lava类的符号引用,则检查方法区,看Lava类是否装载,结果是还未装载,则查找“Lava.class”,将类型信息写入方法区,并将方法区Lava类信息的指针来替换Volcano原常量池中的符号引用,即用直接引用来替换符号引用。
(3)JVM看到new关键字,准备为Lava分配内存,根据Volcano的常量池的第一项找到Lava在方法区的位置,并分析需要多少对空间,确定后,在堆上分配空间,并将speed变量初始为0,并将lava对象的引用压到栈中
(4)调用lava的flow()方法
好了,大致了解了方法区的内容后,让我们来看看堆
java对象的堆实现:
java对象主要由实例变量(包括自己所属的类和其父类声明的)以及指向方法区中类数据的指针,指向方法表的指针,对象锁(非必需),等待集合(非必需),GC相关的数据(非必需)(主要视GC算法而定,如对于标记并清除算法,需要标记对象是否被引用,以及是否已调用finalize()方法)。
那么为什么java对象中要有指向类数据的指针呢?我们从几个方面来考虑
首先:当程序中将一个对象引用转为另一个类型时,如何检查转换是否允许?需用到类数据
其次:动态绑定时,并不是需要引用类型,而是需要运行时类型,这里的迷惑是:为什么类数据中保存的是实际类型,而非引用类型?这个问题先留下来,我想在后续的读书笔记中应该能明白
指向方法表的指针:这里和C++的VTBL是类似的,有利于提高方法调用的效率
对象锁:用来实现多个线程对共享数据的互斥访问
等待集合:用来让多个线程为完成共同目标而协调功过。(注意Object类中的wait(),notify(),notifyAll()方法)。
Java数组的堆实现:数组也拥有一个和他们的类相关联的Class实例,具有相同dimension和type的数组是同一个类的实例。数组类名的表示:如[[Ljava/lang/Object 表示Object[][],[I表示int[],[[[B表示byte[][][]
至此,堆已大致介绍完毕,下面来介绍程序计数器和java栈
程序计数器:为每个线程独有,在线程启动时创建,若thread执行java方法,则PC保存下一条执行指令的地址。
若thread执行native方法,则Pc的值为undefined
Java栈:java栈以帧为单位保存线程的运行状态,java栈只有两种操作,帧的压栈和出栈。
每个帧代表一个方法,java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。
帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。
本地方法栈:依赖于本地方法的实现,如某个JVM实现的本地方法借口使用C连接模型,则本地方法栈就是C栈,可以说某线程在调用本地方法时,就进入了一个不受JVM限制的领域,也就是JVM可以利用本地方法来动态扩展本身。
第二篇:Java读书笔记
读书笔记
1、类和对象:类是用来定义一组对象共同具有的状态和行为的模版。而对象是现实世界中个体或事物的抽象表示,并且封装了它们的属性和行为。
2、为了防止命名冲突,Java采用了管理类文件的机制,即类包机制。(package)定义包名的语法格式:
“package包名;”
Java命名规则要求包的命名需要使用小写字母。
3、成员变量和成员方法:
1成员变量是在类体中定义的变量即全局变量,○成员变量一般用于定义对象的状态。成员变量是给对象使用的,每个对象被创建后都会有属于自己的属性,即成员变量。通过修改这些属性,从而改变对象的某个状态。
2成员方法是对象行为的描述。○
定义成员方法的语法格式:
“[修饰符] 返回值类型方法名([形参表]){
······//方法体
}”
修饰符:可以是:publicprivateprotactedstaticfinall等;
返回值类型:如果方法需要返回值,必须这里声明方法的返回值类型,可以是基
本数据类型(int short double booleanvoid等),也可以是对象
类型如:数组、字符串等。
形参表:(可选部分)说明方法被调用时应该向它传递的数据。形参表可以有一
个也可以有多个,当有多个形参时每个形参之间要用“,”隔开。
1创建对象:创建对象使用到new语句。
4、对象:○
声明并创建对象的语法格式如下:
“类名对象名=new 类构造方法()”
构造方法:构造方法是类创建对象是必须执行的方法,用于构造一个新的对象并
初始化对象属性。
2访问对象的属性: ○
语法格式:
“对象名.属性”
3执行对象的行为:○对象的行为就是对象的成员方法,通常说调用或执行对象的某个方法。
语法格式:
“对象名.成员方法名();”
4对象的销毁:Java提供了垃圾回收机制,对不再使用的对象会自动销毁,也可○
以在程序中显式的为某个对象赋null值,使对象不再被使用。
垃圾回收机制会找到并销毁它,释放该对象所占用的资源。
语法格式:
“对象名=null”
1创建类:Java中使用class关键字来创建类。
5、类:○
声明并创建类的语法格式:
“权限修饰符 class类名{
类体;
}”
权限修饰符:(可选项)可以使用public protected private 或者省略这3者。类体主要由成员变量和方法两部分组成。
2成员变量:在Java中对象的属性也称为成员变量。○
声明并创建成员变量的语法格式:
“权限修饰符数据类型成员变量名;”
(用static关键字定义的成员变量被称为静态成员变量即类变量。静态成员变量不是分配给每个对象的,而是属于累的变量。它在内存中是唯一的,可以直接使用“类名.成员变量名”的格式去访问,他在内存中的位置是固定的,是该类的所有实例对象所共享的存储单元。)
3成员方法:在Java语言中使用成员方法对应与类对象的行为。○
定义成员方法的语法格式:
“权限修饰符返回值类型方法名(参数类型参数名){
·······//方法体
}”
(同类变量一样,由static关键字定义的成员方法被称为类方法,类方法可以不必创建对象而由类直接访问,静态方法不可以直接调用非静态方法)4局部变量:○在方法体中声明的变量为局部变量,局部变量的有效范围为方法体结束。
5this关键字:在Java语言中用this关键字来代表类对象的引用,this关键字被○
隐式地用于引用对象的成员变量和方法。(在类方法中不可以使用this关键字。)this关键字和和对象都可以调用成员变量和方法,两者的区别:
事实上,this引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就要添加this关键字明确引用的是类成员还是局部变量的方法参数。6类的构造方法:构造方法与类同名。○
7类的主方法:主方法是类的入口点,它定义了程序从何处开始;主方法提供对○
程序流向的控制,Java编译器通过主方法来执行程序。
1)主方法是静态的,所以如果要直接在主方法体中
调用其他方法,则该方法必须也是静态的。
2)主方法没有返回值。
3)主方法的形参为数组。其中args[0]~args[n]分别
代表程序的第一个参数到第n个参数,可以使用
args.length获取参数的个数。
Java中完整的类声明格式:
“权限修饰符class类名{
权限修饰符数据类型成员变量名1;
权限修饰符数据类型成员变量名2;
·······
权限修饰符数据类型成员变量名n;
权限修饰符返回值类型成员方法名1(形参类型形参变量){ 方法体
}
权限修饰符返回值类型成员方法名2(形参类型形参变量){ 方法体
}
······
权限修饰符返回值类型成员方法名n(形参类型形参变量){ 方法体
} }”
6.由于类的主方法是静态方法所以不可以调用类中的非静态方法所以当需要调用非静态方法时必须创建对象来调用。在输入不同类型的数据时要使用不同的Scanner类对象,否则只能实现输入一种数据类型。
7.abstract关键字是定义抽象类的关键字。使用abstract定义的发放成为抽象方法。抽象方法没有方法体。抽象方法的唯一意义就是被重载。
第三篇:高级java面试题
高级java面试题
来源:58.com 2013-09-23 17:15
高级java面试题:
第一,Anonymous Inner Class(匿名内部类)是否可以继承其它类,是否可以实现接口? 匿名的内部类是没有名字的内部类。不能继承其它类,但可作为一个接口,由另一个内部类实现。
第二,谈谈final, finally, finalize的区别。
final 如果一个类被声明为final,意味着它不能再派生出新的子类,因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally 用来清除异常。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize()在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。它是在 Object 类中定义的,因此所有的类都继承了它。
第三,Static Nested Class 和 Inner Class的不同。
Nested Class(一般是C++的说法),Inner Class(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。
注:静态内部类(Inner Class)意味着:创建一个static内部类的对象不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类 允许一个 null 键和多个 null 值。
Hashtable 类 不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。
示例:
assert(a > 0);// throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1;
assert Expression1 : Expression2;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记: javac-source 1.4 Test.java
要在运行时启用断言,可使用-enableassertions 或者-ea 标记。
要在运行时选择禁用断言,可使用-da 或者-disableassertions 标记。
要系统类中启用断言,可使用-esa 或者-dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其
参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
第八,GC是什么? 为什么要有GC?
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String(“xyz”);创建了几个String Object?
两个对象,一个是String类型的“xyx”,一个是指向“xyx”的引用对象s。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。个人猜测,可能是以下结构:
run(){
myThread.start();
······
}
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。第二十五,是否可以继承String类?
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
有C背景的程序员特别喜欢问这种问题。
第二十九,两个对象值相同(x.equals(y)== true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、short、char 或者byte。long,string 都不能作用于swtich。
第三十二,编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if(instance==null)
instance=new Singleton();return instance;} }
第四篇:java高级编程教学大纲
《Java高级编程》教学大纲
郑州大学软件技术学院
一、课程的性质与任务
本课程是软件开发专业开设的程序设计类高级课程,学生在学习了《程序设计导论》,初步具备了一定的程序以介绍面向对象编程的基本概念、基本理论为重点,结合Java语言的语法规则、编程特点和设计思想、强调容易发生错误和编程应注意的地方,使学生能对Java技术有一个总体了解,通过本课程学习,使学生掌握Java语言的基础知识,理解和掌握面向对象程序设计的基本思想,熟练地使用Java语言进行程序的编写、编译以及调试工作设计基本理念后才可学习本课程。本课程将教给学生如何利用Java这一有力工具进行程序设计,如程序逻辑、用户界面、数据处理、多媒体编程方法、网络通讯软件开发等。由于教材采用弱化语法,深入浅出的表达方式,使得学生将主要的注意力放在用软件实现实际问题上,而不是放在程序设计语言这一载体上。
二、教学基本要求
(讲课学时:68;实训学时:32)
1、Java概述
了解Java 语言的发展和特点 了解Java 语言的工作机制
掌握JBuilder9.0开发工具的安装和简单使用 了解面向对象程序设计的理念 Java应用程序及小程序举例
2、Java语言基础
熟悉Java语言的标识符、基本数据类型
熟悉Java语言的运算符、表达式、运算优先级等。 了解Java语言的包装类
熟练掌握if—else语句和 switch语句。
熟练运用Java语言的分支结构进行简单的程序设计。 熟练掌握while语句、do—while语句和for 语句。 熟练运用循环流程控制语句进行简单的程序设计。 基本掌握循环嵌套的使用。 初步掌握break、continue、return语句。 能够初步掌握方法、异常处理的程序设计技术。
了解面向过程的编程方法的局限性,了解面向对象的编程的基本术语、基本特性等。
掌握类的定义与对象的生成。 掌握构造方法的特点、作用。 初步掌握类和成员的修饰符。 初步掌握类继承的实现方式。 了解抽象类和抽象方法 了解接口的定义和实现方法 了解接口的继承和多态 了解包的创建及其使用方法
3、Java Applet程序设计
了解Java Applet的特点和运行机制。
了解HTML语言,熟悉如何在HTML文件中嵌入Applet。 了解Applet的类层次及框架结构。 初步掌握Applet的主要方法及生命周期。 AWT绘制基础。 掌握应用字体的方法。 掌握应用颜色的方法。 掌握绘制简单图形的方法。
4、图形界面设计
熟练掌握基本组件的使用 掌握高级组件的使用 掌握面板和布局控制
掌握窗口、菜单和对话框的使用 会进行一般的图形界面设计
5、输入输出设计
理解基本I/O流 了解文件I/O流 了解字节流 了解字符流
会进行稍微复杂的I/O设计
6、多线程 理解多线程的概念 掌握线程的生命周期
会用多线程编写较为灵活的程序
以介绍面向对象编程的基本概念、基本理论为重点,结合Java语言的语法规则、编程特点和设计思想、强调容易发生错误和编程应注意的地方,使学生能对Java技术有一个总体了解,通过本课程学习,使学生掌握Java语言的基础知识,理解和掌握面向对象程序设计的基本思想,熟练地使用Java语言进行程序的编写、编译以及调试工作
7、多媒体程序设计
了解java多媒体框架 掌握音频开发的方法 了解视频开发
8、数据库程序开发
掌握ODBC的概念 掌握连接数据库的方法 了解操作数据库的组件 了解管理数据库的方法
9、网络通讯
理解TCP/IP网络通讯 了解Java网络类和接口 了解面向连接的套接字通讯 了解无连接的数据报通讯
以介绍面向对象编程的基本概念、基本理论为重点,结合Java语言的语法规则、编程特点和设计思想、强调容易发生错误和编程应注意的地方,使学生能对Java技术有一个总体了解,通过本课程学习,使学生掌握Java语言的基础知识,理解和掌握面向对象程序设计的基本思想,熟练地使用Java语言进行程序的编写、编译以及调试工作
文章由北大青鸟.嘉华教育(深圳大学实训基地&北大青鸟全国三甲校区):www.xiexiebang.com 深圳权威IT培训学校,欢迎课程咨询交流QQ:100236036
第五篇:如何成为高级Java程序员
如何成为高级Java程序员
给一个刚出社会的程序员新生一个建议,想成为一个优秀的程序员,高级程序员,不能眼高手低,不能认为开发新项目,技术研发才学到东西,不能看不起维护系统,不要以为自己懂的技术越多自认为自己很牛叉。假如你忽略了一个问题那么你永远成为不了优秀的程序员、高级程序员,那就是系统优化。
一、JAVA。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包、Util包、Text包、JMS、EJB、RMI、线程。如果可能,希望您对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其实您想实现的很多功能,通过JAVA的API都可以实现了,就不必自己费太多的脑经了。
二、设计模式。其实写代码是很容易的事情,我相信您也有同感。但如何写得好就比较难了。这个“好”字包括代码可重用性,可维护性,可扩展性等。如何写出好的代码往往要借助一些设计模式。当然长期的代码经验积累,只要您用心,会使您形成自己代码风格。相信您的代码也比较符合代码的可重用性,可维护性,可扩展性。但既然前人已经给我们总结出了经验,我们何不踩着前人的肩膀前进?
三、XML。现在的系统中不使用XML几乎是不可能的。XML的功能非常强大,它可以做数据转换、做系统的配置、甚至可保存您的系统业务数据。因此您必须了解XML,包括它的语法,结构。您还需要比较熟练的使用解析XML的一些API,比如JDOM,SAX等,因为在我们一般的项目中,XML往往担当系统配置信息的作用,您需要用这些API解析这些配置信息,开发完美的项目。
四、精通使用一种或两种框架。像在《如何成为java初级程序员》中提到的那样,“框架都会有许多可重用的代码,良好的层次关系和业务控制逻辑,基于框架的开发使你可以省出很多的开发成本”。但我这里希望您能精通,更多的是希望您能通过框架的使用了解框架的思想。这样您在开发一个项目时思路会开阔一些,比如您会想到把SQL语句与您的java代码分开,再比如您会考虑把您的业务逻辑配置到XML或者数据库中,这样整个项目就很容易扩张了。
五、熟悉主流数据库。其实真正比较大的项目都是有人专门做数据库的,但往往很多项目要求作为(高级)工程师的您也参与数据库的设计以及SQL的编写。所以为了更好的为国家做贡献,建议您还是多了解一些主流数据库,比如SQLSERVER,ORACLE,多连接SQL和存储过程以及触发器。如果您不是“科班”出身,您还需要补充一些数据库原理方面的知识。
六、精通一种或两种WEBServer。尽管我再《如何成为java初级程序员》里讲过它,我还是要强调您要精通一种或两种。因为作为java工程师,特别时想成为高级JAVA工程师的您,您不可避免地要部署您的项目到WebServer上,而且只有当您精通一种WebServer,您才可能最大限度地使用它的资源,这往往可以节省很多时间和精力。
七、UML。我知道您肯定想成为高级工程师,因此您有必要了解或熟练或精通UML,这取决于您有多大决心想成为高级工程师和项目经理。在比较正规的开发团队中,UML是讨论项目的交流工具,您要想做一个软件工程师,您至少要能看懂,您要想做高级工程师,您要能通过它来描述您对项目的理解,尽管这不是必须,但却很重要。
八、站在高度分析问题:这不是一个知识点,也不是通过书本就能学得到的。只所以提到这一点,是因为我比您还着急,我希望您更快的成为一个高级的软件工程师,而不是一个一般的软件工程师。希望您在工作中多向您的系统分析员、需求分析员、系统设计员学习,多站在他们角度上去看您在开发的项目。在最好在项目之初先在您的脑海里对项目有个大致的分析、设计,然后和他们进行比较,找找差别,想想缺点。
九、工具。与在《如何成为java初级程序员》里提到的不同,您在这个阶段可能接触到不同的工具了,尽管您还需要使用JB或者IDEA,但能可能对ROSE,Together要多了解一些,因为您要画UML了。不要再对Dreamweaver等HTML编辑器情有独钟了,那些JSP页面让初级程序员去写吧。
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。