java技术从入门到精通孙鑫学习笔记Lesson2面向对象上_第1页
java技术从入门到精通孙鑫学习笔记Lesson2面向对象上_第2页
java技术从入门到精通孙鑫学习笔记Lesson2面向对象上_第3页
java技术从入门到精通孙鑫学习笔记Lesson2面向对象上_第4页
java技术从入门到精通孙鑫学习笔记Lesson2面向对象上_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象编程概述l 简单的说,面向面向对象编程(object oriented programming,简称oop)描述的是对象之间的相互作用。l 面向对象编程与面向过程编程的区别: 过程化程序设计先确定算法,再确定数据结构;面向对象编程先确定数据结构,再确定运算。 面向过程编程的程序员,习惯于建立数据结构存放数据并定义方法(函数)来操作数据;面向对象编程的程序员则构造一个对象模型,将数据与方法组织在一起。对象 对象的状态 对象的行为l 我们把现实世界的事物抽象成对象。l 对象一般都有两个特征:状态(state)和行为(behavior).l 软件的对象概念是由现实世界对象抽象而来。把现实世界

2、的状态保存在软件对象的变量中;现实世界对象的行为通过软件对象的方法(函数)来实现。类和对象l 把相似的对象划归成一个类。在软件中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法)。l 类是创建对象的模板,对象是类的实例。 面向对象程序设计l 从程序设计的角度看,类是面向对象程序中最基本的程序单元。类实质上定义的是一种数据类型,这种数据类型就是对象类型。所以我们可以使用类名称来声明对象变量。l 声明对象变量之后,还不能使用对象。必须用运算符new创建对象实体之后,才能使用对象。class point /运行结果为 :10 10int x,y;void outpu

3、t()system.out.println(x);system.out.println(y);public static void main(string args)point pt;pt=new point();pt.x=10;pt.y=10;pt.output();class point /运行结果为:5 5int x,y;point() /构造函数没有返回类型修饰符,但可以用public等修饰x=5;y=5;void output()system.out.println(x);system.out.println(y);public static void main(string arg

4、s)point pt;pt=new point(); /首先调用构造函数初始化实例./pt.x=10;/pt.y=10;pt.output();class point/ 运行结果为: 3 3int x,y;point(int a,int b) /构造函数没有返回值x=a;y=b;void output()system.out.println(x);system.out.println(y);public static void main(string args)point pt;pt=new point(3,3); /首先调用构造函数初始化实例./pt.x=10;/pt.y=10;pt.out

5、put();类的构造方法l 构造方法的名字和类名相同,并且没有返回值。l 构造方法主要用于为类的对象定义初始化状态。l 我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。l java的类都要求有构造方法,如果没有定义构造方法,java编程器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。-class pointint x,y;void output()system.out.println(x);system.out.println(y);public static void main(string args)point pt;pt=new point();

6、pt.output();通过以下步骤查看缺省构造方法:第一步: 编译 javac point.java第二步: 反编译 javap point /*这里的point是类,而非后缀名为class的字节码文件。这里的javap是sun公司提供的反编译工具javap.exe通过它可以打印出这个类所定的成员变量和成员方法。*/运行结果为: compiled from”point.java” class point extends java.lang.object int x; int y; point(); void output(); public static void main(java.lan

7、g.string); 注意出现的extends关键字这是因为object类为所有类的基类 由此可知,在没有定义构造函数时,java编译器为我们提供了这样的一个不带参数的构造函数。但是,一旦定义了构造函数,不论是否带参数,那么java编译器都不会提供构造函数。 new 关键字的作用l 为对象分配内存。l 引起对象构造方法的调用。l 为对象返回一个引用。缺省构造方法l 当我们用缺省的构造方法初始化对象时,系统用默认值初始化对象的成员变量。l 各种数据类型的默认值为:数值型 0 char 0boolean false 对象 null方法的重载(overload)重载构成的条件:方法的名称相同,但参数

