1、2主要内容4.1 面向对象的基本概念4.2 定义Java类4.3 Java对象4.4 Java包4.5 Java的面向对象特性4.6 抽象类4.7 接口34.1 面向过程与面向对象面向过程程序设计:C语言分析出解决问题所需步骤步骤(过程过程),然后用函数函数把这些步骤一步一步实现,使用时一个一个依次调用。程序的数据与操作(函数函数)分离,导致难以扩展,维护困难代码重用性低44.1面向对象的基本概念面向对象程序设计:Java/C#思想:功能功能来划分问题,抽象抽象事物为对象对象,以人类思维模拟现实中的客观事物数据(属性属性)与数据操作(方法方法)作封装在一起维护方便,软件重用效率高(操作对象)5
2、 我要去新疆面向过程面向过程u 我开动车,挂挡,踩油门,过江西、湖南、四川、青海到新疆面向对象面向对象u 我命令车去新疆u 车怎么去我不用关u 信息封装在车这个类的内部,使用者无需了解4.1面向对象的基本概念64.1面向对象的基本概念n类与对象n消息和方法n面向对象特征:封装性,继承性、多态性7类与对象n类:一种复合数据类型复合数据类型,是将不同类型的数据和与这些数据相关的操作封装在一起的封装体。n对象:类的一个实例;1.类是某一类具有相似属性和方法对象的抽象;而对象是某一种类的实例。类是某一类具有相似属性和方法对象的抽象;而对象是某一种类的实例。2.类和对象可理解为数据类型与值的关系类和对象
3、可理解为数据类型与值的关系8方法,消息n变量:即指对象所知道的状态(属性)n方法:指对象的功能单元(操作)。n软件对象通过相互间传递消息来相互作用和通信n消息由三部分组成:n1.接受消息的对象n2.要完成方法的名字n3.方法需要的参数对象对象B对象对象 Amessage9封装n什么是封装?n一种将操作和涉及的数据操作和涉及的数据捆绑在一起从而避免外部干扰或误用避免外部干扰或误用的机制nJava中最基本的封装单元是类封装实际上使用方法将类的封装实际上使用方法将类的数据隐藏起来,控制用户对数据隐藏起来,控制用户对类的修改和访问数据的程度。类的修改和访问数据的程度。私有数据私有数据方法方法方法方法数
4、据数据对象对象A对象对象B公有数据公有数据10继承n什么是继承?n继承是子类获取父类中定义的方法和变量,就像它们属于子类本身一样,另可新增变量、方法class Person String name;int age;int sex;sleep()class Trash_Car extends Car int stu_no;goSchool()11何时选择继承性n一个很好的经验:“C是一个A吗?”n如果是则让C做A的子类.常犯的错误常犯的错误A有一个有一个C吗吗?例如让汽车轮子成为汽车的子类是错误的例如让汽车轮子成为汽车的子类是错误的在父类中只定义各子类共同需要的属性和方法,派生类时,由子类自己增
5、加新的属性和方法。12多态n什么是多态?n多态性是指同名的方法可以有多种不同的功能,或者相同的接口有多种实现方法.13主要内容4.1 面向对象的基本概念4.2 定义Java类4.3 Java对象4.4 Java包4.5 Java的面向对象特性4.6 抽象类4.7 接口144.2 定义Java 类n包括类声明类声明和类体类体n类声明:publicabstract|final class className extends superclassName implements interfaceNameList 15Java类体 class 类名 /类名一般首字母大写首字母大写 修饰符 类型 变量名
6、;/成员变量 修饰符 返回类型 方法名(参数列表)/一般小写一般小写 语句 /成员方法体 常用修饰符:public|protected|private static final transient volatile16初探类与对象class Circle float x,y;float r;double getArea()return r*r*3.14;double getCircumference()return 2*r*3.14;public static void main(String args)Circle c=new Circle();/创建类的对象 c c.r=3;c.x=0;c
7、.y=0;/为对象c的成员变量赋值 System.out.println(“Area”+c.getArea();/访问成员方法 System.out.println(“Circumference”+c.getCircumference();17成员变量 修饰符 基本类型 变量名;/成员变量类型:简单类型(int、float)、数组、类(如String)成员变量定义在所有成员方法外,作用域是整个类类中的所有方法可直接访问成员变量 使用方法:对象名对象名.成员变量成员变量class Student int no;String name;Birthday day;class Birthday int
8、 year;int month;int day;18成员方法返回值类型返回值类型 方法名(参数列表)/方法体 返回值类型可为基本类型或类,无返回值时需为void参数列表可有若干个参数,用逗号隔开 返回值须与返回类型一致,或是其子类使用方法:对象名对象名.成员方法成员方法(参数参数)class Rectangle double length;double width;double area()return length*width;void setDim(double w,double l)width=w;length=l;19成员方法(方法体)n方法体包括包括局部变量的声明以及所有合法的Jav
9、a指令。n局部变量的作用域在该方法内部。n若局部变量与类的成员变量同名,则类的成员变量被隐藏。nthis用在一个方法中引用当前对象,它的值是该方法所在的对象。20成员方法(方法体)实例(1)class Variable int x=0,y=0,z=0;/类的成员变量 void init(int x,int y)this.x=x;this.y=y;int z=5;/局部变量,隐藏全局变量 System.out.println(“*in init*”);System.out.println(“x=”+x+“y=”+y+“z=”+z)21成员方法(方法体)实例(2)public class Vari
10、ableTest public static void main(String args)Variable v=new Variable();System.out.println(“*before init*”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);v.init(20,30);System.out.println(“*after init*”);System.out.println(“x=”+v.x+“y=”+v.y+“z=”+v.z);22成员方法(方法体)实例(3)运行结果 c:java VariableTest *before i
11、nit*x=0 y=0 z=0 *in init*x=20 y=30 z=5 *after init*x=20 y=30 z=023方法重载(Method Overloading)n方法重载指多个方法享有相同的方法名n区别在于:参数类型不同,或个数不同;n返回类型不能用来区分重载的方法。24方法重载public class OverLoad int i=3,j=4;int sum()return i+j;int sum(int a,int b)return a+b;int sum(int a,int b,int c)return a+b+c;double sum(double a,double
12、 b)return a+b;public static void main(String args)OverLoad o=new OverLoad();System.out.println(o.sum();System.out.println(o.sum(5,6);System.out.println(o.sum(5,8,4);System.out.println(o.sum(3.2,2.15);25实例化对象n类是一种抽象的复合数据类型,只有实例化生成对象后才能使用。n格式:类名 对象名=new 类名(参数列表);Student stu1=new Student(“Bin”,20);Stud
13、ent stu2=new Student(“Tom”,21);nnew为每个对象分配不同内存空间,并返回该对象的引用(即对象在内存中首地址);改变对象互不影响。nstu1=stu2 等价于 stuq.equlas(stu2)判断两对象是否地址相等 结果是结果是falsen只声明类的实例,不创建对象可用null Student stu=null;/未分配内存空间 stu=new Student();26初始化对象n方式一:定义成员变量时直接赋初值 calss Student String name=“zhangshan”;n方式二-使用构造方法27构造方法n定义:方法名与类名相同;不返回任何数据
14、类型(void也不能有)n用法:构造方法只能由new运算符调用n作用:利用构造方法进行初始化n注意:构造方法不能被继承;重载经常用于构造方法28构造方法n示例class Point int x,y;Point()x=0;y=0;Point(int x,int y)this.x=x;this.y=y;完整例子29成员方法(值参传递)public class PassTest float ptValue;public static void main(String args)int val;PassTest pt=new PassTest();val=11;System.out.println(“
15、Original Int Value is:”+val);pt.changedInt(val);System.out.pringln(“Int Value after Change is:”+val);pt.ptValue=101f;System.out.println(“Original ptValue is:”+pt.ptValue);pt.ChangeObjValue(pt);System.out.println(“ptValue after Change is:”+pt.ptValue);30成员方法(值参传递)public void changeInt(int value)value
16、=55;public void changeObjValue(PassTest ref)ref.ptValue=99f;31成员方法(值参传递)n运行结果c:java PassTestOriginal Int Value is:11Int Value after Change is:11Original ptValue is:101.0ptValue after Change is:99.032主方法与命令行参数npublic static void main(String args)n该方法被定义为public static void也就是公开的静态的无返回值的方法,且参数args为一个字符
17、串数组,用来接收从命令行输入的参数。n参数之间使用空格隔开。nJava解释器会自动处理,把用空格隔开的各个参数通过args数组传递给main方法。n参数的下标从0开始,args0表示传入的第一个参数,args1表示传入的第二个参数,以此类推。33Example:public class TestJava public static void main(String args)for(int i=0;args!=null&iJavajava TestJava this is a parameter test第0个参数:this第1个参数:is第2个参数:a第3个参数:parameter第4个参数
18、:test34finalize()方法n在父类java.lang.Object中实现n对对象进行垃圾收集前,系统自动调用n自己重写时需要调用父类的finalize()方法n该方法最常见的作用是确保释放实例占用的全部资源。nprotected void finalize()throws throwable /本类的资源清除代码 super.finalize();35主要内容4.1 面向对象的基本概念4.2 定义Java类4.3 Java对象4.4 Java包4.5 Java的面向对象特性4.6 抽象类4.7 接口364.3 Java对象n一旦定义了所需的类,就可以创建该类的变量,创建类的变量称为
19、类的实例化,类的变量也称为类对象、类的实例等。n对象通过消息传递来进行交互n消息传递即激活指定的某个对象的方法以改变其状态或让它产生一定的行为。37对象的生命周期n对象是在程序运行中创建生成的,其所占的空间在程序运行中动态分配。当一个类的对象完成了它的使命,为节省资源,Java的垃圾收集程序就会自动收回这个对象所占的空间。即类对象有自己的生命周期。n生成n使用n清除38对象的生成n包括声明、实例化和初始化 Type objectName=new type(paramlist);n(1)声明:Type objectName n声明并不为对象分配内存空间,而只是分配一个引用空间;n(2)实例化:运
20、算符new为对象分配内存空间,它调用对象的构造方法,返回引用;一个类的不同对象分别占据不同的内存空间。n(3)生成:自动执行构造方法,进行初始化;根据参数不同调用相应的构造方法。39对象的使用n对象的引用指向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址,而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。n通过运算符“.”可以实现对变量的访问和方法的调用。40调用对象的变量n格式:objectReference.variablenobjectReference是一个已生成的对象,也可以是能生成对象的表达式n例:n Rectangle r=new Rectan
21、gle();n r.length=10;n r.width=12;41调用对象的方法n格式:objectReference.methodName(paramlist);class RectDemo2 public static void main(String args)Rectangle rect1=new Rectangle();Rectangle rect2=new Rectangle();double ar;rect1.setDim(20,10);/初始化每个长方形 rect2.setDim(6,3);ar=rect1.area();System.out.println(第一个长方形的
22、面积是:+ar);ar=rect2.area();System.out.println(第二个长方形的面积是:+ar);42实例成员和类成员n实例成员为特定实例所有,通过对象名访问;类成员为类所有,不属于某一个对象,可以通过类名访问。n类成员的格式(static):nstatic type classVar;nstatic returnType classMethod(paramlist)nn n43实例变量和类变量n每个对象的实例变量都分配内存n通过对象来访问这些实例变量n类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量。n类变量可通过类名直接访问,无需先生成一个实例对象n也
23、可以通过实例对象访问类变量44实例变量和类变量class ABCD char data;static int_share_data;class Demo ABCD a,b,c,d;object bchar dataobject cchar dataObject bchar datastatic intshare_dataobject bchar data45实例方法和类方法n类(static)方法不能访问实例变量,只能访问类变量n类方法可以由类名直接调用n类方法中不能使用this或super46实例方法和类方法class member static int classVar;int insta
24、nceVar;static void setClassVar(int i)classVar=i;/instanceVar=i;/cant access nostatic member static int getClassVar()return classVar;void setInstanceVar(int i)classVar=i;instanceVar=i;int getInstanceVar()return instanceVar;47实例方法和类方法public class test public static void main(String args)member m1=new
25、member();member m2=new member();m1.setClassVar(1);m2.setClassVar(2);System.out.println(m1.classVar=+m1.getClassVar()+m2.ClassVar=+m2.getClassVar();m1.setInstanceVar(11);m2.setInstanceVar(22);System.out.println(m1.InstanceVar=+m1.getInstanceVar()+m2.InstanceVar=+m2.getInstanceVar();48实例方法和类方法n运行结果c:j
26、ava memberTestm1.classVar=2 m2.classVar=2m1.InstanceVar=11 m2.InstanceVar=2249对象的清除n对象的清除是指释放对象占用的内存空间。n使用new操作符创建对象之后,Java虚拟机自动为该对象分配内存并保持跟踪。Java虚拟机能判断出对象是否还被引用,对不再被引用的对象,释放它所占用的内存。n我们也可以自行标明一个对象不在使用,只要把一个空值null赋给这个对象引用即可:Obj=null;50主要内容4.1 面向对象的基本概念4.2 定义Java类4.3 Java对象4.4 Java包4.5 Java的面向对象特性4.6
27、抽象类4.7 接口514.4 Java包(package)n一组相关的类和接口集合称为包,包体现了Java语言面向对象特性中的封装机制。n包将java语言的类和接口有机地组织成层次结构,这个层次结构与具体的文件系统的目录树结构层次一致。52n 包由语句package创建,其语法格式如下:n package 包名1.包名2.n Java中,package语句必须是程序的第一条非空格、非注释语句。通过package语句,可将Java程序分层次地存放在不同的目录下,目录名称与包的名称相同。n package book.ch05;n class Rectn 将类Rect放在当前目录的子目录book/c
28、h05下创建包53nJava中,若要用到某些包中的类或接口,一种方法是在程序的开始部分写出相应的引入(import)语句,指出要引入哪些包的哪些类。n另一种方法不用引入语句,直接在要引入的类和接口前给出其所在包名。n 无论采用哪种方法,使用系统类的前提是这个系统类应该是用户程序可见的类。使用包54n1.使用import语句n 用于灵活地实现在编译中使用外部类和接口的引入机制。n import 包名;n import 包名.标识符;n import 包名.*;n2.直接使用包n一般用在程序中引用类和接口次数较少的时候,在要引入的类和接口前直接给出其所在包名。n java.applet.Apple
29、t ap=new java.applet.Applet();使用包55包的使用示例npackage DF;public class Person private String name;public Person(String name)this.name=name;public String getName()return name;56包的使用示例nimport DF.Person;public class Hello public static void main(String args)Person person=new Person(Mike);System.out.println(
30、person.getName();57主要内容4.1 面向对象的基本概念4.2 定义Java类4.3 Java对象4.4 Java包4.5 Java的面向对象特性4.6 抽象类4.7 接口584.5 面向对象特性n封装性n继承性n多态性59封装性n类定义publicabstract|final class className public|protected|private static final type variableName;/成员变量 public|protected|private static final|abstract returnType methodName(param
31、List)throws exceptionList statements /成员方法 60封装性类的修饰nabstract类不能直接产生属于这个类的对象nfinal类不能被其他任何类所继承(安全的考虑)npublic类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.n缺省缺省:类只能被本包中的其它类使用(即便import也不行)61封装性java访问控制n变量和方法的修饰字public、protected、privatenpublic:任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。class ABC public int pub_i=5;pub
32、lic void show)()System.out.println (“pub_i”+pub_i);62封装性例子class Demo public static void main(String args)ABC abc=new ABC();System.out.println(“abc.pub_i”+abc.pub_i);abc.pub_i=10;abc.show();abc.pub_i=5pub_i=10;63封装性-protectedn如果一个类中变量或方法有修饰字protected,同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用public class
33、 ABC protected int pro_i=5;protected void show()System.out.println (“pro_i=”+pro_i;)64封装性-protectedn同一个包中的类能使用class DEF public static void main(String args)ABC abc=new ABC();System.out.println (“abc.pro_i=“+abc.pro_i);abc.pub_i=10;abc.show();65import mytest.pack.ABC;class DEF extends ABC public stat
34、ic void main(String agrs)DEF def=new DEF();System.out.println(def.pro_i);def.pro_i=10;def.show();封装性-protectedn不同包但是是子类也可以66封装性nprivaten不允许任何其他类存取和调用n“前边无修饰字的情况”,称为缺省控制,也称包权限n在同一包中出现的类才可以直接使用它的数据和方法.67封装性-修饰符与访问控制同一个类同一个包不同包的子类不同包非子类private空白protectedpublic68final关键字n(1)final修饰变量,则成为常量n final type v
35、ariableName;n 修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。n(2)final修饰方法,则该方法不能被子类重写n final returnType methodName(paramList)n n n 69final关键字n(3)final修饰类,则类不能被继承n final class finalClassNamen n 70继承性n通过继承实现代码复用 n父类包括直接或者间接被继承的类nJava不支持多重继承,但继承具有传递性n子类不能访问父类中访问权限为private的成员变量和方法。n子类可以重写父类的方法,及命名与父类同名的成员变量71创建子类n格式:
36、class SubClass extends SuperClass 72继承性示例73继承性示例74继承性示例75继承性示例class A int i,j;void showij()System.out.println(i and j:+i+j);/创建一个继承超类A的子类B class B extends A int k;void showk()System.out.println(k:+k);void sum()System.out.println(i+j+k:+(i+j+k);76继承性示例class SimpleInheritance public static void main(S
37、tring args)A superOb=new A();B subOb=new B();superOb.i=10;superOb.j=20;System.out.println(Contents of superOb:);superOb.showij();System.out.println();subOb.i=7;subOb.j=8;subOb.k=9;System.out.println(Contents of subOb:);subOb.showij();subOb.showk();System.out.println();System.out.println(Sum of i,j a
38、nd k in subOb:);subOb.sum();Contents of superOb:i and j:10 20Contents of subOb:i and j:7 8k:9Sum of i,j and k in subOb:i+j+k:2477构造方法在继承中的使用n构造方法不能继承n如父类中只有默认的无参构造方法,写子类的构造方法时不需要用super来初始化父类,它会自动调用父类的默认构造函数。n当父类重写了构造函数后,父类默认的构造函数就被屏蔽,此时在子类写构造函数时必须调用父类的某个(当父类有多个构造函数时)78构造方法在继承中的使用示例class A A()System.
39、out.println(Inside As constructor.);class B extends A/创建创建A的以个子类的以个子类.B()System.out.println(Inside Bs constructor.);class C extends B/创建另一个子类继承创建另一个子类继承B.C()System.out.println(Inside Cs constructor.);class CallingCons public static void main(String args)C c=new C();程序运行结果:Inside As constructor.Insid
40、e Bs constructor.Inside Cs constructor.79class Books String name;Books(String na)this.name=na;class Book extends Books String author;Book(String author)super(“john”);/如果没有这句,编译出错 this.author=author;/局部变量和成员变量同名时,this用于表示当前对象 构造方法在继承中的使用示例80public class test public static void main(String args)Book b
41、=new Book(mike);System.out.println(name=+b.name);System.out.println(author=+b.author);构造方法在继承中的使用示例运行结果:name=johnauthor=mike81方法重写(overridden)n子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型82方法重写示例83成员变量的隐藏和方法的重写class SuperClass int x;void setX()x=0;class SubClass extends SuperClass int x;/hide x in Supe
42、rClass void setX()/override method setX()x=5;.84Super(1)nsuper用来引用当前对象的父类(1)访问父类被隐藏的成员变量,如:super.variable;(2)调用父类中被重写的方法,如:super.Method(paramlist);(3)调用父类的构造函数,如:super(paramlist);85Super(2)class SuperClass int x;SuperClass()x=3;System.out.println(“in SuperClass:x=“+x);void doSomething()System.out.pr
43、intln(“in SuperClass.doSomething()”);86Super(3)class SubClass extends SuperClass int x;SubClass()super();/call constructor of superclass x=5;/super()要放在方法中的第一句 System.out.println(“in SubClass :x=“+x);void doSomething()super.doSomething();/call method of superclass System.out.println(“in SubClass.doS
44、omething()”);System.out.println(“super.x=”+super.x+“sub.x=”+x)public class inheritance public static void main(String args)SubClass subC=new SubClass();subC.doSomething();87Super(4)n运行结果c:java inheritancein SuperClass:x=3in SubClass:x=5in SuperClass.doSomething()in SubClass.doSomething()super.x=3 su
45、b.x=588方法重写应遵循的原则n(1)改写后的方法不能比被重写的方法有更严格的访问权限n(2)改写后的方法不能比重写的方法产生更多的例外89方法重写应遵循的原则class Parent public void function()class Child extends Parent private void function()/出错,访问权限变小public class OverriddenTest public static void main(String args)Parent p1=new Parent();Parent p2=new Child();p1.function();
46、p2.function();90对象状态的确定(instanceof)nManager和Contractor都是Employee的子类n使用instanceof来测试一个对象的类型(指定类及子类)。(返回boolean类型)public void method(Employee e)if (e instanceof Manager)Manager m=(Manager)e;System.out.println(This is the manager of +m.department);else if(e instanceof Contractor)/do something as a Cont
47、ractor91对象的类型转换n用类型转换来恢复一个对象的全部功能。n向上类型转换是将子类对象强制类型转换为父类类型,这总是允许的,而且不需要强制类型转换运算符。n对于向下类型转换(将父类类型强制转换为子类类型),编译器必须满足类型转换至少是可能的这样的条件。比如,任何将Manager转换成Contractor引用的尝试是肯定不允许的,因为Contractor不是一个Manager。类型转换发生的类必须是当前引用类型的子类。92对象类型转换实例class Base public String str=hello Base.;public void hello()System.out.print
48、ln(str);class Sub extends Base public String str=hello Sub.;public void hello()System.out.println(str);public class two public static void main(String args)Base base=new Base();base.hello();/hello Base.Sub sub=new Sub();sub.hello();/hello Sub.Base bs=new Sub();bs.hello();/hello Sub.Base s=new Sub();
49、Sub s1=(Sub)s;s1.hello();/hello Sub.Sub sb=(Sub)new Base();sb.hello();/error 93课堂习题课堂习题Given the following codeclass Base class Ag extends Base public String getFields()String name=Ag;return name;public class Avf public static void main(String argv)Base a=new Ag();/Here 下面哪行代码放在注释处,可以输出下面哪行代码放在注释处,可
50、以输出 Ag?1)System.out.println(a.getFields();2)System.out.println(a.name);3)System.out.println(Base)a.getFields();4)System.out.println(Ag)a).getFields();94多态性n是由封装性和继承性引出的面向对象程序设计语言的另一特征。n静态多态性(编译时多态 由方法重载(overload)实现n动态多态性(运行时多态)n子类对象可以作为父类对象使用。在程序中凡是需要父类对象的地方,都可以用子类对象代替。n由方法重写(overridden)实现n调用规则:根据实例