java基础一4new_第1页
java基础一4new_第2页
java基础一4new_第3页
java基础一4new_第4页
java基础一4new_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java基础一1、编译原理简单学习java编译期编译源文件生成字节码文件的过程,以及如何通过java解释器运行字节码文件。1.1、jdk的安装我们首先可以通过 FilesJava下安装jdk和jre运行时环境。如图:安装完后我们可以选择“开始”“运行”,输入cmd,点及回车键,弹出如下图:在弹出的控制台窗口中我们可以输入:java version回车,弹出如下窗口表示jdk安装成功。1.2、开发环境的配置我们程序员主要是编写java源程序,即扩展名是“.java”的文件称为源文件。然后通过jdk自带的编译期javac.exe对源程序进行编译,生成可执行的字节码文件,即扩展名为“.class”的

2、文件称为字节码文件,或称为可执行程序。编译期和解释器所在位置如图:此时我们再控制台输入的任意目录输入“java”,结果如下图:同样在控制台输入“javac”,结果如下图:结果表示没有找到我们的javac编译器,解决方法是:通过set path=“javac所在目录”命令设置path环境变量,即可正常执行javac.exe程序了,如图:当然这种对于环境变量的设置只对当前窗口生效,对其他窗口无效,要想长期有效,我们可以通过“我的电脑”“属性”“高级”标签下的“环境变量”按钮设置:环境变量设置分为用户级的和系统级的,我们可以在任意其一进行设置。以用户级为例:如果没有变量名为path的,我们可以点击新

3、建按钮,在弹出的对话框中的变量名中输入path,在变量值中输入javac.exe所在的目录即可。1.3、编译与运行我们的编译器只能编译文件扩展名为“.java”的文件,文件中可以没有任何内容,但是如果有内容必须符合java的语法规范,因为javac编译器在编译之前要先进行语法等信息的检查。以windows平台为例,在编译时文件名不区分大小写。有文件如下:两种类型的文件名都可以编译通过,但是用中文作为源文件的文件名不推荐。注意在windows平台上,文件名是不区分大小写的。即TEST.java和Test.java和TeST.java是同名文件,不允许在同一目录下同时存在。Java的解释器java

4、.exe执行的是类,即类的内容,而非类所在的文件的文件名,所以java后跟的是类名,而非类所在的文件的文件名。如下:class Testpublic static void main(String args)System.out.println("Hello world.");Javac Test.java 生成Test.class文件,要想执行当前程序,可以这样做:java Test 此时的Test是类名,而非文件名,如果我们这样做:java test 则报错:潜在说明类名是区分大小写的。1.4、Hello world我们要想编写第一个Helloworld程序,首先要将系

5、统内部默认的入口函数main方法显示声明,可以通过打印语句System.out.print(“Hello world.”);进行打印。class Testpublic static void main(String args)System.out.println("Hello world.");每个类都有一个入口函数:public static void main(String args) ,必须是public的,且要被static修饰。也就意味着我们要做的任何事情,都要在main方法中进行编写。当运行一个类时,系统会自动调用main方法,如果没有声明main方法,会报一个

6、错误:“Exception in thread "main" java.lang.NoSuchMethodError: main”2、数据类型我们编写的程序永远是以处理数据为核心,比如对数据的增删改查。任何一个数据我们都应该知道它的类型,才可以更好的应用。比如在我没有具体说明的情况下,请问:1是什么类型?有人可能要说是一个整数。但是我也可以说它就是一个编号,是一个文本型的。因为1是一个常量。是一个具体值,只不过此时我们还没有定义这个值的具体类型罢了。由此可见数据类型的重要性。Java中对于数据分为两种类型,一种是基本数据类型,一种是引用型数据类型。当我们需要的类型在jdk中

