java基础2.docx
- 文档编号:18385373
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:26
- 大小:138.39KB
java基础2.docx
《java基础2.docx》由会员分享,可在线阅读,更多相关《java基础2.docx(26页珍藏版)》请在冰点文库上搜索。
java基础2
Java基础二
1、方法:
[修饰符]返回值类型方法的名称([形参列表])[;][{……方法体}]
Test5.java
publicclassTest5{
publicstaticvoidmain(String[]args){
//求(1,1000)区间内的偶数和。
printSum(1,100);
printSum(1,10000);
printSum(25,500);
}
staticvoidprintSum(intstart,intend){
intsum=0;
for(inti=start;i if(i%2==0){ sum+=i; //sum=sum+i; } } System.out.println("sum("+start+","+end+")="+sum); } } 注意: 该方法是直接将求得的结果直接进行显示输出。 有时候是这样的,调用者,求的结果之后,对结果可能有不同的操作。 这时我们上面的程序就无法满足了。 上面的方法是不需要返回值的,但是方法定义时需要返回值的类型,我们返回什么呢? 返回void,void在java中就是上面都不返回,只是为了满足方法的定义。 Test5.java publicclassTest5{ publicstaticvoidmain(String[]args){ //求(1,1000)区间内的偶数和。 printSum(1,100); printSum(1,10000); printSum(25,500); intsum=getSum(300,500); System.out.println(sum); System.out.println((sum%3)==0); } staticintgetSum(intstart,intend){ intsum=0; for(inti=start;i if(i%2==0){ sum+=i; } } returnsum; } } 当方法返回值不是void时,就需要借助return关键字进行数据的返回。 2、方法的调用: 1)非静态方法: Test6.java publicclassTest6{ publicstaticvoidmain(String[]args){ show(12); } intshow(intvalue){ System.out.println("value="+value); } } 在静态的方法的上面文环境中无法掉用非静态方法。 怎么样才能调用呢个? -|将非静态方法改为静态方法。 -|通过对象来访问方法: Test6.java publicclassTest6{ publicstaticvoidmain(String[]args){ Test6t6=newTest6(); t6.show(12); } intshow(intvalue){ System.out.println("value="+value); returnvalue+10; } } 2)静态方法的调用: 1)如果两个静态方法在同一个类的内部,一个调用两一个,可以直接写方法的名字。 2)如果两个方法不在同一个类的内部,需要类名加“。 ”加方法名来访问。 publicclassTest6{ publicstaticvoidmain(String[]args){ Test6t6=newTest6(); t6.show(12); print(); Test6.print(); } intshow(intvalue){ System.out.println("value="+value); returnvalue+10; } staticvoidprint(){ System.out.print("哈哈,我是好人。 "); } } 3、属性的默认初始化: 数值型默认为0,boolean默认为false,字符型默认为“”,引用型默认为null。 Person.java publicclassPerson{ Stringname; Stringsex; intage; Stringaddress; publicstaticvoidmain(String[]args){ //newPerson("李向武").eat(newBaozi()); Personp; p=newPerson(); System.out.println(p.age);//o System.out.println(p.name);//null } } 4、封装: 1)将一段业务逻辑,即功能、算法;通过方法来实现,叫封装; 2)将具有相同功能和属性的一类事物通过class关键字定义到{}之间叫封装; 3)在描述一类事物时: 将其属性私有化(private修饰),通过相应的getter、setter方法对属性进行读写操作,就叫封装,这样做是安全的。 Person.java publicclassPerson{ privateStringname; privateStringsex; privateintage; privateStringaddress; //setter publicvoidsetName(Stringn){name=n;} publicvoidsetSex(Strings){sex=s;} publicvoidsetAge(inta){age=a;} publicvoidsetAddress(Stringar){address=ar;} //getter publicStringgetName(){retrunname;} publicStringgetSex(){returnsex;} publicintgetAge(){returnage;} publicStringgetAddress(){returnaddress;} } 5、类、对象、类和对象之间的关系 1)类: 就是一种抽象的概念,如何来抽象的? 具有相同功能和相同属性的一类事物。 类是对象的集合。 2)对象(就是具体事物): 对象的构建应该以类为模板来定义。 也就是实例化。 对象就是类的一个具体的体现。 3)类和对象的关系: 类是对象的抽象,是对象的集合;对象是类的一个具体体现,也就是一个具体实例,也就是类中的一个子集。 对象必须以类为模板来构建(实例化)。 6、无参的构造方法: 构造方法的方法名要类名完全一样,不需要返回值类型。 Person.java publicclassPerson{ privateStringname; privateStringsex; privateintage; privateStringaddress; //setter publicvoidsetName(Stringn){name=n;} publicvoidsetSex(Strings){sex=s;} publicvoidsetAge(inta){age=a;} publicvoidsetAddress(Stringar){address=ar;} //getter publicStringgetName(){returnname;} publicStringgetSex(){returnsex;} publicintgetAge(){returnage;} publicStringgetAddress(){returnaddress;} publicstaticvoidmain(String[]args){ //调用构造方法就是实例化对象, Personwhz=null; //whz=newPerson("王忠豪","男",23,"湖南邵阳"); whz=newPerson(); } } 编译: javacPerson.java会生成一个class: 在Person.class文件里。 因为Person.class是字节码文件,我们编程人员无法正常识别。 但是我们可以借助java的反编译工具: javap.exe来反编译Person.class中的Person类。 反编译Person类: javapPerson 通过反编译的结果和我们自己编写的源程序进行对比,得出java的虚拟机会自动给我们的类添加一个无参的构造方法(当我们没有写构造方法时)。 Person.java publicclassPerson{ privateStringname; privateStringsex; privateintage; privateStringaddress; //setter publicvoidsetName(Stringn){name=n;} publicvoidsetSex(Strings){sex=s;} publicvoidsetAge(inta){age=a;} publicvoidsetAddress(Stringar){address=ar;} //getter publicStringgetName(){returnname;} publicStringgetSex(){returnsex;} publicintgetAge(){returnage;} publicStringgetAddress(){returnaddress;} publicPerson(Stringn,Strings,inta,Stringar){ name=n; sex=s; age=a; address=ar; } publicvoideat(Baozibz){ System.out.println(name+"在吃"+bz+",他今年"+age+"岁! "); } publicstaticvoidmain(String[]args){ //调用构造方法就是实例化对象, Personwhz=null; whz=newPerson("王忠豪","男",23,"湖南邵阳"); //newPerson();//报错了。 } } 编译: javacPerson.java会生成一个Person类,保存在Person.class的文件中。 反编译Person类: javapPerson 通过反编译的结果和我们自己编写的源文件进行比较,得出: 当我们自己受到写了构造方法时,系统不再会给我们的类添加无参的构造方法了。 也就意味着,编译器在编译源文件时,是先检查该文件是否有构造方法,如果有,虚拟机就不会给添加构造方法,如果没有才添加构造方法,且这个添加的构造方法是没有参数,没有方法的具体实现的。 7、方法的重载,动态绑定。 Test.java classTest{ staticintaddIntWithInt(inta,intb){ intresult=0; result=a+b; returnresult; } staticfloataddIntWithFloat(inta,floatb){ floatresult=0.0f; result=a+b; returnresult; } staticdoubleaddDoubleWithDouble(doublea,doubleb){ doubleresult=0.0; result=a+b; returnresult; } publicstaticvoidmain(String[]args){ System.out.println(addIntWithInt(1,2)); System.out.println(addIntWithFloat(1,3.0f)); } } 通过上面的程序得出: 方法的可读性虽然很高,但只是针对我们编程人员来说罢了。 因为方法的名字里有很多专业术语,非专业人员无法正常使用以上方法。 所以不好,就像计算器一样,加运算永远只有一个“+”操作,没有多个,这个使用会很简便。 Test.java classTest{ staticintadd(inta,intb){ intresult=0; result=a+b; returnresult; } staticfloatadd(inta,floatb){ floatresult=0.0f; result=a+b; returnresult; } staticdoubleadd(doublea,doubleb){ doubleresult=0.0; result=a+b; returnresult; } publicstaticvoidmain(String[]args){ System.out.println(add(1,2)); System.out.println(add(1,3.0f)); System.out.println(add(1.1,3.0)); } } 通过上面的程序: 在一个类的内部可以有相同名字的方法存在。 Test.java classTest{ staticintadd(inta,intb){ intresult=0; result=a+b; returnresult; } staticfloatadd(inta,floatb){ floatresult=0.0f; result=a+b; returnresult; } staticfloatadd(floata,intb){ floatresult=0.0f; result=a+b; returnresult; } staticdoubleadd(doublea,doubleb){ doubleresult=0.0; result=a+b; returnresult; } staticvoidadd(doubleb,doublec){ doubleresult=0.0; result=c+b; //returnresult; } publicstaticvoidmain(String[]args){ System.out.println(add(1,2)); System.out.println(add(1,3.0f)); System.out.println(add(1.1,3.0)); } } 通过上面的程序说明: 在一个类的内部方法名可以相同,但是参数的个数、或者类型不能相同,如果个数相同,但是排列的顺序不能相同。 这样做是允许的,同名的方法此时不会冲突。 这种情况就叫方法的重载。 方法重载: 1)同名的方法要在同一个类的内部; 2)但是方法接收的参数的个数不等,或者类型不同,如果个数相同,但是要保证排列的顺序不同。 3)如果两个方法除返回值的类型不同之外,这两个方法就被认为是重复定义,说明方法的返回值类型的不同,不能作为方法重载的依据。 动态绑定: 如果方法重载了,方法的调用是由调用者所传递的参数来决定的。 给其什么样的参数,java虚拟机会自己选择所要调用的方法。 8、方法的调用本质 1、作用域: 就是变量或者方法的作用范围,或者叫可以使用的范围,还叫可视范围。 Test2.java classTest2{ voidprint(){ System.out.println("非静态的方法print被调用。 "); {} } publicstaticvoidmain(String[]args){ inti=9; System.out.println("main函数中定义的i="+i); {//在方法内部定义的“{}”叫也代码块,具体叫普通代码块。 inti=10; System.out.println("在普通代码块中定义的i="+i); } } } 说明: 在main函数中的定义的变量在整个main函数的方法体内都可使用,也就是说该变量的作用域是整个main函数的函数体。 即使main函数内有普通代码块。 这时我们不能在定义重复的变量了。 Test2.java classTest2{ publicstaticvoidmain(String[]args){ inti=9; System.out.println("main函数中定义的i="+i); {//在方法内部定义的“{}”叫也代码块,具体叫普通代码块。 intj=10; System.out.println("在普通代码块中定义的i="+j); } System.out.println("在普通代码块中定义的i="+j); } } 说明: 普通代码块中定义的变量的作用范围就在普通代码块的内部,出了普通代码块,该变量就无法识别了。 Test2.java classTest2{ inti=0; voidprint(){ System.out.println("非静态的方法print被调用。 "+i); } publicstaticvoidmain(String[]args){ newTest2().print(); } } 属性作用域: 是整个类的内部。 Test2.java classTest2{ inti=0; voidprint(){ System.out.println("非静态的方法print被调用。 "+i); inti=12; System.out.println("非静态的方法print被调用。 "+i); } publicstaticvoidmain(String[]args){ newTest2().print(); } } 说明: 属性的作用域是整个类体,也就是说,在类的方法中是可以看到属性的。 但是我们发现在局部作用域中定义与属性同名的变量没有发生冲突。 为什么呢? 因为局部变量在内存的栈中分配空间,而属性是描述具体对象的,每个对象都拥有一个类的属性的副本,而对象是内存的堆中分配的空间,在物理地址上二者不同的。 所以没有发生冲突,即没有被重复定义。 如果在局部作用域中定义了和属性相同的变量,此时我们知道在该作用域中可以同时看到成员变量和局部变量,但是使用时,用的是局部变量,这一原则叫“就近原则”; Test2.java classTest2{ inti=0; staticintj=0; voidprint(){ System.out.println("非静态的方法print被调用。 i="+i); inti=12; System.out.println("非静态的方法print被调用。 i="+i); System.out.println("非静态的方法print被调用。 j="+j); } publicstaticvoidmain(String[]args){ newTest2().print(); //System.out.println(i); System.out.println("j="+j); } } 说明: 在静态的上下文环境中无法访问非静态的(包括变量和方法),但是我们可以在非静态的上下文环境访问静态的(属性和方法)。 Test2.java classTest2{ inti=0;、 staticintj=0; publicTest2(){ i++; j++; System.out.println("i="+i); System.out.println("j="+j); System.out.println("********************"); } publicstaticvoidmain(String[]args){ newTest2(); newTest2(); newTest2(); newTest2(); } } 说明: 非static修饰的属性(成员变量),每个对象都独自拥有一份。 彼此之间互不干扰。 而static修饰的变量,所有的类成员公有一份。 每个对象如果对该变量进行修改,都会影响到其它对象。 即Static修饰的变量只定义一次,即只初始化一次。 Test2.java classTest2{ inti=0; staticintj=0; publicTest2(){ } publicstaticvoidmain(String[]args){ System.out.println(Test2.j); //System.out.println(Test2.i);//报错…… System.out.println(newTest2().i); } } 说明: 静态的属性和对象没有直接关系。 有没有对象,静态的属性都会被初始化。 而非静态的,和对象息息相关。 没有对象就没
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 基础