您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > JAVA程序员-SL275-2
JAVA程序员培训-2第六章类设计继承Employee类Manager类继承继承继承可以避免重复定义属性和方法继承语法规则:修饰符class子类名称[extends父类]{……}JAVA中只有单继承一个父类可以有多个子类一个子类只能继承一个父类所有的类都直接或间接的继承了Object类单继承示例访问控制方法的覆盖(override)子类可以将父类的方法加以改造覆盖的规则子类覆盖方法和父类被覆盖方法的方法返回类型,方法名称,参数列表必须相同子类覆盖方法的访问权限必须大于等于父类的方法的访问权限方法覆盖只能存在于子类和父类之间方法的覆盖举例Employee类publicStringgetDetails(){returnno+/+name+/+year;}Manager类publicStringgetDetails(){returnno+/+name+/+year+/+dept;}方法的重载(overload)在类中同一种功能有不同的实现形式方法重载的规则方法名相同方法的参数类型,个数,顺序至少有一项不同方法的返回类型和修饰符均不受限制具体调用哪个方法,完全取决于调用时给定的参数(实参)方法的重载举例publicclassMath{publicintsum(intn1,intn2){returnn1+n2;}publicintsum(intn1,intn2,intn3){returnn1+n2+n3;}publicstaticvoidmain(String[]args){Mathm=newMath();System.out.println(m.sum(4,5));//9System.out.println(m.sum(1,2,3));//6}}思考:重载sum方法,使之能够计算两double型数字的和比较覆盖和重载的不同覆盖重载方法名相同相同参数列表相同必须不同返回类型相同可以不同访问权限大于等于被覆盖方法无特殊要求位置在子类中覆盖父类可以重载父类的,也可以重载在一个类的次数覆盖一次重载多次抛出异常不能抛出更多异常无特殊要求回顾this使用this的场合使被屏蔽的成员变量变为可见调用本类的其他构造方法(即其他重载方法)this与重载构造器举例publicclassEmployee{……publicEmployee(){}publicEmployee(Stringno){this(no,null,null);//调用其他构造器}publicEmployee(Stringno,Stringname){this(no,name,null);//调用其他构造器}publicEmployee(Stringno,Stringname,Stringyear){this.no=no;this.name=name;this.year=year;}……super关键字类中用super来指向它的父类使用super的场合在子类中访问父类被屏蔽的属性和方法在子类构造方法中调用父类的构造方法super举例在类的构造方法中调用这个类的父类的构造方法publicManager(Stringno,Stringname,Stringyear,Stringdept){super(no,name,year);//调用父类的构造方法this.dept=dept;}调用父类的方法举例publicStringgetDetails(){returnsuper.getDetails()+/+dept;}关于构造方法的几点说明子类不能继承父类的构造器。如果要调用其他构造器(无论子类本身还是父类),必须写在构造器中的第一行。如果构造器中没有显式的this或super调用,则系统默认在构造器第一行插入一个默认父类无参构造器super(),此时如果父类显式的定义了构造器,但没有定义无参构造器会提示错误。对父类的构造器调用会一直延伸到Object类。对象构造和初始化步骤分配存储空间和默认初始化按下列步骤初始化实例变量1.绑定构造方法参数2.如果有this调用,则调用相应的重载构造方法,然后跳到步骤53.显示或隐式的递归调用父类的构造方法(Object类除外)4.进行实例变量的显式初始化5.执行当前构造方法的方法体思考为什么必须在子类的构造器中加入调用父类的构造方法?多态宏观的说就是有不同形式的能力具体表现之一就是一个子类的实例可以赋给一个父类类型的变量例如Employeee=newEmployee();一个父类类型的变量引用一个父类类型的实例Managerm=newManager();一个子类类型的变量引用一个子类类型的实例Employeee=newManager();一个父类类型的变量引用子类类型的实例,这就是多态Managerm=newEmployee();一个子类类型的变量引用父类类型的实例,不可以多态性一个父类类型的变量如果引用的实际是子类的对象,那它是可以说是一个多态对象多态对象只能使用父类的成员但如果父类方法被子类覆盖,则调用子类方法也称为虚拟方法调用例:Employeee1=newManager(101,jack,1998-8-1,NEC);System.out.println(e1.getDetails());//调用的是子类的方法多态的实际用途传递多态参数假如定义一个方法publicvoidmethod(Aa)那么A类B类C类的实例都可以传进去(多态参数)否则就要重载三次方法publicvoidmethod(Aa)publicvoidmethod(Bc)publicvoidmethod(Cc)A类B类C类instanceof操作符测试对象类型,判断一个引用类型的变量所引用的实例是否是一个类的实例。语法格式:xinstanceofAx为引用变量,A为类名或接口名检验x引用的实例是否是类A的对象实例x引用的实例如果是A类或A的子类或A类的间接子类都返回truex引用的实例类型必须是和A类在同一个继承分支上,否则会编译错误instanceof使用Employeee1=newEmployee();Managerm1=newManager();System.out.println(e1instanceofEmployee);//trueSystem.out.println(m1instanceofManager);//trueSystem.out.println(m1instanceofEmployee);//trueSystem.out.println(e1instanceofObject);//trueSystem.out.println(e1instanceofManager);//trueSystem.out.println(e1instanceofCat);//编译错误对象类型转换引用数据类型的转换自动转换:从子类到父类的类型可以自动转换强制转换:从父类到子类的类型要强制转换例:Employeee1=newManager();//自动转换Managerm1=(Manager)e1;//强制转换无继承关系的类型转换是非法的强制转换的实际是对象的对象列表而并非是对象的实例Object类Object类是所有java类的根类如果类的声明中没有显式的定义extends继承某个类则默认继承Object类例如:publicclassEmployee等同于publicclassEmployeeextendsObject任何引用类型的实例都可以赋给Object类型的引用变量Objectobj=任何引用类型的实例==和equals方法的使用==操作符基本类型比较值引用类型比较的是引用的地址(是否引用的是同一个实例)==两边的操作元类型必须保持一致或可自动转换,否则编译出错equals方法由根类Object提供,在Object中实现的功能和==相同格式:obj1.equals(obj2)返回boolean类型值有一些类已经覆盖了equals方法:String、File、Date,以及所有的包装类可以在自定义类中覆盖equals方法,但同时也应该覆盖hashcode方法覆盖equals方法举例publicclassMyPoint{protectedintx;protectedinty;……publicbooleanequals(Objectobj){if(obj==null)returnfalse;//如果为空返回假if(this==obj)returntrue;//如果是用一个实例返回真if(!(objinstanceofMyPoint))returnfalse;//如果不是相同类型返回假MyPointother=(MyPoint)obj;//强制转换为当前类型//进行自定义比较if(this.x==other.x&&this.y==other.y){returntrue;}returnfalse;}toString方法由Object类提供,在Object类中实现的功能是返回“完整类名@16进制哈希码”在打印时如果传入的是引用类型,则默认调用此引用类型的toString()方法在和字符串做加法运算时,也默认调用引用类型的toString()方法可以覆盖toString()方法,将类中数据连接后返回给用户方便易懂的信息包装类(wrapper类)主要作用将基本类型数据包装为引用类型,将基本类型用类表示8种基本类型都有对应的包装类基本类型包装类booleanBooleanbyteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDouble包装类举例可以转换数据类型例如:int型转为String类型inti=1;IntegerobjInt=newInteger(i);Strings1=objInt.toString();例如:String类型转换为int型Strings=“198”;inti=Integer.parseInt(s);本章结束第七章高级类特性static修饰符static在类中可以做属性、方法和内部类的修饰符static修饰的属性和方法和具体实例无关,属于类本身,可以被所有实例共享static修饰的属性和方法也称为静态属性和方法(也称为类属性和类方法),在访问控制允许的情况下,可以用类名.属性或类名.方法的形式访问类属性类似全局变量,在内存中只有一份,由该类所有实例共享例如:classCount{staticintcount;publicCount(){count++;//每次创建新的实例就将count加1}publicstaticintgetCount(){returncount;}}publicclassTestStatic{publicstaticvoidmain(String[]args){Countc1=newCount();System.out.println(Count.getCount());//打印1Countc2=newCount();System.out.println(Count.getCount());//打印2}}类属性图例c1c2c1实例c2实例count堆栈方法区类方法classCount{staticintcount;publicCount(){count++;//每次创建新的实例就将count加1}publicstaticintgetCount(){returncount;}}publicclassTestStatic{publicstaticvoidmain(String[]args){Countc1=newCount();System.out.println(Count.getCount());//直接用类名访问Countc2=newCount();System.out.
本文标题:JAVA程序员-SL275-2
链接地址:https://www.777doc.com/doc-2881200 .html