JAVA学习.docx

上传人:b****8 文档编号:11445922 上传时间:2023-03-01 格式:DOCX 页数:18 大小:1.68MB
下载 相关 举报
JAVA学习.docx_第1页
第1页 / 共18页
JAVA学习.docx_第2页
第2页 / 共18页
JAVA学习.docx_第3页
第3页 / 共18页
JAVA学习.docx_第4页
第4页 / 共18页
JAVA学习.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

JAVA学习.docx

《JAVA学习.docx》由会员分享,可在线阅读,更多相关《JAVA学习.docx(18页珍藏版)》请在冰豆网上搜索。

JAVA学习.docx

JAVA学习

JAVA的编译、执行过程

上图中基本上完整的描述了JAVA的编译执行过程,上图左边的JAVA编译器指的是JAVA源码级编译器,一般是在eclipse等开发环境中的。

具体如下图

JAVA程序员所做的就是使用开发环境伪编译出字节码文件,供JAVA虚拟机执行。

JAVA虚拟机JVM是一个假想的计算机,也具有内存、寄存器和堆栈等概念,他是运行在真实的计算机操作系统上的程序。

JAVA虚拟机由即使编译器和解释器组成,虚拟机是实现JAVA代码一次编译,到处执行的关键。

虚拟机是连接java源代码和操作系统的桥梁。

以前的C等程序是根据操作系统的不同,编译生成不同的可执行代码。

而JAVA在他们中间插入了虚拟机这一层,将问题分布解决了。

JVM通过规范的设计,使得源代码编译成一套统一的字节码,屏蔽了操作系统的区别。

至于字节码怎么转换成不同机器可以执行的程序,那是第二步的问题,也就是解释器要做的事情。

因此,解释器是根据不同的机器和操作系统而不同的。

解释器连接了虚拟机和可执行的机器码。

解释器是可变的接口,JVM为两者搭建了一个利于解释的平台。

实际上,很多问题都是这样分层解决的。

应用程序直接面对硬件,几乎是不能实现的难度,于是对硬件抽象出了驱动程序、操作系统,屏蔽硬件的差别。

而为了屏蔽操作系统的差别,出现虚拟机也是顺理成章的,关键在于,JVM设计的巧妙性,使他非常适合JAVA的字节码的运行。

它是根据java的特点设计的虚拟机规范。

上图右侧分为即使编译和解释器两个箭头实际上有一些问题,就如同下图

其中的JVM字节码分为两个方向,

1.即时编译方式:

解释器先将字节码编译成机器码,然后再执行该机器码。

 2.解释执行方式:

解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。

通常采用的是第二种方法。

由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作具有较高的效率。

对于那些对运行速度要求较高的应用程序,使用第一种方法。

JIT可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。

Java的public类

JAVA类和变量默认friendly

变量访问权限:

(默认的为friendly)

public公共:

private私有:

只允许本类内部访问

protect受保护:

同一个包的类,及其子类可以访问

friendly友好(默认的):

此时只允许同一个包内的类访问

Java文档注释