7、不存在时,我们也可以通过class关键字定义。2.1、基本数据类型基本数据类型又叫原生数据类型,这种类型的数据是和变量名一并保存在相同的内存中的,变量的本身就是数据。有别于后面的引用型。基本数据类型又分为如下几种:1) 数值型:数值型包含整型(byte、short、int、long)和浮点型(float、double)2) 字符型:char类型3) 逻辑性:又叫布尔型(boolean),可取值只有true和false。以上就是我们常说的“四类八种“。2.2、引用型引用型的变量主要是通过类名称定义的变量,或者是数组类型定义的变量。因为变量名和变量值不是“捆绑“在一起的,变量名只保存了值的”地址“

8、,而非值本身,我们可以理解变量就是操纵值的遥控器,所以我们叫这种类型为引用型。我们会在后面详细介绍。2.3、变量声明所谓变量的声明就是在代码块中定义变量,同时我们可以为其赋一个初始值,这个动作又叫变量的初始化。变量在使用之前必须保证初始化。class Testint i;/变量声明public static void main(String args)int t = 6;/变量声明并初始化Test2 t2;/变量声明t2 = new Test2();/变量初始化class Test22.4、数据类型与运算数值型数据常见的操作无外乎加减乘除(+、-、*、/、%)。而java又将数值型分为:编号类

9、型字节数1byte12short23int44long85float46double87char28booleantrue或者false基本数据类型中1到6为数值型,是可以参与运算的,其中字符型的char也可以参与数学运算,唯独boolean类型无法参与数学运算。2.4.1、变量与常量、运算符使用常量是不可改变的量,而变量是可以改变的量。变量主要是用来存储常量,可以实现常量的反复使用。Java中任意一个常量的默认类型是int类型。任意一个浮点型的常量默认为double类型。public static void main(String args) byte b = 12;/可以通过。byte b

10、2 = 128;/编译不能通过,超出了byte的取值范围。byte b3 = b + 12;/编译也无法通过。b+=12;/可以通过。byte b4 = 127;b4+=1;/可以通过。 System.out.println(b4);/输出结果是-128.以上程序告诉我们:当一个int类型的常量没有超出byte的取值范围时,系统会对该值进行强制类型转换,且不会造成精度丢失。而当一个超出了byte取值范围的int类型值(128)赋给byte类型变量时,系统检测到该值超出了byte的取值范围,不会对该值进行自动强制类型转换。所以在编译时会报精度丢失错误。要想编译通过,我们可以手动强制类型转换。而当

11、两个不同类型的数值进行运算时,系统会先找到类型更宽的类型,将窄类型先自动强制转换为宽类型。然后执行运算。运算结果是宽类型的。表达式b+12的结果是一个int类型,b3是byte类型,赋值语句两边的类型不匹配,虽然表达式的结果没有超出byte的取值范围,但是系统不会自动对表达式的结果进行类型转换。要想通过编译,我们必须手动强制类型转换。“+=”的意思是先执行加运算,再执行赋值语句。但是系统会自动对运算结果进行强制类型转换(当运算结果的类型宽于被赋值的变量的类型时)。所以在使用“+=”符号时要注意,一定要保证其左边的类型的宽度大于等于右边的结果的类型。“+”运算符在java中被重载了。其有两个功能

12、,当“+”符号左右只要有一个类型是非数值型的数据,那么该符号就被充当字符串连接符使用。如果左右都是数值型,那么该符号就充当数学运算符使用。public static void main(String args) System.out.println(12+23+"10");/结果是:3510System.out.println("10"+12+23);/结果是:101223Java中通过String定义字符串类型,String str = “I am teacher.”;任何类型和String类型执行“+”运算,其结果都是字符串类型。“+”和“-”运算符

13、的使用,在变量之前,表示先执行加(减)一之后,再使用变量。在变量之后,则表示先使用变量,再改变变量的值。public static void main(String args) int i = 5;System.out.println(i+);/5System.out.println(i);/6int j = 5;System.out.println(+j);/6System.out.println(j);/62.4.2、char类型Java采用的是unicode编码。所以一个字符型的变量是可以存储一个汉字的。其实字符型的底层是采用assics码存储的。char类型的变量即可被一个字符常量赋值

