java编程学习_Java进阶知识

文章描述:-2022年4月13日发(作者:鲁松庭)1批处理文件(bat)简单的说,批处理的作用就是自动的连续执行多条命令.编写bat处理文件可以使用记事本的方式:常见批处理文件的命令:echo表示显示此命令后的字符tiltle设置窗口的标题。echooff表示在此语句后所有运行的命令都不显示命令行本身color设置窗体的字体颜。@与echooff相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的

-

java编程学习_Java进阶知识
2022年4月13日发
(作者:鲁松庭)

1批处理文件(bat)

简单的说,批处理的作用就是自动的连续执行多条命令.编写bat处理文件可以使用记事本

的方式:

常见批处理文件的命令:

echo表示显示此命令后的字符tiltle设置窗口的标题。

echooff表示在此语句后所有运行的命令都不显示命令行本身

color设置窗体的字体颜。

@与echooff相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的

命令行(只能影响当前行)。

pause运行此句会暂停批处理的执行并在屏幕上显示Pressanykeytocontinue...

的提示,等待用户按任意键后继续

rem表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相

当于程序中的注释)或者%注释的内容%

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)

分隔的字符串

2对象拷贝

2.1对象的浅拷贝

浅复制(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对

象的引用仍然只指向原来的对象,换言之,浅复制仅仅复制锁考虑的对象,而不复制它

所引用的对象。

publicclassStudentimplementsCloneable{publicstaticvoidmain(String[]args){

Students1=newStudent("zhang",18);

Students2=(Student)();

="li";

=20;

n("name="++","+"age="+);//修改学生2

}publicObjectclone(){

}

Objecto=null;try{

o=();//Object中的clone()识别出你要复制的哪一个对象

}catch(CloneotSupportedExceptione){

n(ng());

}returno;

Stringname;intage;=name;=age;

Student(Stringname,intage){

后不影响学生1的值

}

}

2.2对象深拷贝

深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其

他对象的变量,那些引用其他对象的变量将指向被复制过的新对象,而不再试原有的那

些被引用的对象,换言之,深复制把要复制的对象所引用的对象都复制了一遍。

把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里

又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行

化(Deserialization)过程则叫做“解冻”或者“回鲜(depicking)”过程。应当指出的是,写

在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对

象的一个拷贝,Java咸菜还可以回鲜。

在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把

对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读出来(把

咸菜回鲜),便可以重建对象。

publicObjectdeepClone()

{//将对象写到流里ByteArrayOutoutStreambo=newByteArrayOutputStream();

ObjectOutputStreamoo=newObjectOutputStream(bo);

bject(this);//从流里读出来

ByteArrayInputStreambi=newByteArrayInputStream(Array());

}

ObjectInputStreamoi=newObjectInputStream(bi);return(ject());

1.内存溢出

由于Java具备自动的垃圾回收机制,当我们使用完对象之后,它们会被自动回收,

是不是我

们在Java程序中不需要再考虑内存管理了吗?

请看如下程序:

classStack{privateObject[]elements;

//初始化角标

intindex=0;

//默认初始化容量

privateintinitialCapacity=10;

publicStack(){elements=newObject[initialCapacity];

}

//压栈push

publicvoidpush(Objecte){ensureCapacity();elements[index++]=e;//n(index);

}

}

//弹栈pop

publicObjectpop(){if(index==0){thrownewRuntimeException("没有元素");}returnelements[--index];

}

privatevoidensureCapacity(){if(index==){elements=(elements,index*2+1);}

}

注意:从栈中弹出的对象不会作为垃圾回收,即使程序不再使用这些对象,因为栈内部继续

维护着这些对象.最终可能会导致内存占用的不断增加,程序性能降低.这就是内存泄漏.

改进版本

classStack{privateObject[]elements;

//初始化角标

intindex=0;

//默认初始化容量

privateintinitialCapacity=10;

publicStack(){elements=newObject[initialCapacity];

}

//压栈push

publicvoidpush(Objecte){ensureCapacity();elements[index++]=e;//n(index);

}

//弹栈pop

publicObjectpop(){if(index==0){thrownewRuntimeException("没有元素");}Objectobj=elements[--index];elements[index]=null;returnobj;

}

}

privatevoidensureCapacity(){if(index==){elements=(elements,index*2+1);}

}

2.设计模式

设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代

码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码

可靠性。

2.1.观察者模式

有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)