8、类型或参数个数不同,才能构成方法的重载。class point/ 运行结果为: 3 3而不是我们想要的:5 5int x,y;point(int a,int b)x=a;y=b;point()void output()system.out.println(x);system.out.println(y);void output(int x,int y) /方法中的参数名与类成员变量名相同,则成员变量被覆盖x=x; /两个x都是参数中的x ,对类成员变量x 无影响y=y; /两个y都是参数中的y,对类成员变量 y 无影响public static void main(string args)po

9、int pt;pt=new point(3,3); pt.output(5,5);pt.output();class pointint x,y;point(int a,int b)x=a;y=b;point()void output()system.out.println(x);system.out.println(y);void output(int x,int y)x=x;y=y;system.out.println(x);system.out.println(y);public static void main(string args)point pt;pt=new point(3,3)

10、; pt.output(5,5);pt.output(); 运行结果为: 5 53 3class pointint x,y;point(int a,int b)x=a;y=b;point()void output()system.out.println(x);system.out.println(y);void output(int x,int y)this.x=x;system.out.println(x);system.out.println(y);system.out.println(this.x); /这里的x 代表类的成员变量的x system.out.println(this.y)

11、; /这里的y代表类的成员变量的ypublic static void main(string args)point pt;pt=new point(3,3); pt.output(5,5);pt.output();运行结果为: 5 5 5 3 5 3特殊变量this:this变量代表对象本身,当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用 this区分成员变量和局部变量。使用this简化构造函数的调用。class point / 使用this简化构造函数的调用int x,y;point(int a,int b)x=a;y=b;

12、point()this(1,1); /调用带参数的point(int a,int )方法void output()system.out.println(x);system.out.println(y);void output(int x,int y)this.x=x;this.y=y;public static void main(string args)point pt;pt=new point(); pt.output();运行结果为: 1 1特殊变量this:l 关于实例方法和实例数据成员的进一步说明一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对象,

13、而数据成员(即成员变量)在类的每个对象所在内存中都存在着一份拷贝。this变量允许相同的实例方法为不同的对象工作。每当调用一个实例方法时,this变量将被设置成引用该实例方法的特定的类对象。方法的代码接着会与this所代表的对象的特定数据建立关联。class pointint x,y;point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法void output()system.out.println(x);system.out.println(y);void output(int x,int y)this.x

14、=x;this.y=y;public static void main(string args)point pt;pt=new point(); /pt.output(); point pt2=new point(); pt.x=5;pt2.x=10; system.out.println(pt.x); system.out.println(pt2.x);/* 运行结果为:5 10 这说明成员变量x在这两个对象的内存中各有一份拷贝, 若只有一份拷贝则结果应为:10 10*/关键字staticl 静态方法和静态变量是属于某一个类,而不属于类的对象。l 静态方法和静态变量的引用直接通过类名引用。l