14、,也可以被一个整型常量赋值。并可以参与数学运算。public static void main(String args) char c = 'a' , c2 = 65;System.out.println(c);/aSystem.out.println(int)c);/97System.out.println(c2);/ASystem.out.println(int)c2);/65System.out.println(c+c2);/1622.4.3、数据类型之间的转换原则在整型中的转换顺序是:byte、short、charintlongfloatdoubleString。也就是

15、说byte、short、char在混合运算时,彼此之间不会相互转换,它们统一转换为int类型再运算。float和long类型运算的结果是float类型。public static void main(String args) byte b = 12;short s = 12;/s = s + b;报错。int i = s + b;char c = 12;/c = s + c;报错。i = s + c;long lg = 12;float f = 23.45f;f = f + lg;3、代码块在java中代码块分为普通代码块,静态代码块,构造代码块。首先代码块是在类体中定义的“”。我们编写的代码

16、必须要在代码块中或方法体中。不能直接写在类体内。3.1、普通代码块普通代码块是在方法中声明的“”;在“”前也可以添加if、for、while、switch等关键字,就构成了特定意义的普通代码块。public static void main(String args) System.out.println("这是普通代码块中的语句。");1) 在普通代码块前加if关键字,就是条件语句,if可以和else if 或者else配合使用,也可以单独使用,但是else和else if不能单独使用;2) 在普通代码块“”前添加“for(;)”就成了特殊的循环语句;3) 在普通代码块前还