这是软件设计模式的一种。

观察者模式(Observer)完美的将观察者和被观察的对象分离开。

此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变

时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。有多个观察者时,不可以依赖特定的通知次序。Swing大量使用观察者模式,许多GUI框架也是如此。

气象站:

publicclassWeatherStation{

privateStringweather;

String[]weathers={"下雨","下雪","下冰雹","出太阳"};

staticListlist=newArrayList();

Randomrandom=newRandom();

publicvoidstartWork(){

}

publicvoidupdateWeather(){weather=weathers[t(4)];n("天气:"+weather);

}

publicStringgetWeather(){

}

returnweather;

newThread(){

@Override

publicvoidrun(){

}

while(true){

}

updateWeather();

try{

}

(t(1000)+500);

tackTrace();

}catch(InterruptedExceptione){

}.start();

人:

publicclassPersonimplementsBookWeather{

}

Stringname;

publicPerson(Stringname){

}

privateWeatherStatitation;

publicPerson(Stringname,WeatherStatitation){

}

//下雨","下雪","下冰雹","出太阳"

@Override

publicvoidnotifyWeather(){

}

Stringweather=ther();

if("下雨".equals(weather)){

n(name+"打着雨伞上班");

n(name+"溜冰上班");

n(name+"带着头盔上班");

}elseif("下雪".equals(weather)){

}elseif("下冰雹".equals(weather)){

}elseif("出太阳".equals(weather)){n(name+"嗮着太阳上班");

}

this(name);

n=station;

=name;

测试类:

publicclassTest{

{

}

WeatherStatitation=newWeatherStation();

ork();

Personp1=newPerson("小明",station);

while(true){

}

Weather();

(2000);

publicstaticvoidmain(String[]args)throwsInterruptedException

问题:天气变化两三次,小明才知道一次。

解决方案:

;

;

ist;

;

publicclassWeatherStation{

privateStringweather;

String[]weathers={"下雨","下雪","下冰雹","出太阳"};

privatestatic

Randomrandom=newRandom();

publicvoidaddListaner(BookWeathere){

}

publicvoidstartWork(){

newThread(){

@Override

publicvoidrun(){

while(true){

updateWeather();

try{

(e);

Listlist=new

ArrayList();

}

}

}

}

(t(1000)+500);

tackTrace();

}catch(InterruptedExceptione){

}.start();

publicvoidupdateWeather(){

publicStringgetWeather(){

}

returnweather;

weather=weathers[t(4)];

n("天气:"+weather);

for(BookWeatheritem:list){

}

Weather(weather);

}

人:

publicclassPersonimplementsBookWeather{

}

接口:

publicinterfaceBookWeather{

}

publicvoidnotifyWeather(Stringweather);

Stringname;

publicPerson(Stringname){

}

privateWeatherStatitation;

publicPerson(Stringname,WeatherStatitation){

}

//下雨","下雪","下冰雹","出太阳"

@Override

publicvoidnotifyWeather(Stringweather){

}

if("下雨".equals(weather)){

n(name+"打着雨伞上班");

n(name+"溜冰上班");

n(name+"带着头盔上班");

}elseif("下雪".equals(weather)){

}elseif("下冰雹".equals(weather)){

}elseif("出太阳".equals(weather)){n(name+"嗮着太阳上班");

}

this(name);

n=station;

=name;

publicclassTest{

{

}

}

WeatherStatitation=newWeatherStation();

ork();

Personp1=newPerson("小明");

Personp2=newPerson("小红");

Personp3=newPerson("小青");

taner(p1);

taner(p2);

taner(p3);

publicstaticvoidmain(String[]args)throwsInterruptedException

2.2.单例

Singleton

是指只能拥有一个实例的类就是单例类。

私有构造方法。

获取方式

通过公共的静态方法创建单一的实例。

两种模式

懒汉模式–通常被称为延迟加载。注意存在线程安全问题.

饿汉模式

懒汉式的单例模式线程安全问题的解决方案:

}

classSingle{

//声明本类的一个私有的成员变量

privatestaticSinglesingle;

//第一步:私有化构造方法

privateSingle(){

}//第三步:提供一个公共的方法获取该类的实例对象

publicstaticSinglegetInstance(){

}

if(single==null){

synchronized(single){

}

returnsingle;

}

if(single==null){

}single=newSingle();

2.3.模板方法模式

TemplateMethodPattern

1:需求统计软件运行次数1:获取程序运行所需的时间for循环100次1:tTimeMillis()2:程序运行前加入,程序运行后加入。获取运行时间2:获取程序运行时间写法固定,像模版一样。需要运行的程序无法确定

//写出计算代码运行时间的模板。

abstractclassRuntime{

//要计算一段代码运行的时间。

publicfinalvoidgetRunTime(){

//要在代码运行时间记录当前的时间。

longstartTime=tTimeMillis();//返回一个以毫秒为单

位的当前时间。code();

longendTime=tTimeMillis();//获取当前结束的时间。

n("当前代码的运算时间:"+(endTime-startTime));

//内容补全。alt+/

}

}

//该方法要计算运算时间的代码。

publicabstractvoidcode();

2.4.装饰器设计模式

Decorator

一个新类要对原有类进行功能增强.

1.在增强类中维护一个被增强的父类引用变量

2.在增强类的构造函数中初始化1中的变量

3.创建需要增强的方法,在方法中调用需要被增强类的方法,并加以增强。

案例:进行io流处理时,经常需要处理异常,较为麻烦,可以使用该模式进行解决

/*把这些增强功能的类内部维护一个需要增强类。

-----|BufferedReader

---------|BuffferedLineum带行号的缓冲流

---------|BufferedQuto带双引号的缓冲流

---------|BufferedSemicolon带分号的缓冲流。

需求1:读取的每一行需要一个行号+双引号

需求2:读取的每一行需要一个行号+分号

装饰者设计模式:

1.装饰者设计模式与继承的区别:1.继承是面向对象的特征之一,装饰者设计模式是一种思想。2.继承代码比较清晰,但是不灵活。装饰设计模式更加灵活,但是代码比较复杂。如果需要增一个类的某些功能是,这时候如果使用继承,那么会导致继承的体系越来越庞大,

而装饰者设计模式可以减少继承。

*/

//带行号的字符缓冲流。

classBuffferedLineum1extendsBufferedReader{

intcount=1;//行号从1开始

publicBuffferedLineum1(BufferedReaderbufferedReader){//接收

privateBufferedReaderbufferedReader;

一个缓冲类对象.如果可以接收一个带双引号的缓冲类对象super(bufferedReader);

}

//在readLine方法中加上双引号

classBufferedQuto1extendsBufferedReader{

privateBufferedReaderbufferedReader=null;

publicBufferedQuto1(BufferedReaderbufferedReader){

}

publicStringreadLine()throwsIOException{Stringline=null;

super(bufferedReader);

edReader=bufferedReader;

publicStringreadLine()throwsIOException{

}

Stringline=null;

while((line=ne())!=null){

}

returnline;

line=count+":"+line;

count++;//每读完一行就加1.

returnline;

}

edReader=bufferedReader;

}

}

while((line=ne())!=null){

}

returnline;

return"""+line+""";

//每一行的后面加上分号

classBufferedSemicolon1extendsBufferedReader{

}

publicclassDemo2{

publicstaticvoidmain(String[]args)throwsIOException{

//读取的每一行需要一个行号+双引号

/*

FileReaderfileReader=newFileReader("F:");

BufferedReaderreader=newBufferedReader(fileReader);

BufferedQuto1bufferedQuto1=newBufferedQuto1(reader);

BuffferedLineum1buffferedLineum1=new

n(ne());

*/

//需求2:读取的每一行需要一个行号+分号

FileReaderfileReader=newFileReader("F:");

BufferedReaderreader=newBufferedReader(fileReader);

publicBufferedSemicolon1(BufferedReaderbufferedReader){

}

publicStringreadLine()throwsIOException{

}

Stringline=null;

while((line=ne())!=null){

}

returnline;

returnline+";";

super(bufferedReader);

edReader=bufferedReader;

privateBufferedReaderbufferedReader=null;

BuffferedLineum1(bufferedQuto1);

}

BufferedSemicolon1bufferedSemicolon1=new

BuffferedLineum1buffferedLineum1=new

n(ne());

BufferedSemicolon1(reader);

BuffferedLineum1(bufferedSemicolon1);

3.反射

类字节码文件是在硬盘上存储的,是一个个的.class文件。我们在new一个对象时,

JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接

使用之前缓存的这个字节码信息。

字节码的信息包括:类名、声明的方法、声明的字段等信息。在Java中“万物皆对象”,

这些信息当然也需要封装一个对象,这就是Class类、Method类、Field类。

通过Class类、Method类、Field类等等类可以得到这个类型的一些信息,甚至可

以不用new关键字就创建一个实例,可以执行一个对象中的方法,设置或获取字段的值,

这就是反射技术。

1.1.1.获取Class对象的三种方式

Java中有一个Class类用于代表某一个类的字节码。

Java提供了三种方式获取类的字节码forame()。forame方法用于加载某个类的字节码到内存中,并使用class对象

进行封装类名.class对象.getClass()

/**

*加载类的字节码的3种方式

*@throwsException

**/

publicvoidtest1()throwsException{

//方式一

Classclazz1=

e("");//方式二Classclazz2=;//方式三Personp1=newPerson();Classclazz3=ss();

}

1.1.2.通过Class类获取类型的一些信息

e()类的名称(全名,全限定名)

2

getSimpleame()类的的简单名称(不带包名)

3.创建对象无参数构造创建对象

newInstance()

4.获取指定参数的构造器对象,并可以使用Ctructor对象创建一个实例

CtructorgetCtructor(Class...parameterTypes)

/***通过Class对象获取类的一些信息**@throwsException**/privatestaticvoidtest2()throwsException{Classclazz1=

e("");//获取类的名称Stringname=e();n(name);//

//获取类的简单名称n(pleame());//Person//获取类的修饰符intmodifiers=ifiers();n(modifiers);//构建对象(默认调用无参数构造.)Objectins=tance();Personp=(Person)ins;n(p);//

@c17164//获取指定参数的构造函数Ctructorcon=structor(,

);//使用Ctructor创建对象.Objectp1=tance("jack",28);n(((Person)p1).getame());

}

1.1.3.通过Class类获取类型中的方法的信息

1.获取公共方法包括继承的父类的方法

getMethods()返回一个数组,元素类型是Method

2.获取指定参数的公共方法

getMethod("setame",);

3.获得所有的方法,包括私有Method[]getDeclaredMethods()

4.获得指定参数的方法,包括私有MethodgetDeclaredMethod(String

parameterTypes)

name,Class.../***获取公有方法.*@throwsException**/privatestaticvoidtest3()throwsException{Classclazz1=

e("");//1.获取非私用方法(包括父类继承的方法)Method[]methods=hods();System.

n();for(Methodm:methods){//n(e());if("eat".equals(e())){(tance(),null);}}}

/***获取指定方法签名的方法**@throwsException**/privatestaticvoidtest4()throwsException{Classclazz1=

e("");//获取指定名称的函数Methodmethod1=hod("eat",null);(newPerson(),null);}

/***获取指定方法名且有参数的方法**@throwsException**/privatestaticvoidtest5()throwsException{Classclazz1=

e("");Methodmethod=hod("eat",);(newPerson(),"包子");}/***获取指定方法名,参数列表为空的方法.**@throwsException**/privatestaticvoidtest4()throws

Exception{Classclazz1=

e("");//获取指定名称的函数Methodmethod1=hod("eat",null);(newPerson(),null);}

/***反射静态方法*@throwsException**/privatestaticvoidtest7()throwsException{Classclazz1=

e("");Methodmethod=hod("play",null);(null,null);}/**

*访问私有方法暴力反射

*@throwsException**/privatestaticvoidtest6()throwsException{Classclazz1=

e("");Methodmethod=laredMethod("movie",

);essible(true);(newPerson(),"陈老师");}

1.1.4.通过Class类获取类型中的字段的信息

1.获取公共字段Field[]getFields()

2.获取指定参数的公共字段FieldgetField(Stringname)

3.获取所有的字段Field[]getDeclaredFields()

4.获取指定参数的字段,包括私用FieldgetDeclaredField(Stringname)

/***获取公有的字段**/privatestaticvoidtest8()throwsException{Classclazz1=

e("");Field[]fields=lds();Personp=newPerson();n();for(Fieldf:fields){n(e());if("name".equals(e())){n(e().getame());(p,"jack");}}n(e());}

/***获取私有的字段*@throwsException**/privatestaticvoidtest9()throwsException{Classclazz1=

e("");Fieldfield=laredField("age");n(e());essible(true);Personp=newPerson();(p,100);n(());}

3.2.工厂模式

Factory

例如:汽车销售商场

该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创

建对象,该模式是比较理想的.

publicclassDemo1{publicstaticvoidmain(String[]args){

n("买宝马");

Carbmw=CarFactory("BMW");

();n("买大奔");Carbenz=CarFactory("Benz");();

}

publicstaticCarCarFactory(Stringcarame){if("BMW".equals(carame)){returnnewBMW();}elseif("Benz".equals(carame)){returnnewBenz();}else{thrownewRuntimeException("车型有误");}

}

}

abstractclassCar{publicabstractvoidrun();

}

classBMWextendsCar{@Overridepublicvoidrun(){n("BMW跑跑");}

}

classBenzextendsCar{@Overridepublicvoidrun(){n("Benz跑跑");}

}

模拟spring工厂:

edReader;

ader;

ption;

uctor;

;

classStudent{

}

classPerson{

privateintage;

publicPerson(){

privateintid;

privateStringname;

publicStudent(intid,Stringname){

}

publicStudent(){

}

publicintgetId(){

}

publicvoidsetId(intid){

}

publicStringgetame(){

}

publicvoidsetame(Stringname){

}

@Override

publicStringtoString(){

}

+"-"+;

=name;

returnname;

=id;

returnid;

=id;

=name;

}

}

@Override

publicStringtoString(){

}

+"";

publicclassDemo1{

}

publicstaticvoidmain(String[]args)throwsException{

}

publicstaticObjectgetInstance()throwsException{

}

FileReaderfileReader=newFileReader("src/");

BufferedReaderbufferedReader=newBufferedReader(fileReader);

Stringline=ne();

Classclazz=e(line);

Objectc1=tance(null);

while((line=ne())!=null){

}

returnc1;

String[]datas=("=");

Fieldf=laredField(datas[0]);

essible(true);

if(e()==){(c1,nt(datas[1]));

}else{

//essible(true);

}

(c1,datas[1]);

Ctructorc=structor(null);

Objecto=getInstance();

n(o);

-

java编程学习_Java进阶知识

发布时间:2022-04-13 02:42:30
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 6 条评论,868人围观)
吻戏鉴定师V铁粉15 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
null);}/***反射静态方法*@throwsException**/privatestaticvoidtest7()throwsException{Classclazz1=e("");Methodmethod=hod("play"
218219V铁粉1 minute ago Google Chrome 93.0.4577.82 Windows 10 x64
18);Students2=(Student)();="li";=20;n("name="++"
遇难V铁粉16 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
classStack{privateObject[]elements;//初始化角标intindex=0;//默认初始化容量privateintinitialCapacity=10;publicStack(){elements=newObject[initialCapacity];}//压栈pushpublicvoidpush(Objecte){ensureCapacity();elements[index++]=e;//n(index);}}//弹栈poppublicObjectpop(){if(index==0){thrownewRuntimeException("没有元素");}returnelements[--index];}privatevoidensureCapacity(){if(index==){elements=(elements
治疗胃溃疡V铁粉25 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
forame方法用于加载某个类的字节码到内存中
清华同方驱动V铁粉9 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
);essible(true);(newPerson()

最近发表

随便看看

热门文章

标签列表