JavaOO-07.面向对象基础.ppt
第七章,面向对象基础,本章要点,类和对象的关系构造器的特征和作用对象创建的内存模型访问权限修饰符简介this关键字,面向对象编程思想,面向对象编程(Object-Oriented Programming OOP),它比面向过程更加先进。能够大幅度的提高项目的成功率,降低后期的维护成本,提高软件的可靠性和可伸缩性。它其实也是一种新的思维方式,从一个新的角度考虑问题。以认知论为基础,使用对象的概念来理解和问题分析,然后设计和开发由对象构成的软件系统。实际上,面向对象就是人类认识客观世界的方式。比如,我们在设计一个系统时必定要分析组成该系统的对象有哪些,找出其中有相同特征的对象,利用这些特征创建一个蓝图。这个蓝图就是类。它是面向对象的核心概念,它应该描述了对象的特征。注意:任何对象的特征都可以分成两个方面:一个是描述对象包含的数据特征实例变量 一个是描述对象表现的行为特征函数/方法所以类由两部分组成:即实例变量和函数,在面向对象学中称为属性和方法。类是具有相同属性和方法的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。,说明同类对象具有相同的属性和方法,是指它们的定义形式相同,而不是说每个对象的属性值都相同。类是静态的;类的存在、语义和关系在程序执行前就已经定义好了。对象是动态的;对象在程序执行时可以被创建和删除,类的定义,类的格式:修饰符一般为public,也可以没有修饰符。注意类名的命名规范。类的成员:变量成员函数成员,修饰符 class 类名 类的成员;,类的举例,01 public class Car02 String color;03 int doorNumber;04 double topSpeed;05 06 public void speedUp()07 08 public void speedDown()09 10 public void brake()11 12,类的举例,01 public class Person02 String name;03 int age;04 double height;05 06 public void sayHello()07 System.out.println(Hello);08 09,创建对象,之前我们仅仅是定义一个类,它只是静态存在的类代码。然而,程序的运行不是依靠类的,而是对象。我们应该利用这些类,创建出对象,然后使用对象的属性和方法让程序运行。对象是动态的,只有代码通过虚拟机运行之后才能产生,虚拟机停止时对象则消失。而类是静态的,程序运行之前即存在了。比如:汽车类、具体的一辆汽车的区别。可见,类是个抽象的概念,对象却是具体的。类只是规定了将来要产生出来的对象应该具备哪些属性和方法,就像一个模板。由类产生的对象必定拥有类中定义的属性和方法。其中,由类生成实例的过程,我们称之为“实例化”。实例化是把抽象的类转换为具体的对象(实例),相当于把人类这个抽象的概念转化为具体的某个人(张三)。对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组方法组成。说明:对象只描述客观事物本质的、与系统目标有关的特征。,创建对象,创建Person类的一个对象p再创建Person类对象q,Person p=new Person();,类名,对象名,内存分配操作符,与类同名,Person q=new Person();,创建对象举例,01 public class Test02 public static void main(String args)03 Person p=new Person();04 p.name=zhangsan;05 p.age=33;06 p.height=1.73;07 p.sayHello();08 Person q=new Person();09 q.name=lisi;10 q.age=44;11 q.height=1.74;12 q.sayHello();13 14,构造器Constructor,构造器,也称为构造方法、构造函数,它在类里起着至关重要的作用。有参数构造器和无参数构造器。类中特殊的方法一般情况权限为public;没有返回值类型,不要写void;方法名称与类名完全一致;作用:完成对象的创建,即完成对象的实例化;不能直接调用,只能由内存分配操作符(new)来调用。,构造器举例,01 public class Person0102 String name;03 int age;04 double height;05 06 public Person(String n,int a,double h)07 name=n;08 age=a;09 height=h;10 11 12 public void sayHello()13 System.out.println(Hello,my name is+name);14,构造器 续,通过实例Person,可以看到使用带参数的构造器进行实例化简化了代码,在创建对象的同时给对象的属性赋值。此时,类由一个抽象的蓝图变化为一个具体的对象,同时对象的属性已经赋值。通过多次调用构造器,一个类可以实例化出多个对象。构造器也是函数、方法,但是它是特殊的方法而已。它也可以像普通函数一样发生重载。通常一个类中不止一个构造函数,而是有多个不同参数的构造器,用户可以根据需要选择不同的构造器创建对象。注意在开发中,我们在编写自己的类时,应该根据需要提供相应的构造器,保证在使用这个类时,能够选择到合适的构造函数。所有的对象都是通过构造器来创建的,也可以说任何对象都是通过内存分配操作符new 创建和开辟内存空间的。如果在开发时,没有明确的写出构造函数,在编译时编译器会发现该类没有构造器,这时编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,我们称之为“默认的空构造器”。相反,如果我们在编写时,手写了一个或是若干个带参的构造器,那么,这个不带参的空构造器就不会再自动产生并存在。在这样的情况下,如果在某些情况下还想使用这样的无参数默认构造器的话,最好还是养成手写出这个无参数的构造器来,以备后用。否则在这个类中,将不再存在这个默认的构造器。,默认构造器,默认的空构造器,对象创建的内存模型,在java中所有的变量、数组、对象都是分配在内存中的,根据变量类型的不同分配的内存也有所不同。Java中主要有3种类型的变量:局部变量:定义在方法体中的变量;或是方法的形参。实例变量:即类的属性,也是全局变量。静态变量:在类中声明为static 的属性。内存的类别栈stack:栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变量和对象的引用值。堆heap:堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。我们在实例化一个对象时,同时操作了栈内存和堆内存。在栈内保存对象的首地址,即 引用;在堆内存中保存了对象的属性。对对象的所有操作只能通过引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾失效。堆和栈分别存储哪些变量?,对象创建的内存模型(续),Person p=new Person(“lisi”,44,1.74);,0 x8000,1.74,44,“lisi”,Person p,0 x8000,name,age,height,对象创建的内存模型(续),Person p=new Person(“zhang”,33,1.73);Person q=new Person(“lisi”,44,1.74);,0 x8000,0 x3000,1.74,44,“lisi”,Person p,0 x3000,name,age,height,1.73,33,“zhang”,name,age,height,Person q,0 x8000,对象创建的内存模型(续),如上所示,对象的属性name、age、height 都分配在堆内存中,但是对象名 p、q都分配在栈内存中。p、q也称为对象的引用(reference),引用在java中是地址的同义词。访问对象:在其他类中或main方法中,若想访问对象的属性或是方法必须先实例化这个类,然后通过对象名(引用)和点操作符来完成:对象名.属性名();对象名.方法名();如果在类内的方法中,访问本类的属性和方法就可以直接访问了。匿名对象:有时候为了方便起见,我们直接使用匿名对象。所谓匿名对象就是没有对象名,对它的使用时一次性的,使用完毕它马上就称为垃圾。public class Testpublic static void main(String args)new Person(“zhangsan”,33,1.83).sayHello();,练习,设计一个类,描述矩形Rectangle的特征widthheight包含一个drawRect()方法,在屏幕上使用“#”画出矩形#,访问权限修饰符简介,最好记忆的两个权限修饰符是public 和private,前者权限最大,后者最小。public 修饰的属性和方法在任何位置都可以访问,不受任何限制。private修饰的属性和方法只有在类内部才能够访问,在其他类不能被访问。public protected friendly privatefriendly不是java的关键字。public权限最大的权限,没有任何限制private权限最小的权限,只限类内部访问见示例,this关键字,代表对象自身的引用一个引用指向调用该方法的当前对象形参名与属性名相同时必须使用this,this关键字举例,01 public class Person02 private String name;03 private int age;04 private double height;05 06 public Person(String name,int age)07 this.name=name;08 this.age=age;09 10 public void sayHello()11 System.out.println(Hello,my name is+name);12 13,垃圾回收机制,Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。垃圾回收机制仅仅作用于堆内存,于栈内存无关。对于程序员来说,对象何时变成垃圾呢?对象的引用被赋值为null;Person p=new Person();p=null;一次性使用的匿名对象;new Person().sayHello();超出生命周期的;如:for(int I=0;i 100;i+)Person p=new Person();这里,变量p 被实例化100次,每结束一次循环,变量p就超出生命周期,对象变为垃圾。,垃圾回收机制,后台线程,主线程,Object o2=new Object();,o2=null;,Object o1=new Object();,The heap,检查出对象没有引用指向,调用o2对象的finalize()方法,垃圾回收机制回收分配给该对象的内存,垃圾回收采用Java多线程机制,Question And Answer,本章小结,类和对象的关系构造器的特征和作用对象创建的内存模型访问权限修饰符简介this关键字,