17、可添加“while()”或者“do”、“switch(int类型)”等。public static void main(String args) int a = 10;if(a%2=0)System.out.println(a+"是偶数。");elseSystem.out.println(a+"是奇数。");If其后“()”中的表达式的结果必须是boolean类型的。public static void main(String args) System.out.println("打印1到10闭区间内所有的偶数。");for(int i

18、=1;i<=10;i+)if(i%2=0)System.out.println("偶数:"+i);elsecontinue;/表示直接进入下次循环,当然此处可以不写。for之后的“()”中有三个表达式,分别用两个“;”隔开。第一个表达式也可以写在for循环语句之前;第二个表达式的结果必须是一个boolean类型的。第三个表达式改变第二个表达式取值的一个量。也可以写在循环体的内部。如果“()”内是三条空语句,则该循环是一个死循环。public static void main(String args) System.out.println("打印1到10闭区间

19、内所有的偶数。");int i = 10;while(i>0)if(i%2=0)System.out.println("偶数:"+i);i-;while之后的“()”中的表达式的结果必须是boolean类型的。public static void main(String args) int i = 2;switch(i)case 1:System.out.println("case 1.");case 2:System.out.println("case 2.");case 3:System.out.println(&

20、quot;case 3.");case 4:System.out.println("case 4.");break;case 5:System.out.println("case 5.");default:System.out.println("default.");Switch之后的“()”中的表达式的结果必须是int类型的。要想防止case语句穿透,必须使用break关键字结束。3.2、静态代码块静态代码块是在“”前添加static修饰,且静态代码块是在方法之外,类体之内声明的。静态代码块会在类加载时由系统默认执行,且在

21、main方法之前执行。静态代码块主要作用是对类变量进行初始化。后面会详细讲解。public class Test2 staticSystem.out.println("静态代码块。");public static void main(String args) System.out.println("入口方法main。");非main方法的Hello world如何编写?如下:public class Test2 staticSystem.out.println("静态代码块。");System.exit(1);/表示系统正常退出,不会

22、再向下查询main方法。java.lang.System类的静态方法exit(int)表示终止JVM的运行。直接结束程序的意思。3.3、构造代码块构造代码块也是在类体的内部,方法的外部声明的,不加任何修饰的“”。构造代码块会在实例化类对象时,系统自动执行的代码块。构造代码块的主要作用是对成员变量进行初始化。会在后面进行详细讲解。public class Test2 System.out.println("构造代码块。");public static void main(String args) /构造一个Test2类型的对象。程序运行时会在main方法前自动执行构造代码块。

23、new Test2();3.4、代码块与作用域作用域就是变量的可视范围。代码块“”就是作用域,比如类体、方法体、普通代码块、静态代码块、构造代码块都称之为作用域。除类体之外的作用域都称之为局部作用域。3.4.1、局部作用域中的变量与内存局部作用域中的变量的作用范围是从变量的定义处起,到该变量所在的第一层“”的结束。局部变量是在内存的栈区开辟空间的。public static void main(String args) /局部作用域:方法体。int i = 3;/局部作用域:普通代码块。System.out.println("i="+i);int j = 4;System.

24、out.println("j="+j); /int i = 4;报错,已在方法体局部作用域中定义了同名变量。System.out.println("i="+i);/System.out.println("j="+j);此处已经脱离了j的作用范围。4、方法方法描述的是一段算法,是一个动作,是一种功能。一个功能也可以理解为是一个事务,一个完整的事务可能由一到多个子事务(功能)一起完成的。作业:对一下语句进行方法描述。1、 我去吃饭了。2、 我骑着自行车去上班。3、 我骑着自行车去上班了。4、 我一边吃饭,一边打游戏。5、 我吃完饭要去看电

25、影。6、 我每天晚上都会去操场跑步一圈,如果我每天晚上吃几斤包子,我就多跑几圈。比如吃3斤包子,就多跑三圈。4.1、一般方法一般方法的定义:修饰符1 修饰符2 返回值类型 方法名(形参列表)算法。这就是一个完整的方法定义,“”中是可选的。根据具体需要选择。方法前如果有static修饰符修饰,该方法表示是一个静态方法,也叫类方法。没有static修饰的叫成员方法。类方法可以直接通过类名加引导符调用。成员方法要通过对象(或对象引用)加引导符调用。在一类的内部,非静态方法和非静态方法之间可以相互直接调用,非静态方法也可以直接调用静态的类方法。而类方法不能调用非静态方法,静态方法之间可以相互直接调用。

26、public class Test2 public void m1()System.out.println("m1()");void m2()m1();/非静态方法之间可以相互直接调用。public static int m3(int a, int b)return a+b;/return表示方法的结束,跳到方法的调用处。static void m4()/m1();报错,静态方法中不能调用非静态方法。System.out.println(m3(2,3);/静态方法之间可以相互调用。public void m5()m4();/非静态方法可以直接调用静态方法。4.2、构造方法构

27、造方法的主要作用是初始化成员变量,创建对象。每个类都至少要有一个构造方法,没有构造方法的类是不存在的。构造方法没有返回值类型,且构造方法的方法名与类名完全一致。如果一个类没有显示的声明构造方法,JVM在编译时也会为该类添加一个无参的、不加任何实现的构造方法,该构造方法又被称为缺省的构造方法。public class Test2 public Test2()System.out.println("构造方法。");public class Test2 /该类在编译时系统会添加缺省的构造方法。4.3、方法的重载在一个类的内部,多个方法的方法名相同,但是参数的个数不同,或者是参数的

28、类型不同,或者是相同参数个数的类型排列顺序不同,就叫方法的重载。返回值类型的不同不能作为评判方法是否重载的依据。比如计算器上的“+”就是一个重载功能。方法重载的目的是为了简化API的使用。同名的方法具备不同的功能。这样在调用时会变得更加简单。方法的重载也是一种多态的表现形式。在一个类的内部之所以可以有多个同名方法存在,是因为java采用的是“动态绑定原则”。运行时会根据参数选择对应的方法。public class Test2 public void get()/public int get()return 21;这个不是重载方法。public void get(int a)public voi

29、d get(int a,String b)public void get(String a, int b)4.4、对字节码文件进行反编译我们在编写源文件的时候,有可能没有显示的编写构造方法。但是我们定义一个类,难道真的可以没有构造方法吗?不是的,在java中,没有构造方法的类可以理解为是不存在的。虽然我们可以不显示的编写构造方法,但是JVM在编译时,会先执行检查,当检查到我们没有定义构造方法时,系统会为我们的类添加一个缺省构造方法。可以通过如下方法进行验证:Test.java的源文件package java.basic1;public class Test public int a;void

30、run()System.out.println("run();");先编译源文件,生成字节码文件如下:这个文件的内容我们是无法看懂的,那么要如何验证呢?可以通过反编译命令:javap.exe我们可以通过反编译的结果和源文件对比,字节码文件中是有了构造方法的。4.5、如何合理定义方法方法是一段算法的集合,而一段算法有可能又可以细分为多个子算法。我们可以将一段完整的算法理解为是一个完整的事务,而在这个事务中又集合了多个子事务。因此我们有必要将这些个子事务也定义成方法。然后将这些个子方法按照业务逻辑组成一个完整的事务。这样做的好处是:1) 子方法可以重复使用,达到了代码复用的目的

31、;2) 代码利于维护,当一个完整的事务的某一块逻辑需要改变时,我们可以定位到具体子方法,对具体子方法进行修改即可因此,定义一个合理的方法应做到如下几点:1) 一事一方法,方法的具体代码片段不耦合;2) 确定方法所属的类,合理的方法出现在适当的类中。举例:“我每天骑自行车去上班。”如何编写方法?class Bike/自行车类型。public void move()/自行车移动功能。System.out.println("自行车 开始启动了");class Person/人类。String name;Person(String name) = name;pub

