您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 第5章 访问控制、继承、多态1
第5章访问控制、多态、继承、包和接口一.访问控制二.重载三.继承四.多态五.包和接口(一)访问控制——类的访问控制1.同一个java程序文件中的所有类都在同一个包内2.多个java文件若声明在同一个pakage下也属于同一个包3.处于同一个包内的类是彼此可见的(即可以直接互相调用的),而不同包之间的类,一般是不可见的,只有声明为public的类才可以被访问和调用。类1类2类3类4是类1的子类包1包2(一)类的访问控制//Chp5.javapackageacl;importjava.lang.*;classArea{publicdoublelon,wid;publicdoublearea(doublex,doubley){lon=x;wid=y;returnx*y;}}classTest{voidfun(){Chp5cc=newChp5();Areaaa=newArea();}}publicclassChp5{publicstaticvoidmain(Stringargs[]){Areass=newArea();doublez=ss.area(1,2);}}Chp5.java,C3.java位于同一个工程下面,但不属于一个包//C3.javaimportacl.*;publicclassC3{Chp5ss5;//Areass;//acl.Area类不是public的,无法从外部包对其访问}1.缺省类访问控制——只能被同一个包内的类所使用如Area2.Public类:公共类,可以在任何其它类中(无论是否在同一个包)使用,如Chp53.但如是不在同一个包,要import该包或类Java规定,一个java文件中有且仅有一个与java文件名同名的public类(二)成员的访问控制问题:某类对其它类整体是可见的如某类默认的访问控制对同一包内的类或public类被其它包内的类访问该类所有数据成员和成员方法也都可见了么?——还取决与该类的成员的修饰符成员的最终访问控制=类的可见性+成员的可见性成员的访问控制public公有的private私有的protected保护的(1)public访问控制只有public类的public数据成员/方法才是任何类都可以访问的建议:若希望某个类作为公共工具供其它的类和程序使用,应把该类和类内的某个方法声明为publicpublic类+public方法packagejava.lang;publicfinalclassString{publicString(){}publicStirngtoUpperCase(){…}}//Chp5.javapackageacl;importjava.lang.*;classArea{publicdoublelon,wid;publicdoublearea(doublex,doubley){lon=x;wid=y;returnx*y;}}classTest{voidfun(){Chp5cc=newChp5();Areaaa=newArea();}}publicclassChp5{publicstaticvoidmain(Stringargs[]){Areass=newArea();//私有类ss可以被同一包中的其它类使用doublez=ss.area(1,2);}}以下Chp5.java,C3.java两个文件位于同一个工程下面,但不属于一个包privatedoublelon,wid;//System.out.print(ss.lon+ss.lon);//错!若lon为私有的,类外不能访问(2)private访问控制•private的数据成员和方法只能被该类自身访问和修改,•不能被其它类和子类所访问classP1{privateintn=9;//私有数据成员nintnn;//默认数据成员P1(){nn=n++;}//可以被该类的对象自身访问和修改voidma(){System.out.println(“n=”+n);//可以被该类的对象自身访问}}publicclassc5_3extendsP1{publicstaticvoidmain(String[]args){P1m1=newP1();m1.ma();//对!可引用P1类自身的成员方法System.out.println(m1.nn=+m1.nn);//System.out.println(m1.n=+m1.n);//错,不能引用父类的私有成员}}c5_3.java用private修饰的数据成员不能被子类访问(3)protected访问控制(3)protected访问控制主要用于继承,特别是允许其它的子类可以访问父类的时候Protected可以被三种类引用:该类自身——同private——类外对象不能同一个包内的其它类其它包内的该类的子类//Chp5.javapackageacl;importjava.lang.*;classArea{privatedoublelon,wid;publicdoublearea(doublex,doubley){lon=x;wid=y;returnx*y;}}classTest{voidfunTest(){Chp5cc=newChp5();Areaaa=newArea();}}publicclassChp5{publicstaticvoidmain(Stringargs[]){Areass=newArea();doublez=ss.area(1,2);Testt=newTest();t.funTest();}}以下Chp5.java,C3.java两个文件位于同一个工程下面,但不属于一个包protectd例子protectedvoidfun(){}cc.fun()//C3.javaimportacl.Chp5;publicclassC3{Chp5ss5;//Areass;//acl.Area类不是public的voidfunTest(){ss5=newChp5();//ss5.fun();//C3不是Chp5子类,无权访问fun()}}classc4extendsChp5{voidfunTest(){fun();//C4是Chp5的子类可直接访问父类的fun(),}}二.方法的重载问题的引出:2个int的数相加add(int,int)2个double数相加addDouble(doubledouble)3个int的数相加add3(int,int,int)能不能聪明些呢?重载:多个同名的方法,参数个数和类型不同编译器根据方法调用时候实际参数的个数和类型,选择所对应的重载方法importjava.awt.*;importjava.applet.*;publicclassc5_5extendsApplet{intadd(inta,intb){//重载的方法1return(a+b);}doubleadd(doublex,doubley){//重载的方法2return(x+y);}doubleadd(doublex,doubley,doublez){//重载的方法3return(x+y+z);}publicvoidpaint(Graphicsg){g.drawString(Sumis:+add(8.5,2.3),5,10);g.drawString(Sumis:+add(21,38),5,30);g.drawString(Sumis:+add(8.5,2.3,8.5+2.3),5,50);}}重载例c5_5.java运行结果如下:Sumis:10.8Sumis:59Sumis:21.6延伸思考:复数的加法呢?运输工具轮船汽车飞机载重汽车公共汽车货轮客轮空中加油机客机父类子类三.继承继承:同类事物具有共性抽取其共性一般类每个事物又具有特殊性特殊类特点B具有父类A除private外全部属性和方法,又具有自己的属性和方法优点拿来主义,复用特殊类中不用再重复定义一般类中已经定义好的东西AB父类、基类、超类、一般类子类、派生类、特殊类(二)继承的特征1.继承关系是传递的2.清晰地体现相关类之间的层次3.提供了复用4.Java不支持多继承,多继承是由接口实现的单继承:只有一个父类多继承:超过两个父类ABC学生本科生在职研究生研究生教师extends表面继承关系classA{}classBextendsA{}子类可以从父类那里继承所有非private的属性和方法若一个类没有显式定义父类——缺省是系统object的子类AB(1)成员的继承(子类继承父类、并可以访问非private数据、方法)c5_6.javaclassA1{intx=25;privateintz;//不能被子类继承的私有数据成员z}classc5_6extendsA1{publicstaticvoidmain(String[]argS){c5_6p=newc5_6();//创建了子类的对象System.out.println(p.x=+p.x);//继承的数据成员//System.out.println(p.z=+p.z);//错,不能继承private修饰的z}}A1+x-zc5_6+main+testp.test(30)}voidtest(intx1){x=x1;System.out.println(x=+x);}p.x=25x=30publicvoidsetz(intz1){z=z1;}//私有变量的存取方法publicgetz(){returnz;}setz(x1+10);//继承来的方法System.out.println(A1::z=+getz());A1::z=40例:c5_8.java子类可以继承父类的非私有成员方法classA1{intx=0,y=1;voidMyp(){System.out.println(x=+x+y=+y);}privatevoidPrintme(){System.out.println(x=+x+y=+y);}}publicclassc5_8extendsA1{publicstaticvoidmain(Stringarg[]){intz=3;c5_8p1=newc5_8();p1.Myp();//p1.Printme();错,不能继承父类的private方法}}/*运行结果:x=0y=1(2)成员的隐藏与覆盖数据成员的隐藏(hidding)子类的成员变量与父类的成员变量同名时,该父类的成员变量被隐藏例成员方法的覆盖(override)子类覆盖父类方法时,应与父类同方法名、同返回值类型、和同参——否则成了重载!二者注意:数据隐藏:子类隐藏父类的同名数据成员,而其它父类同名的数据成员在子类对象中仍占有自己独立的内存空间方法覆盖:父类方法在子类对象中不复存在,其空间被子类覆盖方法所占用Person#name#age#addresssetPerson()StudentaddressSnodepartmentsetStudent()classPerson{protectedStringname;protectedintage;protectedStringaddress;publicvoidsetPerson(Stringna,intag,Stringad){name=na;age=ag;address=ad;}}classStudentextendsPerson{Stringaddress;//子类定义同名数据变量Stringsno;Stringdepartment;publicvoidsetStudent(Stringna,intag,Stringad,Stringad1,Stringno,Stringde){setPerson(na,ag,ad);//调用父类的方法设置基本信息address=ad1;//此address为子类的sno=no;department=de;}}publicclassStudent
本文标题:第5章 访问控制、继承、多态1
链接地址:https://www.777doc.com/doc-3646823 .html