就是写成/**的注释,当然这个注释也是在源代码中的,会自动生成javadoc解释文档。

Java主方法main

JAVA常量默认int

条件运算符

函数static属性

For循环先声明和赋值tem变量

类的多态

类名规范

封装性

构造函数

定义:

使用:

注意:

内存位置

第一个,是新开辟内存空间,后一个,是字符串有内存空间,然后定义无论STR2还是str3=“java”,都是指向这个内存空间。

创建string不要轻易改变

String是不可变的类型,即创建一个String对象后,就不能修改这个String,平常使用的"aa"+"bb"生成"aabb"这个过程中,实际是创建了三个String对象:

"aa","bb","aabb"

StringBuffer是相对于String的一个可变的类型,StringBuffer可以在原对象上进行加长或缩短等修改操作。

适用于需要大量连接字串或拼接处理字串的情况,相应的情况下就不宜使用String对象了。

对于

String str = "hello world";

相当于str是一个常量,

当对str进行操作的时候,比如

str += "test";

它不是简单的在"hello world"后面加上"test",

而是在内存中重新开一个空间,先拷贝"hello world"再接着拷贝"test"组成新的

字符串"hello worldtest",并把这个字符串的引用重新赋值给str,

也就是说,对于一个String对象引用,你最好就只是取用它,

一旦你对它进行任何操作都将导致引用本身改变,而且还有很高的代价。

再看下面代码:

建议自己跑下,

String test1 = "test";

String test2 = "test";

System.out.println(test1.equals(test2));

System.out.println(test1==test2);

String test3 = new String("test");

System.out.println(test1.equals(test3));

System.out.println(test1==test3);

它的输出是:

true

true

true

false

很显然,虽然test1和test2是分别赋值的,但是都是赋值"test",

以:

"",表示的字符串在内存中会是唯一的,所以test1和test2不但使用equals比较是相等的使用==比较引用也是相等的。

而对于test3我使用了new String,这样会使分配一块新的内存并把"test"拷贝一份存入,

这样test3的引用指向的是新地址,而不是test1和test2所指向的地址,所以使用equals虽然相等,但是使用==比较引用就会返回false,

所以,对于STRING对象,你应该把它看成常量(当然,它的引用可以被重新赋值,这和FINAL定义的常量有本质区别),

如果你把"hello world"这个东西直接就看成是一个引用,也许就好理解些,显然这个引用不可能被你改变。

因此对于STRING的修改操作,应该尽量避免,频繁的操作应该使用StringBuffer

并在完成操作以后再根据需要转换成STRING对象使用。

更具体的可以看下THINK IN JAVA关于String的详细说明。

类变量

Static声明的属性是公用的,各个对象都可以改变同一个类属性

需要无参构造方法

因为声明对象时候,调用构造方法,而

语句中,没有传递参数。

所以,需要调用无参数构造方法。

但如果用户定义了自己的有参数的构造方法,那么系统就不会自动生成无参构造方法,所以构建会出错。

Super关键字

调用父类的构造方法、父类中的方法和属性

抽象类

Object类-所有类的超类

Final关键字——不能被继承

Interface——多继承的关键

方法内变量不能private

Runnable的实现与Thread子类方式实现多线程

区别:

前者实现了资源共享;

当一个类Class_a是某一个类的子类的时候,如果它Class_a要实现多线程,采用Thread的方法,他需要作为Thread的子类,但是它已经是别的类的子类了,所以不能再作为Thread的子类,因为不允许子类Class_a有多个父类。

在类内定义该类的对象

上面的代码中,在主方法内定义了公有类的对象t1,程序可以正常运行;

在其他类内也可以定义,比如run方法中,也可以定义最外层类的对象,有点类似递归调用。

但是需要注意,这种方法很容易出现死循环。

仿佛主方法是在所有定义的类外一样。

线程生命周期控制

JAVASocket

使用TCP协议,面向连接的情况:

不太理解的时间里了亮哥socker对象,这是因为一个是用于监听,

另一个是管理监听到之后的客户端连接。

之后服务器端发送数据,都用到后来的这个clientsocket。

前面的依然用于服务器端监听。

下面是另外一个类似的过程说明:

客户端不需要监听对象,但是需要buffer对象,用于接收。

Java工程中的main方法

1.一个类中只有一个main主方法

2.工程中可以有多个main方法,但是在编译执行的时候,IDE会提示设置从哪个主方法作为应用的入口;

3.每个类中的main方法供测试需要

4.每个类都可以有main方法,但每个类只能有一个完全相同的main方法。

程序运行时,执行的是哪个main方法,在IDE中可以设置。

如果是jar包,就在META-INF\manifest.mf中指定。

5.可以有多个,比如在类A,B,C中都存在main方法,那么,你在测试的时候,可以选择,A,B,C任意一个作为程序的入口运行.如果你要把这些程序打包,那么毕竟在配置文件中,添加一个main-class:

参数,那么这个main-class是你自己指定的,是A,是B,还是C,完全在于你怎么设置,明白了吗,祝你成功.

6.可以,只要参数不是一个类型或是数量不能就可以,那样的话就实现了函数重载!

具体会运行哪个方法就看你传入的参数了。

7.我们知道我们编写每个类的时候,要测试类是否有错误,通过在每个类都写一个main()方法来测试,这样子做有一个缺点,那就是必须带着那些已经编译过的额外代码,如果这对你是个麻烦,就可以使用嵌套类来放置测试代码

8.一个类里面这是不可能的哦亲

但是一篇代码里面可以有多个类每个类都可以有主方法但是只能有一个主类

使用eclipse启动程序会让你选择主方法

硬编码

硬编码(英语:

HardCode或HardCoding)指的是在软件实现上,把输出或输入的相关参数(例如:

路径、输出的形式或格式)直接以常量的方式书写在源代码中,而非在运行时期由外界指定的设置、资源、数据或格式做出适当回应。

一般被认定是种反模式或不完美的实现,因为软件受到输入数据或输出的格式改变就必需修改源代码,对客户而言,改变源代码之外的小设置也许还比较容易。

但硬编码的状况也并非完全只有缺陷,因某些封装需要或软件本身的保护措施,有时是必要的手段。

除此之外,有时候因应某些特殊的需求,制作出简单的应用程序,应用程序可能只会运行一次,或者永远只应付一种需求,利用硬编码来缩短开发的时间也是一种不错的决策。

应避免硬编码,就是用变量或者常量符号的时候,使用不可变的常数,可以定义一个类,存储常量值解决

在计算机程序或文本编辑中,硬编码是指将可变变量用一个固定值来代替的方法。

用这种方法编译后,如果以后需要更改此变量就非常困难了。

大部分程序语言里,可以将一个固定数值定义为一个标记,然后用这个特殊标记来取代变量名称。

当标记名称改变时,变量名不变,这样,当重新编译整个程序时,所有变量都不再是固定值,这样就更容易的实现了改变变量的目的。

尽管通过编辑器的查找替换功能也能实现整个变量名称的替换,但也很有可能出现多换或者少换的情况,而在计算机程序中,任何小错误的出现都是不可饶恕的。

最好的方法是单独为变量名划分空间,来实现这种变化,就如同前面说的那样,将需要改变的变量名暂时用一个定义好的标记名称来代替就是一种很好的方法。

通常情况下,都应该避免使用硬编码方法。

 

java小例子:

inta=2,b=2;

硬编码:

if(a==2)returnfalse;

不是硬编码if(a==b)returntrue;

一个简单的版本:

顾名思义,就是把数值写成常数而不是变量

如求圆的面积的问题PI(3.14)

3.14*r*r(这个3.14就是hardcode)

PI*r*r(这里的PI用的是变量形式,就不是hardcode)

C++例子:

intuser[120];

如果突然在程序中出现下面一段代码

for(inti=0;i<120;i++){

...

}

120是什么,为什么是120?

这里的120就属于数字式“硬编码”,这不仅让程序很难读,而且不易维护。

如果要修改120,就的修改程序中所有与此有关的120。

应将数字式“硬编码”声明成一个宏,这样程序不仅易读,而且还可以一改全改。

#defineMAX_USER_CNT120

for(inti=0;i

...

}[1]

JSP(JSTL)中如何使用常量防止硬编码?

js|编码-

一般来说,程序中写入硬编码是一个很不好的习惯,比如:

this.state="01";通常的做法是写一个类(接口)来存放常量

publicinterfaceSystemConstant

{

 StringSTATE_WTJ="01";

}

然后在程序中这样写就可以了

this.state=SystemConstant.STATE_WTJ;

在Java程序中这样就可以避免硬编码了。

可是JSP中呢?

当然,如果JSP中允许使用Scriplet的话当然也可以直接使用常量了,不过现在JSP中一般不允许出现<%%>这样的代码,比如在JSTL中怎么办呢?

iftest=${state=='01'}>

if>

这样又出现了'01'这样的硬编码了。

刚才看了AppFuse的解决方案,觉得挺不错。

先写一个JspTag,详细见org.appfuse.webapp.taglib.ConstantsTag类。

然后在Jsp里使用这个Tag

constantsscope="request"/>

这样,JSTL中就可以这样写了:

iftest=${state==STATE_WTJ}>

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1