1、6.1 类和对象概述类和对象概述6.2 类的封装类的封装6.1 类和对象概述类和对象概述 在面向对象技术中,将客观世界中的一在面向对象技术中,将客观世界中的一个事物作为一个对象看待。每个事物都有自己个事物作为一个对象看待。每个事物都有自己的属性和行为。的属性和行为。从程序设计的角度,事物的属性可以用从程序设计的角度,事物的属性可以用变量描述,行为用方法描述。变量描述,行为用方法描述。类只定义属性和行为的模板,对象是类类只定义属性和行为的模板,对象是类的实例,对象与类的关系就像变量和数据类型的实例,对象与类的关系就像变量和数据类型的关系一样。的关系一样。l面向对象的基本概念:面向对象的基本概念:
2、对象与类简单地说:对象对象是表示现实世界中某个具体的事物;类类是对对象的抽象描述。张三 类(CLASS)如:“Man class”将对象抽象为类对类进行实例化修饰符 class 类名 extends 父类名 implements 接口名列表 类成员变量声明;类方法声明;l类的声明类的声明 Java实例 定义类例:定义一个表示二维平面上点的类例:定义一个表示二维平面上点的类class Point private int x,y;public void setPoint(int a,int b)x=a;y=b;public int getX()return x;public int getY()r
3、eturn y;public String toString()return+x+,+y+;修饰符修饰符 类名类名 对象名对象名=new 类名类名(实参列表实参列表);或或修饰符修饰符 类名类名 对象名;对象名;对象名对象名=new 类名类名(实参列表实参列表);l对象的创建和使用对象的创建和使用n创建对象创建对象 Point thePoint;注意:注意:类属于复合数据类型,因此,在声明对类属于复合数据类型,因此,在声明对象时,系统并没有为对象分配空间,用户需要象时,系统并没有为对象分配空间,用户需要应用应用new完成分配空间的任务。完成分配空间的任务。thePoint=new Point(
4、);n对象的引用对象的引用u引用成员变量对象名.成员变量名u引用方法对象名.方法名(参数列表)Java实例对象使用例:定义一个表示圆形的类,能够计算圆面积和周长。class Circle1 float r;final double PI=3.14159;public double area()/计算面积 return PI*r*r;public void setR(float x)/设置半径 r=x;public double perimeter()/计算周长 return 2*PI*r;public static void main(String args)double x,y;Circle
5、1 cir=new Circle1();/创建Circle1类的对象cir cir.setR(12.35f);/引用cir对象的setR()方法 x=cir.area();/引用cir对象的area()方法 y=cir.perimeter();/引用cir对象的perimeter()方法 System.out.println(圆面积=+x+n圆周长=+y);程序运行结果如下:圆面积=479.163190376011圆周长=77.59727539684296l构造方法和对象的初始化构造方法和对象的初始化 类中有一种特殊的成员方法,其方法名与类名相同,称为构造方法。当使用new运算符实例化一个对象
6、时,系统为对象创建内存区域并自动调用构造方法初始化成员变量。n构造方法的特点u构造方法名与类名相同;u构造方法没有返回值;u构造方法的主要作用是对对象初始化。u构造方法不能显式地直接调用;u一个类中可以定义多个构造方法,但各构造方法的参数表不能相同,即各构造方法的参数个数不同或参数类型不同。Java实例用构造方法初始化成员变量class Triangle int x,y,z;public Triangle(int i,int j,int k)/声明构造方法 x=i;y=j;z=k;public static boolean judge(Triangle m)if(Math.sqrt(m.x*m
7、.x+m.y*m.y)=Math.sqrt(m.z*m.z)/引用Math类库的sqrt()方法 return true;else return false;public static void main(String args)Triangle t1;/声明Triangle类对象t1 t1=new Triangle(3,4,5);/实例化对象t1,调用构造方法对其进行初始化 if(judge(t1)/调用judge()方法,判断t1的成员变量是 /否能构成直角三角型的3个边长 System.out.println(这是一个直角三角形);else System.out.println(这不是一
8、个直角三角形);Java实例 定义构造方法class Student String name;String address;int grade;Student(String x1,String x2,String x3,int y)/定义构造方法 name=x1;address=x2;grade=x3;public static void main(String args)Student1 zhang;/声明并创建zhang对象 zhang=new Student(张三,西安市兴庆路1号,3);Student1 wang;/声明并创建wang对象 wang=new Student(王五,西安市
9、翠华路12号,4);System.out.println(zhang.name+zhang.address+zhang.grade);System.out.println(wang.name+wang.address+wang.grade);缺省构造方法的使用 class Student String name;/成员变量 String address;/成员变量 int score;/成员变量 public void setMessage(String x1,String x2,int x3)/成员方法 name=x1;address=x2;score=x3;public static vo
10、id main(String args)Student s1=new Student();/创建Student类对象s1 System.out.println(s1.name+s1.address+s1.score);/输出缺省构造方法的初始化结果 s1.setMessage(张三,西安市兴庆路1号,75);/调用成员方法给成员变量赋值 System.out.println(s1.name+s1.address+s1.score);程序运行结果如下:null null 0张三 西安市兴庆路1号 75使用无参数的构造方法class Time private int hour;/0-23 priv
11、ate int minute;/0-59 private int second;/0-59 public Time()setTime(0,0,0);public void setTime(int hh,int mm,int ss)hour=(hh=0&hh=0&mm=0&ss 60)?ss:0);public String toString()return(hour+:+(minute 10?0:)+minute+:+(second=0&hh=0&mm=0&ss 60)?ss:0);public String toString()return(hour+:+(minute 10?0:)+min
12、ute+:+(second=0&hh=0&mm=0&ss 60)?ss:0);public String toString()return(hour+:+(minute 10?0:)+minute+:+(second 10?0:)+second);public class MyTime2 public static void main(String args)Time time=new Time();time.hour=11;/欲将11赋给hour成员变量,但属于非法访问 System.out.println(time+time.toString();l类访问权限 声明一个类可使用的权限修饰符
13、只有public和缺省2种。虽然一个Java源程序文件中可以包含多个类,但只能有一个类使用public修饰符,该类的名字与源程序文件的名字相同。当程序中创建多个类时,必须运行包含main()方法的类,否则出错。6.2.2 类成员u在类中声明成员变量时,没有使用static修饰的变量为实例成员变量,使用static修饰的变量为类成员变量。l类成员变量class Student String name;/实例成员变量 String sex;/实例成员变量 static int count=0;/类成员变量 public Student(String m,String s)name=m;sex=s;
14、count=count+1;u当创建对象时,每个对象拥有各自的实例成员变量,各对象的实例成员变量具有不同的值;而系统仅为类成员变量分配一个存储单元,所有对象共享一个类成员变量。u实例成员变量属于对象,只能通过对象引用;类成员变量属于类,既可以通过类名访问,也可以通过对象名访问。实例成员变量的访问方法为:对象名.实例成员变量名 类成员变量的访问方法为:对象名.实例成员变量名 或 类名.实例成员变量名例:类成员变量和实例成员变量的对比class Student1 String name;/实例成员变量 String address;/实例成员变量 static int count=0;/类成员变量
15、 public Student1(String m,String a)name=m;address=a;count=count+1;public static void main(String args)Student1 p1=new Student1(李明,西安市未央区);Student1 p2=new Student1(张敏,上海市闽行区);System.out.println(p1.name+p1.address+p1.count);Student1.count=Student1.count+1;System.out.println(p2.name+p2.address+p2.count
16、);p1.count=p1.count-1;System.out.println(p2.name+p2.address+p2.count);程序运行结果如下:李明 西安市未央区 2张敏 上海市闽行区 3张敏 上海市闽行区 2l类成员方法u在类中声明成员方法时,没有使用static修饰的方法为实例成员方法,使用static修饰的方法为类成员方法。public static double area(double r)return 3.14*r*r;u类成员方法中除使用本方法中声明的局部变量外,只可以访问类成员变量,不能访问实例成员变量;实例成员方法中除使用本方法中声明的局部变量外,还可以访问类成员
17、变量及实例成员变量。double perimeter(double x,double y)return 2*(x+y);static double area(double x,double y)return x*y;void print_message()System.out.println(perimeter(2.1,3.5);System.out.println(area(2.1,3.5);u类成员方法中只能调用类成员方法,不能调用实例成员方法;实例成员方法既可以调用类成员方法,也可以调用实例成员方法。u实例方法只能通过对象访问;类成员方法既可以通过类名访问,也可以通过对象名访问。实例成员
18、方法的访问方式为:对象名对象名.实例成员方法名实例成员方法名()类成员变量的访问方法为:对象名对象名.类成员方法名类成员方法名()或或 类名类名.类成员方法名类成员方法名()例:类成员方法和实例成员方法的对比class Course String no;/实例成员变量:课程编号 int score;/实例成员变量:成绩 static int sum=0;/类成员变量:总成绩 public Course(String n,int s)no=n;score=s;public static void summarize(int s)/类方法:统计总成绩 sum+=s;public class Sta
19、tistic public static void main(String args)Course c1,c2;c1=new Course(210,90);Course.summarize(90);System.out.println(sum=+c1.sum);c2=new Course(300,80);c2.summarize(80);System.out.println(sum=+Course.sum);程序运行结果如下:sum=90sum=170l数学函数类 Math类库 Java类库中的Math类提供了很多常用数学函数的实现方法,这些方法都是static方法,通过类名Math调用,其调
20、用方式如下:Math.方法名方法名Math类中的常用方法包括:sin(double x)cos(double x)log(double x)/返回返回x的自然对数的自然对数exp(double x)/返回返回exabs(double x)/返回返回x的绝对值的绝对值max(double x,double y)/返回返回x和和y中的较大值中的较大值sqrt(double x)/返回返回x的平方根的平方根random(double x)/返回返回0,1区间内的随机数区间内的随机数pow(double y,double x)/返回返回yx 例-输入两个数,输出其中较大者 public class Max public static void main(String args)int x,y;x=Integer.parseInt(args0);y=Integer.parseInt(args1);System.out.println(最大值是+Math.max(x,y);