32、lic void ride(Bike bike)/骑自行车bike.move();public void goToWork(Bike bike)/骑自行车上班ride(bike);public static void main(String args) Person myself = new Person("我");/实例一个Person类型对象。myself.goToWork(new Bike();4.6、标识符与命名规范在java中,凡是我们可以自行定义的地方都可以称之为标识符,比如:变量名、方法名、类名、包名等等。Java中标识符由一下字符组成:字母、数字、下划线“_

33、”、美元符号“$”。定义一个标识符需要满足如下几点:1) 不能以数字开头2) 不能和java中的关键字冲突3) Java中的标识符对字母的大小写是敏感的,且不能出现非法字符命名规范之驼峰命名规范:我们在定义一个标识符时,尽量要做到见名知意,要做到见名知意,即要求标识符的可读性高,那么一个标识符可能要出现多个单词。驼峰命名要求:a) 标识符作为类名,要求每个单词的首字母要大写b) 标识符作为方法名和普通变量名,要求第一个单词的首字母小写,之后每个单词的首字母大写c) 标识符作为包名,要求一层包使用一个单词d) 标识符作为常量名,要求每个单词的每个字母都大写,单词间使用“_”线连接5、封装:类与对

34、象类是一种抽象的概念,对象是客观存在的实体。类可以对对象进行定义;对象则是类的体现。俗语说:“物以类聚人以群分”;关键我们如何分类,如何准确分类。封装,可以理解为是对一段算法的封装。也可以是对具有相同属性和相同功能的一类事物的抽象。Java中对封装有更特点的意思,主要是针对simpleBean(简单的实体类)。即成员变量私有化(private修饰),然后通过getXXX和setXXX方法进行读写操作。class Personprivate String name;private int age;private String address;public String getName() ret

35、urn name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public String getAddress() return address;public void setAddress(String address) this.address = address;5.1、类的概念在java中我们这样对类进行定义:具有相同属性和相同功能的一类事物的集合。比如我们身边有如下对象:猴子、电脑、

36、空调、人、桌子;我们如何对其进行分类?如何我们从可视性上分,他们都是同一类事物固体;如果我们从生物和非生物角度分,又可以分为两种生物和非生物;由此可见类型是无形的。关键看我们如何对象属性进行区分。不同的属性集合,得到不同的类。类是对对象的定义。描述一组对象是同类事物的过程就叫“抽象”。5.2、对象对象就是以类为模板,将类中的各个属性赋值之后就产生了对象。我们可以这样理解对象,对象就是具有属性值的类。5.3、类和对象之间的关系类是通过一组对象按相同属性和相同功能抽取出来的结果。对象则是类的一个具体体现。在java程序语言中,我们这样说:类是对象的模板(或者说类是对象的集合),对象是类的实例。每一

