|
一,Java初学者学习笔记Java超详细的学习笔记,点击我获取1,Java基础语法一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类:类是一个模板,它描述一类对象的行为和状态。方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。1-1第一个Java程序下面看一个简单的Java程序,它将打印字符串HelloWorldpublicclassHelloWorld{/*第一个Java程序*它将打印字符串HelloWorld*/publicstaticvoidmain(String[]args){System.out.println("HelloWorld");//打印HelloWorld}}12345678下面将逐步介绍如何保存、编译以及运行这个程序:打开代码编辑器,把上面的代码添加进去;把文件名保存为:HelloWorld.java;打开cmd命令窗口,进入目标文件所在的位置,假设是C:\在命令行窗口输入javacHelloWorld.java按下回车键编译代码。如果代码没有错误,cmd命令提示符会进入下一行(假设环境变量都设置好了)。再键输入javaHelloWorld按下回车键就可以运行程序了你将会在窗口看到HelloWorldC:>javacHelloWorld.javaC:>javaHelloWorldHelloWorld123Gif图演示:1-2基本语法编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass。方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。主方法入口:所有的Java程序由publicstaticvoidmain(String[]args)方法开始执行。1-3Java标识符Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。关于Java标识符,有以下几点需要注意:所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合关键字不能用作标识符标识符是大小写敏感的合法标识符举例:age、$salary、_value、__1_value非法标识符举例:123abc、-salary1-4Java修饰符像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:访问控制修饰符:default,public,protected,private非访问控制修饰符:final,abstract,static,synchronized在后面的章节中我们会深入讨论Java修饰符。1-5Java变量Java中主要有如下几种类型的变量局部变量类变量(静态变量)成员变量(非静态变量)1-6Java数组数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。1-7Java枚举ava5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。classFreshJuice{enumFreshJuiceSize{SMALL,MEDIUM,LARGE}FreshJuiceSizesize;}publicclassFreshJuiceTest{publicstaticvoidmain(String[]args){FreshJuicejuice=newFreshJuice();juice.size=FreshJuice.FreshJuiceSize.MEDIUM;}}12345678910111-8Java关键字1-9Java注释类似于C/C++、Java也支持单行以及多行注释。注释中的字符将被Java编译器忽略。publicclassHelloWorld{/*这是第一个Java程序*它将打印HelloWorld*这是一个多行注释的示例*/publicstaticvoidmain(String[]args){//这是单行注释的示例/*这个也是单行注释的示例*/System.out.println("HelloWorld");}}12345678910111-10Java空行空白行或者有注释的行,Java编译器都会忽略掉。1-11继承在Java中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(superclass),派生类称为子类(subclass)。1-12接口在Java中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。2,Java对象和类2-1Java中的对象现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。对比现实对象和软件对象,它们之间十分相似。软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。2-2Java中的类类可以看成是创建Java对象的模板。通过下面一个简单的类来理解下Java中类的定义:publicclassDog{Stringbreed;intage;Stringcolor;voidbarking(){}voidhungry(){}voidsleeping(){}}12345678910111213一个类可以包含以下类型变量:局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。2-3构造方法每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。下面是一个构造方法示例:publicclassPuppy{publicPuppy(){}publicPuppy(Stringname){//这个构造器仅有一个参数:name}}123456782-4创建对象对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:声明:声明一个对象,包括对象名称和对象类型。实例化:使用关键字new来创建一个对象。初始化:使用new创建对象时,会调用构造方法初始化对象。下面是一个创建对象的例子:publicclassPuppy{publicPuppy(Stringname){//这个构造器仅有一个参数:nameSystem.out.println("小狗的名字是:"+name);}publicstaticvoidmain(String[]args){//下面的语句将创建一个Puppy对象PuppymyPuppy=newPuppy("tommy");}}12345678910编译并运行上面的程序,会打印出下面的结果:小狗的名字是:tommy12-5访问实例变量和方法通过已创建的对象来访问成员变量和成员方法,如下所示:/*实例化对象*/ObjectreferenceVariable=newConstructor();/*访问类中的变量*/referenceVariable.variableName;/*访问类中的方法*/referenceVariable.methodName();1234562-6实例下面的例子展示如何访问实例变量和调用成员方法:publicclassPuppy{intpuppyAge;publicPuppy(Stringname){//这个构造器仅有一个参数:nameSystem.out.println("小狗的名字是:"+name);}publicvoidsetAge(intage){puppyAge=age;}publicintgetAge(){System.out.println("小狗的年龄为:"+puppyAge);returnpuppyAge;}publicstaticvoidmain(String[]args){/*创建对象*/PuppymyPuppy=newPuppy("tommy");/*通过方法来设定age*/myPuppy.setAge(2);/*调用另一个方法获取age*/myPuppy.getAge();/*你也可以像下面这样访问成员变量*/System.out.println("变量值:"+myPuppy.puppyAge);}}123456789101112131415161718192021222324252627编译并运行上面的程序,产生如下结果:小狗的名字是:tommy小狗的年龄为:2变量值:21232-7源文件声明规则在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。一个源文件中只能有一个public类一个源文件可以有多个非public类源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。如果一个类定义在某个包中,那么package语句应该在源文件的首行。如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。2-8Java包包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。2-9Import语句在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类importjava.io.*;12-10一个简单的例子在该例子中,我们创建两个类:Employee和EmployeeTest。首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为Employee.java。Employee类有四个成员变量:name、age、designation和salary。该类显式声明了一个构造方法,该方法只有一个参数。Employee.java文件代码:importjava.io.*;publicclassEmployee{Stringname;intage;Stringdesignation;doublesalary;//Employee类的构造器publicEmployee(Stringname){this.name=name;}//设置age的值publicvoidempAge(intempAge){age=empAge;}/*设置designation的值*/publicvoidempDesignation(StringempDesig){designation=empDesig;}/*设置salary的值*/publicvoidempSalary(doubleempSalary){salary=empSalary;}/*打印信息*/publicvoidprintEmployee(){System.out.println("名字:"+name);System.out.println("年龄:"+age);System.out.println("职位:"+designation);System.out.println("薪水:"+salary);}}12345678910111213141516171819202122232425262728293031程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。下面给出EmployeeTest类,该类实例化2个Employee类的实例,并调用方法设置变量的值。将下面的代码保存在EmployeeTest.java文件中。EmployeeTest.java文件代码:importjava.io.*;publicclassEmployeeTest{publicstaticvoidmain(String[]args){/*使用构造器创建两个对象*/EmployeeempOne=newEmployee("RUNOOB1");EmployeeempTwo=newEmployee("RUNOOB2");//调用这两个对象的成员方法empOne.empAge(26);empOne.empDesignation("高级程序员");empOne.empSalary(1000);empOne.printEmployee();empTwo.empAge(21);empTwo.empDesignation("菜鸟程序员");empTwo.empSalary(500);empTwo.printEmployee();}}1234567891011121314151617181920编译这两个文件并且运行EmployeeTest类,可以看到如下结果:$javacEmployeeTest.java$javaEmployeeTest名字:RUNOOB1年龄:26职位:高级程序员薪水:1000.0名字:RUNOOB2年龄:21职位:菜鸟程序员薪水:500.0123456789103,Java基本数据类型3-1内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。3-1-1byte:byte数据类型是8位、有符号的,以二进制补码表示的整数;最小值是-128(-2^7);最大值是127(2^7-1);默认值是0;byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;例子:bytea=100,byteb=-50。3-1-2short:short数据类型是16位、有符号的以二进制补码表示的整数最小值是-32768(-2^15);最大值是32767(2^15-1);Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是0;例子:shorts=1000,shortr=-20000。3-1-3int:int数据类型是32位、有符号的以二进制补码表示的整数;最小值是-2,147,483,648(-2^31);最大值是2,147,483,647(2^31-1);一般地整型变量默认为int类型;默认值是0;例子:inta=100000,intb=-200000。3-1-4long:long数据类型是64位、有符号的以二进制补码表示的整数;最小值是-9,223,372,036,854,775,808(-2^63);最大值是9,223,372,036,854,775,807(2^63-1);这种类型主要使用在需要比较大整数的系统上;默认值是0L;例子:longa=100000L,Longb=-200000L。"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。3-1-5float:float数据类型是单精度、32位、符合IEEE754标准的浮点数;float在储存大型浮点数组的时候可节省内存空间;默认值是0.0f;浮点数不能用来表示精确的值,如货币;例子:floatf1=234.5f。3-1-6double:double数据类型是双精度、64位、符合IEEE754标准的浮点数;浮点数的默认类型为double类型;double类型同样不能表示精确的值,如货币;默认值是0.0d;例子:doubled1=123.4。3-1-7boolean:boolean数据类型表示一位的信息;只有两个取值:true和false;这种类型只作为一种标志来记录true/false情况;默认值是false;例子:booleanone=true。3-1-8char:char类型是一个单一的16位Unicode字符;最小值是\u0000(即为0);最大值是\uffff(即为65,535);char数据类型可以储存任何字符;例子:charletter=‘A’;。3-2实例对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:publicclassPrimitiveTypeTest{publicstaticvoidmain(String[]args){//byteSystem.out.println("基本类型:byte二进制位数:"+Byte.SIZE);System.out.println("包装类:java.lang.Byte");System.out.println("最小值:Byte.MIN_VALUE="+Byte.MIN_VALUE);System.out.println("最大值:Byte.MAX_VALUE="+Byte.MAX_VALUE);System.out.println();//shortSystem.out.println("基本类型:short二进制位数:"+Short.SIZE);System.out.println("包装类:java.lang.Short");System.out.println("最小值:Short.MIN_VALUE="+Short.MIN_VALUE);System.out.println("最大值:Short.MAX_VALUE="+Short.MAX_VALUE);System.out.println();//intSystem.out.println("基本类型:int二进制位数:"+Integer.SIZE);System.out.println("包装类:java.lang.Integer");System.out.println("最小值:Integer.MIN_VALUE="+Integer.MIN_VALUE);System.out.println("最大值:Integer.MAX_VALUE="+Integer.MAX_VALUE);System.out.println();//longSystem.out.println("基本类型:long二进制位数:"+Long.SIZE);System.out.println("包装类:java.lang.Long");System.out.println("最小值:Long.MIN_VALUE="+Long.MIN_VALUE);System.out.println("最大值:Long.MAX_VALUE="+Long.MAX_VALUE);System.out.println();//floatSystem.out.println("基本类型:float二进制位数:"+Float.SIZE);System.out.println("包装类:java.lang.Float");System.out.println("最小值:Float.MIN_VALUE="+Float.MIN_VALUE);System.out.println("最大值:Float.MAX_VALUE="+Float.MAX_VALUE);System.out.println();//doubleSystem.out.println("基本类型:double二进制位数:"+Double.SIZE);System.out.println("包装类:java.lang.Double");System.out.println("最小值:Double.MIN_VALUE="+Double.MIN_VALUE);System.out.println("最大值:Double.MAX_VALUE="+Double.MAX_VALUE);System.out.println();//charSystem.out.println("基本类型:char二进制位数:"+Character.SIZE);System.out.println("包装类:java.lang.Character");//以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台System.out.println("最小值:Character.MIN_VALUE="+(int)Character.MIN_VALUE);//以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台System.out.println("最大值:Character.MAX_VALUE="+(int)Character.MAX_VALUE);}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455编译以上代码输出结果如下所示:基本类型:byte二进制位数:8包装类:java.lang.Byte最小值:Byte.MIN_VALUE=-128最大值:Byte.MAX_VALUE=127基本类型:short二进制位数:16包装类:java.lang.Short最小值:Short.MIN_VALUE=-32768最大值:Short.MAX_VALUE=32767基本类型:int二进制位数:32包装类:java.lang.Integer最小值:Integer.MIN_VALUE=-2147483648最大值:Integer.MAX_VALUE=2147483647基本类型:long二进制位数:64包装类:java.lang.Long最小值:Long.MIN_VALUE=-9223372036854775808最大值:Long.MAX_VALUE=9223372036854775807基本类型:float二进制位数:32包装类:java.lang.Float最小值:Float.MIN_VALUE=1.4E-45最大值:Float.MAX_VALUE=3.4028235E38基本类型:double二进制位数:64包装类:java.lang.Double最小值:Double.MIN_VALUE=4.9E-324最大值:Double.MAX_VALUE=1.7976931348623157E308基本类型:char二进制位数:16包装类:java.lang.Character最小值:Character.MIN_VALUE=0最大值:Character.MAX_VALUE=6553512345678910111213141516171819202122232425262728293031323334Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14×103=3140,3.14E-3就是3.14x10-3=0.00314。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类java.lang.Void,不过我们无法直接对它们进行操作。3-3类型默认值下表列出了Java各个类型的默认值:3-4实例publicclassTest{staticbooleanbool;staticbyteby;staticcharch;staticdoubled;staticfloatf;staticinti;staticlongl;staticshortsh;staticStringstr;publicstaticvoidmain(String[]args){System.out.println("Bool:"+bool);System.out.println("Byte:"+by);System.out.println("Character:"+ch);System.out.println("Double:"+d);System.out.println("Float:"+f);System.out.println("Integer:"+i);System.out.println("Long:"+l);System.out.println("Short:"+sh);System.out.println("String:"+str);}}1234567891011121314151617181920212223实例输出结果为:Bool:falseByte:0Characterouble:0.0Float:0.0Integer:0Long:0Short:0String:null1234567893-5引用类型在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employee、Puppy等。变量一旦声明后,类型就不能被改变了。对象、数组都是引用数据类型。所有引用类型的默认值都是null。一个引用变量可以用来引用任何与之兼容的类型。例子:Sitesite=newSite(“Runoob”)。3-6Java常量常量在程序运行时是不能被修改的。在Java中使用final关键字来修饰常量,声明方式和变量类似:finaldoublePI=3.1415927;1虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。字面量可以赋给任何内置类型的变量。例如:bytea=68;chara='A'12byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用常量的时候,前缀0表示8进制,而前缀0x代表16进制,例如:intdecimal=100;intoctal=0144;inthexa=0x64;123和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:"HelloWorld""two\nlines""\"Thisisinquotes\""123字符串常量和字符常量都可以包含任何Unicode字符。例如:chara='\u0001';Stringa="\u0001";12Java语言支持一些特殊的转义字符序列。3-7自动类型转换整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级。低------------------------------------>高byte,short,char—>int—>long—>float—>double123数据类型转换必须满足如下规则:\1.不能对boolean类型进行类型转换。\2.不能把对象类型转换成不相关类的对象。\3.在把容量大的类型转换为容量小的类型时必须使用强制类型转换。\4.转换过程中可能导致溢出或损失精度,例如:inti=128;byteb=(byte)i;12因为byte类型是8位,最大值为127,所以当int强制转换为byte类型时,值128时候就会导致溢出。\5.浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:(int)23.7==23;(int)-45.89f==-4512自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型,例如:short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。publicclassZiDongLeiZhuan{publicstaticvoidmain(String[]args){charc1='a';//定义一个char类型inti1=c1;//char自动类型转换为intSystem.out.println("char自动类型转换为int后的值等于"+i1);charc2='A';//定义一个char类型inti2=c2+1;//char类型和int类型计算System.out.println("char类型和int计算后的值等于"+i2);}}12345678910运行结果为:char自动类型转换为int后的值等于97char类型和int计算后的值等于6612**解析:**c1的值为字符a,查ASCII码表可知对应的int类型值为97,A对应值为65,所以i2=65+1=66。3-8强制类型转换\1.条件是转换的数据类型必须是兼容的。\2.格式:(type)valuetype是要强制类型转换后的数据类型实例:实例publicclassQiangZhiZhuanHuan{publicstaticvoidmain(String[]args){inti1=123;byteb=(byte)i1;//强制类型转换为byteSystem.out.println("int强制类型转换为byte后的值等于"+b);}}1234567运行结果:int强制类型转换为byte后的值等于12313-9隐含强制类型转换\1.整数的默认类型是int。\2.浮点型不存在这种情况,因为在定义float类型时必须在数字后面跟上F或者f。这一节讲解了Java的基本数据类型。下一节将探讨不同的变量类型以及它们的用法。4,Java变量类型在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:typeidentifier[=value][,identifier[=value]…];格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。以下列出了一些变量的声明实例。注意有些包含了初始化过程。inta,b,c;//声明三个int型整数:a、b、cintd=3,e=4,f=5;//声明三个整数并赋予初值bytez=22;//声明并初始化zStrings="runoob";//声明并初始化字符串sdoublepi=3.14159;//声明了双精度浮点型变量picharx='x';//声明变量x的值是字符'x'。123456Java语言支持的变量类型有:类变量:独立于方法之外的变量,用static修饰。实例变量:独立于方法之外的变量,不过没有static修饰。局部变量:类的方法中的变量。实例publicclassVariable{staticintallClicks=0;//类变量Stringstr="helloworld";//实例变量publicvoidmethod(){inti=0;//局部变量}}12345678910114-1Java局部变量局部变量声明在方法、构造方法或者语句块中;局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;访问修饰符不能用于局部变量;局部变量只在声明它的方法、构造方法或者语句块中可见;局部变量是在栈上分配的。局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。4-1-1实例1在以下实例中age是一个局部变量。定义在pupAge()方法中,它的作用域就限制在这个方法中。packagecom.runoob.test;publicclassTest{publicvoidpupAge(){intage=0;age=age+7;System.out.println("小狗的年龄是:"+age);}publicstaticvoidmain(String[]args){Testtest=newTest();test.pupAge();}}1234567891011121314以上实例编译运行结果如下:小狗的年龄是:714-1-2实例2在下面的例子中age变量没有初始化,所以在编译时会出错:packagecom.runoob.test;publicclassTest{publicvoidpupAge(){intage;age=age+7;System.out.println("小狗的年龄是:"+age);}publicstaticvoidmain(String[]args){Testtest=newTest();test.pupAge();}}1234567891011121314以上实例编译运行结果如下:Test.java:4:variablenumbermightnothavebeeninitializedage=age+7;^1error12344-2实例变量实例变量声明在一个类中,但在方法、构造方法和语句块之外;当一个对象被实例化之后,每个实例变量的值就跟着确定;实例变量在对象创建的时候创建,在对象被销毁的时候销毁;实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;实例变量可以声明在使用前或者使用后;访问修饰符可以修饰实例变量;实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。实例Employee.java文件代码:importjava.io.*;publicclassEmployee{//这个实例变量对子类可见publicStringname;//私有变量,仅在该类可见privatedoublesalary;//在构造器中对name赋值publicEmployee(StringempName){name=empName;}//设定salary的值publicvoidsetSalary(doubleempSal){salary=empSal;}//打印信息publicvoidprintEmp(){System.out.println("名字:"+name);System.out.println("薪水:"+salary);}publicstaticvoidmain(String[]args){EmployeeempOne=newEmployee("RUNOOB");empOne.setSalary(1000.0);empOne.printEmp();}}1234567891011121314151617181920212223242526以上实例编译运行结果如下javacEmployee.java$javaEmployee名字:RUNOOB薪水:1000.012344-3类变量(静态变量)类变量也称为静态变量,在类中以static关键字声明,但必须在方法之外。无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。静态变量在第一次被访问时创建,在程序结束时销毁。与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。静态变量可以通过:ClassName.VariableName的方式访问。类变量被声明为publicstaticfinal类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。实例:Employee.java文件代码:importjava.io.*;publicclassEmployee{//salary是静态的私有变量privatestaticdoublesalary;//DEPARTMENT是一个常量publicstaticfinalStringDEPARTMENT="开发人员";publicstaticvoidmain(String[]args){salary=10000;System.out.println(DEPARTMENT+"平均工资:"+salary);}}123456789101112以上实例编译运行结果如下:开发人员平均工资:10000.01**注意:**如果其他类想要访问该变量,可以这样访问:Employee.DEPARTMENT。本章节中我们学习了Java的变量类型,下一章节中我们将介绍Java修饰符的使用。5,Java修饰符Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:publicclassClassName{//...}privatebooleanmyFlag;staticfinaldoubleweeks=9.5;protectedstaticfinalintBOXWIDTH=42;publicstaticvoidmain(String[]arguments){//方法体}1234567895-1访问控制修饰符Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。default(即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。private:在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)public:对所有类可见。使用对象:类、接口、变量、方法protected:对同一包内的类和所有子类可见。使用对象:变量、方法。注意:不能修饰类(外部类)。我们可以通过以下表来说明访问权限:默认访问修饰符-不使用任何关键字使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为publicstaticfinal,而接口里的方法默认情况下访问权限为public。如下例所示,变量和方法的声明可以不使用任何修饰符。实例Stringversion="1.5.1";booleanprocessOrder(){returntrue;}12345-2私有访问修饰符-private私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问。Private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。下面的类使用了私有访问修饰符:publicclassLogger{privateStringformat;publicStringgetFormat(){returnthis.format;}publicvoidsetFormat(Stringformat){this.format=format;}}123456789实例中,Logger类中的format变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个public方法:getFormat()(返回format的值)和setFormat(String)(设置format的值)5-3公有访问修饰符-public被声明为public的类、方法、构造方法和接口能够被任何其他类访问。如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。以下函数使用了公有访问控制:publicstaticvoidmain(String[]arguments){//...}123Java程序的main()方法必须设置成公有的,否则,Java解释器将不能运行该类。5-4受保护的访问修饰符-protectedprotected需要从以下两个点来分析说明:子类与基类在同一包中:被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问;子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。protected可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。子类能访问protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。下面的父类使用了protected访问修饰符,子类重写了父类的openSpeaker()方法。classAudioPlayer{protectedbooleanopenSpeaker(Speakersp){//实现细节}}classStreamingAudioPlayerextendsAudioPlayer{protectedbooleanopenSpeaker(Speakersp){//实现细节}}1234567891011如果把openSpeaker()方法声明为private,那么除了AudioPlayer之外的类将不能访问该方法。如果把openSpeaker()声明为public,那么所有的类都能够访问该方法。如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。5-5访问控制和继承请注意以下方法继承的规则:父类中声明为public的方法在子类中也必须为public。父类中声明为protected的方法在子类中要么声明为protected,要么声明为public,不能声明为private。父类中声明为private的方法,不能够被继承。5-6非访问修饰符为了实现一些其他的功能,Java也提供了许多非访问修饰符。static修饰符,用来修饰类方法和类变量。final修饰符,用来修饰类、方法和变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。abstract修饰符,用来创建抽象类和抽象方法。synchronized和volatile修饰符,主要用于线程的编程。5-6-1static修饰符静态变量:static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为static变量。静态方法:static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。对类变量和方法的访问可以直接使用classname.variablename和classname.methodname的方式访问。如下例所示,static修饰符用来创建类方法和类变量。publicclassInstanceCounter{privatestaticintnumInstances=0;protectedstaticintgetCount(){returnnumInstances;}privatestaticvoidaddInstance(){numInstances++;}InstanceCounter(){InstanceCounter.addInstance();}publicstaticvoidmain(String[]arguments){System.out.println("Startingwith"+InstanceCounter.getCount()+"instances");for(inti=0;ib="+(a>b));System.out.println("a=a="+(b>=a));System.out.println("bb=falsea=a=trueb>2;/*15=1111*/System.out.println("a>>2="+c);c=a>>>2;/*15=00001111*/System.out.println("a>>>2="+c);}}123456789101112131415161718192021222324252627以上实例编译运行结果如下:a&b=12a|b=61a^b=49~a=-61a<< 2 = 240
a >>2=15a>>>2=1512345676-5逻辑运算符下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假下面的简单示例程序演示了逻辑运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:publicclassTest{publicstaticvoidmain(String[]args){booleana=true;booleanb=false;System.out.println("a&b="+(a&b));System.out.println("a||b="+(a||b));System.out.println("!(a&b)="+!(a&b));}}123456789以上实例编译运行结果如下:a&b=falsea||b=true!(a&b)=true1236-6短路逻辑运算符当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。publicclassLuoJi{publicstaticvoidmain(String[]args){inta=5;//定义一个变量;booleanb=(a>=2;System.out.println("c>>=2="+c);c>>=2;System.out.println("c>>=2="+c);c&=a;System.out.println("c&=a="+c);c^=a;System.out.println("c^=a="+c);c|=a;System.out.println("c|=a="+c);}}1234567891011121314151617181920212223242526272829303132333435以上实例编译运行结果如下:c=a+b=30c+=a=40c-=a=30c*=a=300c/=a=1c%=a=5c<<=>>=2=5c>>=2=1c&=a=0c^=a=10c|=a=101234567891011126-8条件运算符(?:)条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。variablex=(expression)?valueiftrue:valueiffalse1//Test.java文件代码:publicclassTest{publicstaticvoidmain(String[]args){inta,b;a=10;//如果a等于1成立,则设置b为20,否则为30b=(a==1)?20:30;System.out.println("Valueofbis:"+b);//如果a等于10成立,则设置b为20,否则为30b=(a==10)?20:30;System.out.println("Valueofbis:"+b);}}123456789101112131415以上实例编译运行结果如下:Valueofbis:30Valueofbis:20126-9instanceof运算符该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。instanceof运算符使用格式如下:(Objectreferencevariable)instanceof(class/interfacetype)1如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。下面是一个例子:Stringname="James";booleanresult=nameinstanceofString;//由于name是String类型,所以返回真12如果被比较的对象兼容于右侧类型,该运算符仍然返回true。看下面的例子:classVehicle{}publicclassCarextendsVehicle{publicstaticvoidmain(String[]args){Vehiclea=newCar();booleanresult=ainstanceofCar;System.out.println(result);}}123456789以上实例编译运行结果如下:true16-10Java运算符优先级当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。例如,(1+3)+(3+2)*2,这个表达式如果按加号最优先计算,答案就是18,如果按照乘号最优先,答案则是14。再如,x=7+3*2;这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3*2得到6,然后再加7。下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。7,Java循环结构7-1while循环while是最基本的循环,它的结构为:while(布尔表达式){//循环内容}123只要布尔表达式为true,循环就会一直执行下去。实例Test.java文件代码:publicclassTest{publicstaticvoidmain(Stringargs[]){intx=10;while(xmax)max=myList[i];}System.out.println("Maxis"+max);}}123456789101112131415161718192021222324以上实例编译运行结果如下:1.92.93.43.5Totalis11.7Maxis3.512345614-4For-Each循环JDK1.5引进了一种新的循环类型,被称为For-Each循环或者加强型循环,它能在不使用下标的情况下遍历数组。语法格式如下:for(typeelement:array){System.out.println(element);}1234实例该实例用来显示数组myList中的所有元素://TestArray.java文件代码:publicclassTestArray{publicstaticvoidmain(String[]args){double[]myList={1.9,2.9,3.4,3.5};//打印所有数组元素for(doubleelement:myList){System.out.println(element);}}}123456789101112以上实例编译运行结果如下:1.92.93.43.5123414-5数组作为函数的参数数组可以作为参数传递给方法。例如,下面的例子就是一个打印int数组中元素的方法:publicstaticvoidprintArray(int[]array){for(inti=0;inum2)result=num1;elseresult=num2;returnresult;}1234567891017-5方法调用Java支持两种调用方法的方式,根据方法是否返回值来选择。当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。当方法返回一个值的时候,方法调用通常被当做一个值。例如:intlarger=max(30,40);1如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:System.out.println("欢迎访问菜鸟教程!");1下面的例子演示了如何定义一个方法,以及如何调用它://TestMax.java文件代码:publicclassTestMax{/**主方法*/publicstaticvoidmain(String[]args){inti=5;intj=2;intk=max(i,j);System.out.println(i+"和"+j+"比较,最大值是:"+k);}/**返回两个整数变量较大的值*/publicstaticintmax(intnum1,intnum2){intresult;if(num1>num2)result=num1;elseresult=num2;returnresult;}}12345678910111213141516171819202122以上实例编译运行结果如下:5和2比较,最大值是:51这个程序包含main方法和max方法。main方法是被JVM调用的,除此之外,main方法和其它方法没什么区别。main方法的头部是不变的,如例子所示,带修饰符public和static,返回void类型值,方法名字是main,此外带个一个String[]类型参数。String[]表明参数是字符串数组。17-6void关键字本节说明如何声明和调用一个void方法。下面的例子声明了一个名为printGrade的方法,并且调用它来打印给定的分数。TestVoidMethod.java文件代码:publicclassTestVoidMethod{publicstaticvoidmain(String[]args){printGrade(78.5);}publicstaticvoidprintGrade(doublescore){if(score>=90.0){System.out.println('A');}elseif(score>=80.0){System.out.println('B');}elseif(score>=70.0){System.out.println('C');}elseif(score>=60.0){System.out.println('D');}else{System.out.println('F');}}}123456789101112131415161718192021222324以上实例编译运行结果如下:C1这里printGrade方法是一个void类型方法,它不返回值。一个void方法的调用一定是一个语句。所以,它被在main方法第三行以语句形式调用。就像任何以分号结束的语句一样。17-7通过值传递参数调用一个方法时候需要提供参数,你必须按照参数列表指定的顺序提供。例如,下面的方法连续n次打印一个消息://TestVoidMethod.java文件代码:publicstaticvoidnPrintln(Stringmessage,intn){for(inti=0;inum2)returnnum1;elsereturnnum2;}123456如果你调用max方法时传递的是int型参数,则int型参数的max方法就会被调用;如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。Java编译器根据方法签名判断哪个方法应该被调用。方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。17-9变量作用域变量的范围是程序中该变量可以被引用的部分。方法内定义的变量被称为局部变量。局部变量的作用范围从声明开始,直到包含它的块结束。局部变量必须声明才可以使用。方法的参数范围涵盖整个方法。参数实际上是一个局部变量。for循环的初始化部分声明的变量,其作用范围在整个循环。但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含如下所示的变量声明:你可以在一个方法里,不同的非嵌套块中多次声明一个具有相同的名称局部变量,但你不能在嵌套块内两次声明局部变量。17-10命令行参数的使用有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。命令行参数是在执行程序时候紧跟在程序名字后面的信息。下面的程序打印所有的命令行参数:CommandLine.java文件代码:publicclassCommandLine{publicstaticvoidmain(Stringargs[]){for(inti=0;i
|
|