




已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计2,教材45章,静态域与静态方法 抽象类与抽象方法 最终类与最终方法 包及访问权限控制 接口,静态属性(类属性),static静态修饰符,可以修饰类中的属性与方法 静态属性(类属性) 被static修饰的属性; 是类的属性,不属于任何一个类的具体对象; 位于类的内存区域中,是该类对象共享的存储单元; 无static修饰的属性为对象属性。 静态属性的访问 类名.属性名 或:对象名.属性名,访问的是相同的内存单元,静态属性例,class Employee /Employee类定义 String name ; int age ; float salary ; static float c_minSalary=500 ; /静态属性,职工最低工资 Employee(String n,int a,float s) /构造方法 name = n ; age = a ; salary = s; void upSalary(float inc) /方法提薪 salary = salary + inc ; String getInfo() /方法取信息 return “姓名:“+name+“ 年龄:“+age+“ 工资:“+salary ; ,静态属性例,public class Test public static void main(String args) Employee emp1 = new Employee(“赵兵“,28,1500.0F); Employee emp2 = new Employee(“何小明“,31,1800.0F); System.out.println(Employee.c_minSalary); System.out.println(emp1.c_minSalary); System.out.println(emp2.c_minSalary); if(emp1.salaryEmployee.c_minSalary) emp1.upSalary(500.0F) ; ,5-1,静态属性例,可实现各实例之间的通讯。 例:跟踪创建的实例数 class Employee /Employee类定义 String name ; int age ; float salary ; static float c_minSalary=800.0F ; /静态属性,职工最低工资 static int c_count = 0 ; /静态属性,创建对象记数器 Employee(String n,int a,float s) /构造方法 name = n ; age = a ; if (s c_minSalary) salary = c_minSalary ; else salary = s;,静态属性例,c_count+ ; public class Test public static void main(String args) Employee emp1 = new Employee(“赵兵“,28,500.0F); System.out.println(“赵兵的工资是:“ + emp1.salary); Employee emp2 = new Employee(“何小明“,31,1800.0F); System.out.println(“目前创建了“ + Employee.c_count + “个对象“); ,5-2,系统类的静态属性例,Integer类静态属性例: MIN_VALUE 该属性(常量)代表整型数的最小值 MAX_VALUE 该属性(常量)代表整型数的最大值 System类静态属性例: in(该属性为InputStream类型)表示标准输入(键盘) out(该属性为PrintStream类型)表示标准输出(显示器) 测试例: public class Test public static void main(String args) System.out.println(Integer.MIN_VALUE); / -2147483648 System.out.println(Integer.MAX_VALUE); / 2147483647 ,静态方法(类方法),static静态修饰符,可以修饰类中的属性与方法。 静态方法 被 static 修饰的方法; 使用类方法不用创建类的对象。调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名。 非static的方法是对象方法(或称实例方法)。 类方法中不能访问实例属性,而只能访问类属性( static属性)、自己的方法参数及定义的变量。 类方法中不能直接调用本类中的实例方法,但可以调用其他的static方法。 类方法中没有this值。 静态方法的调用 类名.方法名,静态方法(类方法)例,public class Test public static void main(String args) System.out.println(Math.round(3.54); String s = toChar(2.718); System.out.println(“e=“ + s ); static String toChar(double x) return Double.toString(x); /调用Double类的toString静态方法 Math.round(3.54) 是调用Math类的round静态方法,其功能是对参数值进行四舍五入处理,并将处理的结果返回。 Double.toString(x) 是调用Double类的toString静态方法,其功能是将Doubie类型的参数值转换为String类型并返回。 在main方法中还调用了Test类中定义的toChar静态方法。,5-3,静态方法(类方法),main方法是静态方法,这是为了系统在没有任何实例化对象之前可以运行一个应用程序。 如果main方法要调用本类的其它方法: 将这些方法设计成静态方法, 创建对象,使用对象方法。 一个静态方法不能被一个非静态方法所覆盖。,静态方法(类方法)例,class Employee /Employee类定义 String name ; int age ; float salary ; static float c_minSalary=500 ; /静态属性,职工最低工资 Employee(String n,int a,float s) /构造方法 name = n ; age = a ; salary = s ; static float getMinSalary() /静态方法,读取静态属性 return c_minSalary ; static void setMinSalary(float f) /静态方法,设置静态属性 c_minSalary = f ; static float findTax(Employee e) /静态方法,计算税款 return e.salary * 0.1F; /Employee,静态方法(类方法)例,class Manager extends Employee float allowance ; Manager(String n,int a,float s , float aa) /构造方法 super(n,a,s) ; /调用父类构造方法(为3个属性赋值) allowance = aa ; /为allowance属性赋值 / 方法略 /Manager,静态方法(类方法)例,public class Test public static void main(String args) Employee emp = new Employee(“赵兵“,28,1400.0F); Manager mgr = new Manager(“刘云峰“,41,3800.0F,500.0F); Employee.setMinSalary(800.0F); /调用静态方法 System.out.println( “职工最低工资为:“ + Employee.getMinSalary() ); System.out.println( + “应交税:“ + Employee.findTax(emp) ); System.out.println( + “应交税:“ + Employee.findTax(mgr) ); ,5-4,类的初始化静态初始化器,由关键字static引导的一对大括号括起的语句组,用来完成类的初始化的工作。 与构造方法的区别: 构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化; 构造方法是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行; 不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。,静态初始化器例,class Employee /Employee类定义 String name ; int age ; float salary ; static float c_minSalary ; /静态属性,职工最低工资 static int c_count ; /静态属性,创建对象记数器 static / 静态初始化器,初始化两个静态属性 c_minSalary = 800 ; c_count = 0 ; Employee(String n,int a,float s) /构造方法 name = n ; age = a ; if (s c_minSalary) salary = c_minSalary ; else salary = s; c_count+ ; /创建一个Employee对象,计数器计数一次 /测试程序略,抽象类与抽象方法,abstract 修饰符定义一个抽象类 抽象类是没有具体对象的概念类,不能创建抽象类的对象; 是类继承中处于较高层次的类,是对子类共性的抽象与定义; 抽象类的作用是让其子类来继承它所定义的属性及方法,以避免各子类重复定义这些相同的内容; 程序员可以先建立抽象类(定义子类共有的属性及方法),再从一般类派生出具有特性的子类。 abstract 修饰符定义一个抽象方法 抽象方法是仅有方法头而没有方法体的方法; 为该类的子类定义一个方法的接口标准,方法的具体实现在子类中完成。,抽象类与抽象方法,抽象类经常包含某些抽象方法,即规定一些方法的接口,而方法的代码要由不同的子类去实现。 一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。 抽象类中可以定义一般方法和抽象方法,但抽象方法只能出现在抽象类中。,最终类,用final 修饰符定义的类最终类 final类不能被继承,final类不能再有子类; 在类的继承树中,final类只能是树的叶子结点; 当然,叶子结点不一定是final类。 类的保护性措施 当通过类名引用类的对象时,实际引用的既可以是该类的对象本身,也可以是这个类的子类的对象,即有一定的不确定性; 将一个类定义为final类,可以杜绝其子类的产生,将该类的属性及方法固定下来,类的内容与类的引用形成稳定的映射关系。 final类通常是定义那些有固定功能、用来完成某种标准功能的类。,最终方法,用final 修饰符定义的方法 最终方法 不能被当前类的子类重新定义的方法。 子类不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。只能继承但不能修改。 固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。 方法的保护性措施。,最终属性,用final 修饰符定义的属性 最终属性 final属性的值不能被修改,相当于一个常量; final属性要指定数据类型及其取值 由于所有类对象的final属性值都一样,为节省空间,final属性通常又被同时声明为static(静态属性)。 例:static final int c_minSalary = 800 ; 而: static int c_minSalary = 800 是定义静态属性,但可以修改。,类继承树,Object,class,abstract class,class,final class,class,java 采用单重继承机制,即每个类只有一个父类,抽象类例,抽象类,交通工具,自行车,汽车,空中交通工具,海上交通工具,陆地交通工具,客机,运输机,抽象类与最终类,抽象类 最终类,Person,Engineer,Secretary,Customer,Employss,VipCust,Manager,Director,5-5,抽象类、抽象方法、最终类、最终方法例,final getName() final upSalary(inc) getInfo(),static c_minSalary name sex age salary title,Engineer最终类,final getName() final upSalary(inc) getInfo(),static c_minSalary name sex age salary office,Secretary最终类,Employee类,抽象类、抽象方法、最终类、最终方法例,Employee类,方法 重载,抽象类、抽象方法、最终类、最终方法例,例题代码,abstract class People /人员类 抽象类 String name ; char sex ; abstract String getInfo() ; /抽象方法,子类要实现 final String getName() /最终方法,只能继承,不能修改 return name ; ,例题代码,class Customer extends People /客户类 String custno ; Customer(String c ,String n,char x) custno = c ; /客户号 name = n ; /姓名 sex = x ; /性别 String getInfo() /通过方法覆盖,实现父类的抽象方法 return “客户号:“ + custno + “ 姓名:“ + name + “ 性别:“ + sex ; /Cuetomer,例题代码,final class VipCust extends Customer /vip客户 最终类 static int c_vno=0 ; /静态属性,用于生成客户对象的vip号 int vipno ; /vip号 VipCust( String c, String n,char x) super(c,n,x) ; vipno = +c_vno ; String getInfo() /通过方法覆盖,改写方法 return “vip客户:“ + “vip编号:“ + vipno + “ 姓名:“ + name ; ,例题代码,class Employee extends People static float c_minSalary=500 ; /静态属性(职工最低工资) int age ; float salary ; Employee(String n,char x, int a, float s) name = n ; sex = x ; age = a ; if (s c_minSalary) salary = c_minSalary ; else salary = s ; void upSalary(float inc) / 定义新方法 salary = salary + inc ; String getInfo() /通过方法覆盖,实现父类的抽象方法 return “姓名:“ + name + “ 性别:“ + sex + “ 年龄:“ + age ; ,例题代码,class Manager extends Employee float allowance ; Manager(String n,char x , int a , float s,float aa ) super(n,x,a,s) ; allowance = aa ; /津贴 final void upSalary(float inc1,float inc2) /最终方法,方法重载 salary = salary + inc1 ; allowance = allowance + inc2 ; String getInfo() /改写父类Employee的方法 return “管理者“ + super.getInfo() + “ 收入:“ + (salary+allowance) ; /Manager,例题代码,final class Director extends Manager /最终类 String telephone ; String department ; Director(String n,char x, int a,float s,float aa,String t,String d ) super(n,x,a,s,aa) ; telephone = t ; department = d ; void setTel(String tel) telephone = tel ; String getTel() return telephone ; String getInfo() return name + “ 是 “ + department + “ 部门的领导“ ; /Director,例题代码,final class Engineer extends Employee /最终类 String title ; Engineer(String n,char x , int a , float s , String t) super(n,x,a,s) ; title = t ; String getInfo() return name + “ 职称是 “ + title ; /Engineer,例题代码,final class Secretary extends Employee /最终类 String office ; Secretary(String n,char x , int a , float s , String o) super(n,x,a,s) ; office = o ; String getInfo() return name + “ 是 “ + office + “的秘书“ ; /Secretary,例题代码,public class Test public static void main(String args) System.out.println(“-测试客户-“); Customer cust1 = new Customer(“c01“ ,“黄云“ , 女) ; VipCust vip1 = new VipCust(“c02“,“李梓“,女 ) ; VipCust vip2 = new VipCust(“c03“,“赵勇“,男 ) ; System.out.println(cust1.getInfo(); System.out.println(“cust1客户名为:“ + cust1.getName() ); System.out.println(vip1.getInfo(); System.out.println(“vip1的客户名为:“ + vip1.getName(); System.out.println(vip2.getInfo(); System.out.println(“已创建的vip客户数为:“+VipCust.c_vno);,例题代码,System.out.println(“-测试职工-“); Employee emp = new Employee(“赵兵“,男,28,1500.0F); Manager mgr = new Manager(“徐军“,女,35,1800.0F,500.0F); Director dir = new Director(“黄帅“,男,45,3000.0F, 500.0F,“2430“,“计划司“); Engineer eng = new Engineer(“刘志军“,男,38,1600.0F, “工程师“); Secretary sec = new Secretary(“邓萍“,女,23,1000.0F, “财务室“); System.out.println(“emp的名字是:“ + emp.getName(); emp.upSalary(500.0F); System.out.println(emp.getInfo();,例题代码,mgr.upSalary(200.0F,200.0F) ; System.out.println(mgr.getInfo(); dir.setTel(“8888“); System.out.println(“dir的姓名:“+dir.getName()+ “ dir的电话:“+dir.getTel(); System.out.println(dir.getInfo(); System.out.println(eng.getInfo(); System.out.println(sec.getInfo(); ,5-5,代码说明,方法覆盖抽象方法的实现 People类抽象了一个其子类共有的方法: abstract String getInfo() ; 这个方法代表相同的功能(获取对象信息),但对于不同类型的对象,显示内容是不同的。不同的子类可以重新定义该方法,实现不同内容的信息显示。 但是所有的类中,凡是实现获取信息的方法,尽管内容不同,却共享相同的名字getInfo() 由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类对象即可区分(对象名.方法名),代码说明,若Customer类修改代码如下: class Customer extends People String custno ; Customer(String c ,String n,char x) custno = c ; name = n ; sex = x ; String getName() return “客户姓名:“ + name; /Cuetomer,抽象方法在非抽象类中必须实现 ! 最终方法不能重新定义(覆盖)!,代码说明,如果将Customer定义成最终类(final),编译错误如下:,最终类不能被继承,即不能有子类!,编译单元的基本概念,一个java源代码文件称之为一个编译单元。 一个编译单元中只能有一个public类,该类名与文件名相同。编译单元中的其他类是该主public类的支撑类。 经过编译,编译单元中的每个类都产生一个 .class文件。 java的工作程序是一串.class文件, JAVA解释器负责寻找、加载和解释这些文件。 (不象其它语言最终生成一个.exe的可执行文件),编译单元,public class c1 . main(). class c2. class c3.,.java文件,class c4. class c5.,c1.class文件,c3.class文件,c2.class文件,c5.class文件,c4.class文件,javac,javac,java,.java文件,包(package),在操作系统中,目录用来组织文件,设置权限。 Java利用包来组织相关的类,并控制访问权限。 包是一种松散的类的集合。一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等等。 由于同一包中的类在缺省情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。 利用包来管理类,便于类的组织、管理和引用(共享),可实现类的访问权限控制。 系统类库就是以若干个包的形式提供: Input java.io.* 程序要引用系统io包中的类。,包与类的名字空间,所有类成员的名字都是相互隔离的。类A中的方法m1与类B中的方法m1互不相干,但类名就有冲突的问题; 在一个Java程序运行过程中,某些类会从internet上自动下载,而用户并不知晓。所以在java中需要名字空间的完全控制,以便可以建立一个唯一的类名。 包用于类的名字空间管理。 作为包的设计人员,利用包来划分名字空间以避免类名冲突,类的名字空间包目录,包 p1,类c1,类c2,类c3,包 p11,包 p2,类c2,类c3,类c4,类c1,类c5,p2,p11,d:temp,类,classpath =d:temp,p1,包,包与目录,一个包要放在指定目录下,包名本身又对应一个目录(用一个目录表示)。 一个包可以包含若干个类文件,还可包含若干包。 包名可以有层次,以小数点分割。包名一般全小写。 环境变量classpath 指定搜寻包的路径。,编译单元与包,对象三步曲: 打开包(import,package) 加载类(程序中只有类定义的一份拷贝) 建对象(用new运算符可以创建一个类的若干实例),编译 单元,当前包,其他包,其他包,package,import,package语句,常见语句格式: package 包名 ; package 包名.子包名 ; 在一个编译单元中,只能有一个package语句,且为第一个语句。 语句功能指定当前包 凡在本编译单元中定义的类都属于这个包(对类分组); 本编译单元也可引用当前包中已有的类; 如果编译单元中无package语句,则隐含的当前包是一个无名包(放在当前目录下)。 无名包中的类是为了局部应用。,import语句,常用语句格式: import 包名.类名 ; /引入指定的类 import 包名.* ; /引入包中的所有类 import 包名.子包名.* ; import语句必须出现在所有类定义之前; import语句将所指定包中的类引入当前的名字空间,即告诉编译到哪去找程序中使用的类; 例:import java.util.* ; 该语句引入整个utility 类库(标准Java库的一部分) 例:import java.util.Vector ; 该语句只引入Vector类,但utility类库中的其他类不可用。,从包中加载类,当程序需要建立一个类的对象,或是第一次访问类的静态成员时,会动态加载类文件。 import语句并不实际加载包中的类; JAVA解释器加载类过程: 将环境变量CLASSPATH包含的一个或多个目录作为起始目录; 解释器取出包名,将小数点换成斜杠,产生以CLASSPATH目录为起点的查找路径; 查找目录下的 .class文件; 例 import p1.p11.* 转换为 p1p11*.class 或 p1/p11/*.class (取决于操作系统),包的使用例,例子说明 在d:emp目录下建立一个名为employee的包; 将Employee、Manager、Director 三个类放入employee包中; 在测试程序中,引用employee包中的类,对上述三个类的对象进行测试。 包与目录的对应关系 在d:emp目录下建立包,系统会在该目录下建立employee目录,代表这个包的所在位置; 将Employee等三个类放入employee包中,最终结果是在d:empemployee目录下存放3个类文件: Employee.class、Manager.class和Manager.class,包的使用例,在开始该例子过程之前,先为新的包(employee)设置好查询路径。 设置employee包的查询路径(dos命令) set classpath=%CLASSPATH%;d:emp 在原有查询路径的基础上,再加一个查询目录d:emp,包的使用例,package employee ; / 声明 employee包为当前包 public class Employee /生成的类文件放入employee包中 static float c_minSalary=500 ; /静态属性 String name ; char sex ; int age ; float salary ; public Employee(String n,char x, int a, float s) name = n ; sex = x ; age = a ; salary = s ; void upSalary(float inc) salary = salary + inc ; public String getInfo() return “姓名:“ + name + “ 性别:“ + sex + “ 年龄:“ + age ; ,Employee.java,包的使用例,package employee ; /声明 employee包为当前包 public class Manager extends Employee float allowance ; public Manager(String n,char x , int a , float s,float aa ) super(n,x,a,s) ; allowance = aa ; public String getInfo() /改写父类Employee的方法 return “管理者“ + super.getInfo() + “ 收入:“ + (salary+allowance) ; /Manager,Manager.java,包的使用例,package employee ;声明 employee包为当前包 public class Director extends Manager String telephone ; String department ; public Director(String n,char x, int a, float s, float aa, String t,String d ) super(n,x,a,s,aa) ; telephone = t ; department = d ; void setTel(String tel) telephone = tel ; String getTel() return telephone ; public String getInfo() return name + “ 是 “ + department + “ 部门的领导“ ; /Director,Director.java,包的使用例,javac命令选项: javac -d 目录名 指定存放生成的类文件的位置。 本例由于指定了package语句,所以是将生成的类文件存入指定目录(d:emp)下的包中(employee包) 如果emp目录下没有employee子目录,系统会自动创建。 如果没有指定 -d 选项,系统就认为employee在当前目录下。,包的使用例,import employee.* ; /本程序要用到employee包中的类 public class Test public static void main(String args) Employee emp = new Employee(“赵兵“,男,28,1500.0F); Manager mgr = new Manager(“徐军“,女,35,1800.0F,500.0F); Director dir = new Director(“黄帅“,男,45,3000.0F,500.0F, “2430“,“计划司“); System.out.println(emp.getInfo(); System.out.println(mgr.getInfo(); System.out.println(dir.getInfo(); ,5-6,Test.java 注意:本文件不要与前面的3个 类文件放在同一目录下,访问控制符,访问控制符是一组限定类、属性和方法是否可以被程序其他部分访问的修饰符 。 类访问控制符public 公共类 :public 类名 一般类 :无public修饰的类 公共类:表明它可以被其他所有的类访问。 一般类:只能被同一包中的类所访问;一个包中的类不用说明可相互访问。 把常在一起协同工作的类放在一个包里是很自然的。,类成员(属性和方法)的访问控制,一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件。 属性和方法的访问控制符,类成员(属性和方法)的访问控制,访问控制一般原则,本包使用,采用缺省方式; 供其他包使用,采用public控制符; 为了使对象具有良好的封装性,可将类的实例变量设计成私有,但为了使其它类或对象能够访问私有实例变量,本类必须提供访问私有变量的方法(公共方法)。 按照惯例: 读私有变量的方法取名为get 写私有变量的方法取名为 set,访问控制符例,public class Employee private String name ; private char sex ; private int age ; private float salary ; public Employee(String n,char x, int a, float s) name = n ; sex = x ; age = a ; salary = s ; void upSalary(float inc) salary = salary + inc ; public int getAge() return age ; public void setAge(int a) age=a ; public String getInfo() return “姓名:“ + name + “ 性别:“ + sex + “ 年龄:“ + age ; ,其他类不能访问, 子类也不能继承,访问控制符例,public class Test /与Employee在同一包中 public static void main(String args) Employee emp = new Employee(“赵兵“,男,28,1500.0F); emp.upSalary(500); System.out.println(emp.age); /该语句出错 emp.setAge(29) ; System.out.println(emp.getAge(); System.out.println(emp.getInfo(); ,访问控制符例,public class Manager extends Employee float allowance ; public Manager(String n,char x , int a , float s,float aa ) super(n,x,a,s) ; allowance = aa ; public String getInfo() return name+sex+age+salary ; / 出错,父类属性没有继承 /Manager,5-7,接口interface,接口具有抽象类的概念 接口中的方法都是没有方法体的抽
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 庆祝六一儿童节方案
- 疫情下酒业市场格局演变-洞察及研究
- 手型课件添画绿圃
- 学生消防安全培训教案课件
- 重庆管理基础知识
- 铸造厂考试试题及答案
- 中级银行从业试题及答案
- 福安国企考试真题及答案
- 2025年成套认知测试题及答案
- 2025年环保型货物海运进口代理及绿色认证合同
- 2025年职业技能大赛(电工赛项)理论考试指导题库500题(含答案)
- 眼科进修汇报
- 《上矢状窦血栓》课件
- 2025年华侨港澳台生联招考试高考地理试卷试题(含答案详解)
- 沪科版八年级数学上册期末复习考题猜想 专题02 一次函数(易错必刷40题8种题型)
- 厂房拆除施工方案
- 部队春季流行病预防知识
- 安装工程技术标
- 2023-2024学年天津八中七年级(上)第一次月考语文试卷
- 运动医学分级诊疗管理制度
- 挂靠经营合同(2篇)
评论
0/150
提交评论