15、 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。l 可以用类的对象obj去调用静态的方法method(),如:obj.method()。-对于一个静态方法,当我们去调用 一个静态方法的时候,我们不需要产生类的对象,我们可以直接用“类名。方法”来调用静态的方法,如:point.output() 。 class pointint x,y;point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法static void output()system.out.println("outpu

16、t() called");/system.out.println(x);/system.out.println(y);void output(int x,int y)this.x=x;this.y=y;public static void main(string args)point.output(); /类。方法-非静态的方法,我们称为实例方法,也就是对象的方法。对于一个静态的方法,在类加载的时候,就给静态的方法分配了内存空间,而非静态的成员变量,只有实例化一个对象时,才会为其分配内在空间(非静态变量也称为实例变量)。class pointint x,y;point(int a,i

17、nt b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法static void output()system.out.println("output() called");system.out.println(x);/编译后发现这行出错,显示“不能在静态环境中引/用非静态的变量,这里的x 是类的成员变量,是/非静态的,它不能用在静态的环境中。/system.out.println(y);void output(int x,int y)this.x=x;this.y=y;public static void main(

18、string args)point.output();-l 静态方法和静态变量是属于某一个类,而不属于类的对象。l 静态方法和静态变量的引用直接通过类名引用。l 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。l 可以用类的对象obj去调用静态的方法method(),如:obj.method()。class pointint x,y;point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法static void output()system.out.println("output

19、() called");system.out.println(x);/system.out.println(y);void output(int x,int y)this.x=x;this.y=y;public static void main(string args)point pt=new point(); /静态方法先于这个对象分配空间,因此仍然报错,/错误类型与上面的完全一致。pt.output();/point.output();l 静态方法和静态变量是属于某一个类,而不属于类的对象。l 静态方法和静态变量的引用直接通过类名引用。class point int x,y; /

20、实例变量(即对象的变量,是非静态变量)static int z; /类变量(或称为静态变量)point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int b)方法static void output()system.out.println("output() called");system.out.println(z);/system.out.println(x); /system.out.println(y);void output(int x,int y)this.x=x;this.y=y;publ

21、ic static void main(string args)point.output();运行结果为:  output() called 0弄清内存的分配是解决问题的关键l 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。l 可以用类的对象obj去调用静态的方法method(),如:obj.method()。class pointint x,y; /实例变量static int z; /类变量(或称为静态变量)point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法stati

22、c void output()system.out.println("output() called");system.out.println(z); /system.out.println(x); /system.out.println(y);void output(int x,int y)this.x=x;this.y=y;public static void main(string args)point pt=new point();pt.output();运行结果为: output() called 0为什么要把main()方法定义为静态的方法呢?有了上面的基础,就

23、很容易地分析这个问题了。我们知道,在c/c+语言中,main()方法,并不是属于某个类的,它是全局的方法,所以当执行的时候c+编译器很容易找到这个main()方法。然而,当执行java程序时,因为java都是以类作为程序的组织单元,当我们要执行的时候,我们并不知道这个main()方法将会放在哪个类当中的,也不知道是否要产生这个类的一个对象,为了解决程序的运行问题,将main()定义为static(静态的)。这样,当执行java代码的时候,如执行: java point 命令时即加载point类的时候,就会在point类中调用main()方法,即main()方法就被加载了,而不需要再生成一个对象

24、了。如果不把main()方法定义为static时,则为成员或非表态方法时,要想执行 main()方法则必须先实例化一个对象,这样程序就没法运行。class pointint x,y; /实例变量static int z; /类变量(或称为静态变量)point(int a,int b)x=a;y=b;point()this(1,1); /调用带参数的point(int a,int )方法static void output()system.out.println("output() called");system.out.println(z); /system.ou

25、t.println(x); /system.out.println(y);void output(int x,int y)this.x=x;z=2; /非静态环境中可以调用静态变量.this.y=y;public static void main(string args)point pt1=new point();point pt2=new point();pt1.z=5;pt2.z=10;system.out.println(pt1.z);system.out.println(pt2.z);运行结果为: 10 10这说明,pt1和pt2对象共享同一类变量(静态变量)常量的定义l 使用关键字f

26、inal定义常量,例如:final doubl.e pi=3.1415926;l 作为一种约定,在定义常量时,通常采用大写形式。l final常量可以在声明的同时赋初值,也可以在构造函数中赋初值。l 为了节省内存,我们通常将常量声明为静态的(static).-class point /编译后无错误int x,y;final double pi=3.1415926;point(int a,int b)x=a;y=b;point()this(1,1);public static void main(string args)point pt=new point();class point /编译后出

27、现错误,显示“变量pi可能没有被初始化”,这是因为有两/个构造方法,都应该被初始化,int x,y;final double pi;/=3.1415926;point(int a,int b) /pi=3.1415926;x=a;y=b;point()pi=3.1415926;/this(1,1);public static void main(string args)point pt=new point();class point /编译后没有报错int x,y;final double pi;/=3.1415926;point(int a,int b)pi=3.1415926;x=a;y=b;point()pi=3.1415926;/this(1,1);public static void main(string args)point pt=new point();class point /编译后报错int x,y;final double pi;/=3.1415926;point(int a,int b)pi=3.1415926;x=a;y=b;point() pi=3.14

温馨提示

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

评论

0/150

提交评论