37、个对象都是同一种类型的,因为它们有相同的属性,属性都是和类模板一致的。而每个对象又不同,因为每个对象的属性值不同。class Person/对人类的抽象String name;/姓名int age;/年龄char sex;/性别Person(String n, int a, char s)/构造方法保障对象的实例化name = n;age = a;sex = s;public static void main(String args) Person p1 = null;/定义Person类型的引用(变量)p1 = new Person("张三",45,'男'

38、);/通过构造方法实例化对象System.out.println("p1="+p1);/打印该引用对应的堆区中对象的地址System.out.println("="+);/该引用所指对象的name属性5.4、类中属性的默认初始化规则我们知道在局部作用域中定义的变量在使用之前必须对其进行手动初始化。如果在使用之前得不到初始化,要报初始化错误。而我们在方法之外,类的内部定义的变量,即使在使用之前我们没有手动初始化,依然可以正常使用。为什么呢?难道是属性不需要初始化吗?显然是不可能的。其实是JVM对其进行了初始化。初始化原则如下:p

39、ublic class Test static byte b;/0static short s;/0static int i;/0static long lg;/0static float f;/0.0static double d;/0.0static char c;/一个空格static boolean flag;/falsestatic String str;/nullpublic static void main(String args) System.out.println("b="+b);System.out.println("s="+s);

40、System.out.println("i="+i);System.out.println("lg="+lg);System.out.println("f="+f);System.out.println("d="+d);System.out.println("c="+c+"");System.out.println("flag="+flag);System.out.println("str="+str);注意:所有的引用型数据一律默认初

41、始化为null值。null的意思是表示该引用的值还不确定。引用型的变量当值不确定时,为了避免在使用变量时发生未被初始化异常,可以统统赋值为null。5.5、类的加载一个类在使用之前必须要先加载到内存。一个类会被加载的几种方式:1) 直接通过java.exe命令执行该类,在执行之前会先加载该类2) 一个类在另一个类中被间接使用,比如在A类型中使用B类的方法,当我们执行A类时,执行到B类相关方法时,也会先加载B类3) 通过Class.forName(“类的全路径名”)可以加载一个类注意:在一个程序的生命周期中,一个类只被加载一次。加载一个类就是按照程序由上向下的顺序执行静态代码块。5.6、程序生命

42、周期与内存类的加载永远排在第一位,当类加载完毕,就可以使用该类了,比如调用给类的静态方法。当然了main方法是程序的入口。我们可以在main方法中调用方法,包括定义局部变量,实例化对象等。看如下代码:public class Person String name;int age;public Person()age = 1;System.out.println("缺省的构造方法。");public Person(String n, int a)name = n;age = a;System.out.println("有参的构造方法被执行了。");Syst

43、em.out.println("一个对象要产生了。");staticSystem.out.println(Person.class.getName()+"类被加载了。");System.out.println("构造代码块在构造方法前执行。");public static void main(String args) Person p1 = null;p1 = new Person();System.out.println("p1="+p1);System.out.println("-");p1

44、 = new Person("Jim", 22);System.out.println("p1="+p1);staticSystem.out.println("静态代码块执行了。");输出结果:Person类被加载了。静态代码块执行了。一个对象要产生了。构造代码块在构造方法前执行。缺省的构造方法。p1=Personde6ced-一个对象要产生了。构造代码块在构造方法前执行。有参的构造方法被执行了。p1=Personc17164注意:由输出结果可知,一个类只有在第一次加载的时候才会执行静态代码块,且静态代码块只执行一次。构造代码块在调用

45、构造方法之前执行,且每调用一次构造方法,构造代码块都会执行一次。构造方法在构造代码块之后执行。引用型变量存储的是对象的地址,而非对象本身。在结束main方法之前,p1引用曾两次指向不同的对象。整个程序在内存中是什么样的呢?画图说明。模拟内存中对各个变量及对象是如何分配空间的。5.7、代码块与关键字此处要讲的关键字都是可以作为一条语句来使用的。我们主要研究如下几个关键字的特性。Java中的关键字都是小写的。1) return:跳出方法,跳到方法调用处,程序依然可以向下运行;2) break:防止case语句穿透,跳出当前循环;3) continue:只能在循环中使用,表示直接进入下一次循环,循环

