《Java第三章面向对象技术的复习回顾.ppt》由会员分享,可在线阅读,更多相关《Java第三章面向对象技术的复习回顾.ppt(58页珍藏版)》请在三一办公上搜索。
1、计算机专业三年级,第三章面向对象技术回顾,南京农业大学谢忠红,计算机专业三年级,内容简介,3.1 类和对象的定义和使用;3.2类的封装 封装的概念、如何封装?3.3类的继承 继承的概念、再论构造函数 3.4类的多态 方法的覆盖、方法的重载 3.5Java和C+这章的主要不同点,计算机专业三年级,3.1 类和对象的定义和使用,Java 是(纯)面向对象的编程语言-万物皆对象,客观世界是各种对象的集合-复杂的对象由简单的对象组合而成-每个对象都是唯一的(单独分配内存)-对象具有属性和行为,他们之间进行消息发送-对象都属于某个类,计算机专业三年级,类和对象的概念,什么是类?什么是对象?对象在我们所处
2、的客观世界中,每一个有明确的意义和边界的事物都可以看作一个对象(Object)例如:某台电脑,一辆汽车对象类(简称类Class)我们可以把具有相似特征的事物归为一类,也就是所把具有相同属性的对象看成一个对象类。例如:“电视机类”类-电视机的设计图 对象-各家各户的电视机Java 是通过先定一个类,然后按照类的结构创造一个又一个对象。,计算机专业三年级,class Car String type;int color;int price;void start()void brake();void accelerate(),现实世界汽车类,计算机世界描述的汽车类,MyFirstCar=new car
3、()计算机世界描述的一辆汽车(对象),计算机专业三年级,class man String name;int age;float weight;String ID;void move()void speek();void work(),现实世界人类,计算机世界描述的人(类),Jack=new man()计算机世界描述Jack(对象),Jack,计算机专业三年级,使用Java如何创建一个类,类声明格式:class 修饰符:public|private|空类名:一个自定义的修饰符号,public class person private String name;int age=12;int weig
4、ht=30;public person()public void speak()public String go().public void work(int a),计算机专业三年级,抽象类举例,class point int x,y;/属性声明 point()x=0;y=0;/默认的构造函数 point(int x1,int y1)x=x1;y=y1;/自定义构造函数 void print()System.out.println(“(”+x+”,”+y+“)”,计算机专业三年级,public class Circle,抽象类举例,private int x,y;private double
5、r;,Circle(int x1,int y1,double r1)x=x1;y=y1;r=r1;,void setX(int x1)x=x1;void setR(int r1)r=r1int getY()retrun y;double getR()return r;,public double getCir()return Math.PI*r*2;public double getArea()return Math.PI*r*r;,计算机专业三年级,public class useCircle public static void main(String args)f loat s=0;L=
6、0;/创建了2个圆对象,Circle c1=new Circle(20,50,15.0);Circle c2=new Circle(100,110,30.0),s=c1.getArea();/调用方法L=c1.getCir();System.out.println(“圆c的面积是:”+s+“圆c1的周长是:”+L);,c1=c2;/对象的赋值L=c1.getCir();System.out.println(“圆c1的周长是:”+L);,计算机专业三年级,通过类创建对象,格式:类型 对象名=new 类型(参数列表);如:Circle c1=new Circle(20,50,15.0);,创建对象
7、比较:C+:Circle c1;Java:Circle c1=new Circle(20,50,15.0);,计算机专业三年级,执行 c1=c2 后呢?,对象的赋值 c1=c2;,返回,计算机专业三年级,实例变量和局部变量,Java中的变量分为两种:类内定义的 实例变量(成员变量);方法中定义的 局部变量;,class point int x,y;/实例变量 void init(int a,int b)int s=0;/局部变量;x=a;y=b;,计算机专业三年级,实例变量和局部变量,类内定义的实例变量;方法中定义的局部变量;,class point,int x,y;/实例变量,void in
8、it(int a,int b)int x=0;/局部变量;x=a;x=b;,计算机专业三年级,Public class exp Public void display()int x=1;int x=0;/错误,注意:在同一个作用域内,不允许定义两个同名的局部变量。,计算机专业三年级,实例变量和局部变量,class Point protected int x,y;/实例变量 point(int x1,int y1)x=x1;y=y1;public void setValue()x=5;y=10;public void printValue()int x=15;/局部变量 System.out.p
9、rintln(+x);public void printInsValue()x=5*x;y=y/5;System.out.println(x+y);public static void main(String args)/在类中 Point p1=new Point(10,10);p1.setValue();p1.printValue();p1.printaInsValue();,计算机专业三年级,Class Point/保存为point.h文件Public:Point(int x1,int y1)x=x1;y=y1;setValue();print()cout“x=”x“y=”y prote
10、cted:int x,y;,#include/保存为*.cppint x;void Point:setValue()Point:x=0;Point:y=0void main()Point p1;p1.setValue();:x=12;,注意:C+支持全局变量而Java不支持,计算机专业三年级,构造函数(特殊的方法),DEF:构造函数是在创建对象的时候自动调用的一个方法,该方法与类名同名。,构造函数的作用:主要是用来初始化对象的数据属性。,计算机专业三年级,举例,class CellPhone private String type;private String color;private do
11、uble price;public CellPhone(String type,String color,double price)this.type=type;this.Color=color;this.Price=price;public static void main(String args)CellPhone Mine=new CellPhone(“Nokia”,“Red”,“1500.0”);,计算机专业三年级,class Date int year,month,day;void print(),class Date int year,month,day;void print()S
12、ystem.out.println(date is+year+-+month+-+day);,Date(),系统自动创建一个默认构造器,计算机专业三年级,一个类可以有多个构造函数(重载),根据参数的不同决定执行哪一个.,计算机专业三年级,多个构造器,class Point int x,y,z;Point()x=1;y=1;/默认的构造函数 Point(int new_x,int new_y)x=new_x,y=new_y;Point(int new_x,int new_y,int new_z)x=new_x,y=new_y;z=new_z;,class UsePoint Point point
13、_A=new Point();Point point_B=new Point(5,7);point point_c=new Point(10,20,87),其中无参构造其实默认的构造器,计算机专业三年级,构造函数的特点:,1、构造函数的函数名与类名相同2、构造函数没有返回值(但是不加void修饰符)3、构造函数可以没有参数默认构造函数4、构造函数可以有参数自定义构造函数,Java采用垃圾自动回收机制没有析构函数(C+),计算机专业三年级,3.2类的封装,class private 属性 构造函数 方法,封装的定义:类的设计者把类设计成一个黑匣子,使用者只能看见类定义的公共方法而看不见方法实现的
14、细节;也不能对类的数据进行操作.,计算机专业三年级,为什么要对类进行封装呢?,(1)隐藏类的细节(使用类的人无需知道细节)(2)迫使用户通过方法接口去访问数据 防止外部对类中数据的干扰(3)封装减少了程序对类中数据表达的依赖性,增强了代码的可维护性。,类封装的概念可以打个比方:拿收音机做类比,计算机专业三年级,public class MyDate/类的封装 private int year,month,day;/成员变量,私有的 public MyDate(int y,int m,int d)/对私有成员赋值 year=y;month=m;day=d:public void setYear(
15、int y)year=y;public void setDay(int d)dayr=d;public int getYear()return year;/返回私有成员以便利用 public int getMonth()return month;public int getDay()return day;public void print()System.out.println(date is+year+:+month+:+day);,计算机专业三年级,class EncapsueDate public static void main(String args)MyDate a=new MyD
16、ate(2002,6,28);a.day=13;System.out.println(a.year+”:”+a.month+”:”+a.day);a.print();,对吗?,对吗?,计算机专业三年级,3.3类的继承,DEF:子类继承父类的属性和方法,以及在父类的基础上添加新的属性和方法则就叫做继承。,在 Java 中,有一个被称为Object的特殊超类,所有的类都直接或间接地继承Object类,计算机专业三年级,父类和子类 之间反映的是“一般与特殊”的关系,父类和子类 之间反映的是“一般与特殊”的关系,计算机专业三年级,继承语法:class className extends superCl
17、assName 各实例变量 方法的定义,注意 没有extends,默认父类为Object只能有一个父类,即单继承子类继承父类的全部成员类继承具有传递性,计算机专业三年级,class People public String name;public int age;public char sex;,People(String name,int age,char sex)this.name=name;this.age=age;this.sex=sex;,void setNameAgeSex(String name,int age,char sex)this.name=name,this.age=a
18、ge,this.sex=sex;,String getName()return name;/查询姓名,父类:/People类的声明,计算机专业三年级,class Teacher extends People String course/教授课程,子类 Teacher类:,Teacher(String name,int age,char sex,String course)this.name=name;this.age=age;this.sex=sex;this.course=course;,String whichCourse()return course;/查询所授课程,void setVa
19、lue(String name,int age,char sex,boolean isTeaching)setNameAgeSex(name,age,sex);this.course=course;,void print()(“”+name+“”+sex+“”+age+“”+course);,计算机专业三年级,class test public static void main(String args),Teacher LiPing=new Teacher(“LiPing”,25,m,”Chinese”);LiPing.print();,计算机专业三年级,class test public s
20、tatic void main(String args),Teacher LiPing=new Teacher(“LiPing”,25,m,”Chinese”);LiPing.print();,计算机专业三年级,有关继承必须说明的几点:(1)子类能够继承父类中声明的所有成员变量,不能直接使用private类型的成员变量.(2)子类的变量(方法)会覆盖超类的同名成员变量(方法),但子类方法不能缩小父类方法的权限。(3)子类的构造函数与父类构造函数的关系,计算机专业三年级,成员覆盖习练习题1class A int x=1234;void show()System.out.println(class
21、 A:);,计算机专业三年级,class B extends A double x=567.89;void show()int x=45;System.out.println(“class A:x”+super.x);System.out.println(“class B:x”+x);super.show();System.out.println(class B:);public static void main(String args)B x=new B();System.out.prinln(x.x);x.show();,计算机专业三年级,再论构造函数,this 引用和super引用关键字
22、this DEF:代表一个特殊的对象即当前对象。(1)指代对象(2)指代构造函数,计算机专业三年级,this代表一个特殊的对象即当前对象,例:Class Button char c;boolean equals(Button other)if(this=other)return true;return false;,class test Button public static void main(String args)Button t1=new Button(),t3=new Button();t3=t1;System.out.println(t3.equals(t1);,计算机专业三年级
23、,this 指代对象可以用于解决实例变量被局部变量屏蔽的问题,public class MyDate/类的封装 private int year,month,day;public MyDate(int year,int month,int day)this.year=year;this.month=month;this.day=day;public setDay(int day)this.day=day;,date1=new MyDate(2002,5,8)构造函数中的 this.year 就是指的是date1的实例变量year,计算机专业三年级,this 指代构造函数:在构造器内部使用thi
24、s,它用于指代另外一个构造函数。,Class point int x,int y;Point(int a,int b)x=a;y=b;Point()this(-1,-1);,public class UsePointPublic static void main()point p1=new point();System.out.println(“(”+p1.X+“,”+p1.y+“)”);point p2=new point(10,20);,System.out.println(“(”+p2.X+“,”+p2.y+“)”);,计算机专业三年级,关键字super,构造函数是一种特殊的方法,子类不
25、能继承超类的构造函数,但子类构造函数可以通过super调用超类的构造函数。,class circle extends point int radius;circle(int r,int x,int y)super(x,y);/调用父类的构造函数 radius=r;System.out.println(子类构造函数被调用!);,class point int x,y;point(int x,int y)this.x=x;this.y=y;System.out.println(父类构造函数被调用!);,计算机专业三年级,public class testInherence public stati
26、c void main(String args)circle c1;c1=new circle(1,1,1);,计算机专业三年级,有关构造函数,请注意下列几个例子,计算机专业三年级,子类 class circle extends point int r;circle(int r)radius=r;public static void main(String args)circle c1=new circle(20);System.out.println(x=+c1.x+y=+c1.y+r=+c1.r);,或:class point int x=1,y=1;point(),此处相当于有一个 su
27、per();,计算机专业三年级,总结:若父类没有定义构造函数或只有一个默认构造函数那么子类先执行父类默认的构造函数(对父类数据的初始化),然后再执行自己的构造函数,计算机专业三年级,答案:子类可以在自己的构 造函数中使用super调用它。,计算机专业三年级,class Cylinder extends Circle private double height;public Cylinder(int x1,int y1,double r1,double)height=h;,class circle extends point int radius;/circle(int r,int x,int
28、y)radius=r;this.x=x;this.y=y;,super();,circle(),计算机专业三年级,这个程序能编译成功吗?,class Point int x,y;Point(int x,int y)this.x=x;this.y=y;class Circle extends Point int r;Circle()x=10;y=10;r=10;Circle(int r)super(20,20);this.r=r;,super();,Point(),计算机专业三年级,类的多态性,(1)方法的覆盖(-简单的多态)(2)方法重载(3)构造函数的重载,计算机专业三年级,方法的重载,在J
29、ava中,同一个方法名可以被定义多次,但要求参数表不能完全一样。调用方法时,系统是通过方法名和参数确定所调用的具体方法。这种现象叫做方法或函数的重载。,计算机专业三年级,class mysqure int square(int x)return x*x;double square(double y)return y*y;public class MethodOverload public static void main(String g)mysqure s=new mysqure();System.out.println(The square of integer 17 is+s.squar
30、e(17);System.out.println(The square of double 17.5 is+s.square(17);,计算机专业三年级,Java和C+在这一章的不同,-基本的概念相同(类、类的三大特征),语法有所不同。-Java是单继承,C+是多继承-Java纯封装(无全局变量和类外的方法),C+非也,计算机专业三年级,习题(1)类Test1、Test2定义如下:1public class Test1 2 public float aMethod(float a,float b)3 4 5 public class Test2 extends Test167将以下哪种方法插入
31、行6是不合法的。()A)public float aMethod(float a,float b)B)public int aMethod(int a,int b)C)public int aMethod(float p,float q)D)public int aMethod(float a,int b),计算机专业三年级,面向对象程序举例,创建一个复数类(Complex类),有两个类变量 real imagin 要求:两个构造函数;用方法将复数以(a,b)显示出来 三个方法实现复数的加减乘(a,b)+(c,d)=(a+c,b+d)(a,b)-(c,d)=(a-c,b-d)(a,b)*(c,
32、d)=(a*c-b*d,a*d+b*c),计算机专业三年级,程序设计例题创建复数类,class Complex private float real;private float imagin;Complex()real=0;imagin=0;Complex(float real,float imagin)this.real=real;this.imagin=imagin;float returnReal()return real;float returnImaginary()return imagin;,计算机专业三年级,Complex add(Complex b)int Treal=real+b.real;in Timagin=imagin+b.imagin;return new Complex(Treal,Timagin);Complex sub(Complex b)int Treal=real-b.real;int Timagin=imagin-b.imagin;return new Complex(Treal,Timagin);,