46、中的continue之后的语句不再执行;4) 要想结束程序的运行,可以使用Systeme.exit(int)方法。public class Test public int get(int a, int b)return a + b;/带值跳出方法到方法调用处。public void set(int a)int b = a;b+=b;return;/直接跳出方法,至方法调用处。/a = b;/return之后不能再有语句。public class Test public static void main(String args) for(int a = 1; a < 10; a+)if(a

47、=4)break;/跳出当前循环。System.out.println("a="+a);System.out.println("for循环结束,程序继续运行。");public class Test2 public static void main(String args) for(int a = 1; a < 10; a+)if(a=4)continue;/直接进入下次循环。System.out.println("a="+a);System.out.println("for循环结束,程序继续运行。");5.

48、8、对象与引用(this)我们java程序员,一般只操作内存的栈区,而不操作内存的堆区。局部变量在栈区分配空间,而java中引用型数据(即对象)是在内存的堆区分配空间的。因此我们需要在栈区定义一个变量来保存堆区对象的地址。通过该局部变量来反复操作堆区中的对象。因此java中的非基本数据类型的变量又叫引用。当然我们也可以在栈区中直接操作对象,即该对象创建之后,要一直“抓住”不放,否则再也无法使用该对象。这样的对象又叫“匿名对象”。public class Test public static void main(String args) new Person("whz").r

49、un();/匿名对象调用run方法。Person p = new Person("wanghz");/p是指向堆中对象的引用。System.out.println(p);/引用中保存的是堆中对象的地址。System.out.println();p.run();/通过引用p访问堆中的对象。class PersonString name;Person(String n)name = n;public void run()System.out.println("run();");以上代码在内存中的状态:非静态方法在内存中是这样存储的,类的完整路径名

50、加引导符加方法名,并且在方法的形参列表处,永远是在第一个位置定义一个接受自身类型的变量。从而将调用该方法的引用传递给该方法的临时变量,以区分不同对象。class Personpublic void run()System.out.println("run();");public static void main(String args) Person p = new Person();p.run();/Person.run(p);5.8.1、当前类的默认引用thisthis就是一个指向当前类的某个对象的引用。this只能在方法内部使用。它的类型就是所在类的类型。如果this

51、调用构造方法,构造方法的调用必须是构造方法中的第一条语句,只能在构造方法中通过this()调用构造方法。Package com.test;class PersonString name;Person(String n)name = n;public void print()System.out.println("this="+this);System.out.println("="+);public static void main(String args) Person p = new Person("wh

52、z");System.out.println("p="+p);System.out.println("="+);p.print();/方法的本质是:Person.print(p);=>this = p;看结果:p=com.test.P=whzthis=com.test.P=whz可以看出引用p和默认引用this是指向的同一个对象。借助this实现方法的链式调用:要想让某方法可以被链式调用,要保证该方法返回一个自身所在类的类型。class Pe

53、rsonpublic Person print()/该方法可以实现链式调用。System.out.println("this="+this);return this;public static void main(String args) new Person().print().print().print();借用this区分成员变量和局部变量:class PersonString name;Person(String name)name = name;public static void main(String args) System.out.println(new

54、Person("whz").name);/输出结果是:null以上程序输出的name是null,说明属性name的值没有被改变。原因是变量的就近原则,构造方法中的”name = name;”的意思是局部变量赋给了局部变量,而没有改变属性name的值。可以做如下修改,解决该问题。class PersonString name;Person(String name) = name;public static void main(String args) System.out.println(new Person("whz").name);因为this是当前类的一个引用,这个引用this指向的就是main方法中的匿名对象;从而就是指堆中匿名对象的name属性。从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论