收藏 分销(赏)

B04继承与接口-1.ppt

上传人:精**** 文档编号:8915455 上传时间:2025-03-07 格式:PPT 页数:80 大小:410.04KB
下载 相关 举报
B04继承与接口-1.ppt_第1页
第1页 / 共80页
B04继承与接口-1.ppt_第2页
第2页 / 共80页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,4,章 继承与接口,4.1 继承,4.2 接口,4.3 特殊类,4.1,继承,4.1.1,继承的含义,4.1.2,子类的继承性的访问控制,4.1.3,子类对象的构造过程,4.1.4,子类的内存分布,4.1.5,子类对象的成员初始化,4.1.6,成员变量的隐藏,4.1.7,方法的重载与方法的覆盖,4.1.8 this,关键字,4.1.9 super,关键字,4.1.10,对象的上、下转型对象,4.1.1 继承的含义,类之间的继承关系是客观事物之间遗传关系的直接模拟,它反映了类之间的内在联系以及对属性和方法的共享,即子类可以沿用父类(被继承类)的某些特征。当然,子类也可以具有自己独立的属性和操作。例如,飞机、汽车和火车属于交通工具类,汽车类可以继承交通工具类某些属性和方法。,4.1.1 继承的含义,Java中继承实际上是一种基于已有的类创建新类的机制,是软件代码复用的一种形式。利用继承,我们首先创建一个共有属性和方法的一般类(父类或超类),然后基于该一般类再创建具有特殊属性和方法的新类(子类),新类继承一般类的状态和方法,并根据需要增加它自己的新的状态和行为。,父类可以是自己编写的类也可以是java类库中的类。Java不支持多重继承,即子类只能有一个父类。,4.1.1 继承的含义,如果要声明类B继承类A,则必须满足两个条件:(1)类A非final;(2)类A是public或类B与类A同包。如果这两个条件满足则可按照以下的语法声明类B:,class B extends A,.,这两声明表明B是A的子类,A是B的父类。,4.1.1 继承的含义,People,float,height,weight,age,;/,身高,体重,年龄,class Students extends People,String,stdno,;/,学号,说明:本实例中,类,Students,是类,People,的子类。,class Animal,public float weight;,public void eat(),class Mammal extends Animal,public,int,heartRate,;,public void breath(),class Cat extends Mammal,boolean,longHair,;,public void purr(),说明:本实例中,类,Mammal,是类,Animal,的子类,类,Cat,又是类,Mammal,的子类。,4.1.2 子类的继承性的访问控制,子类是基于父类创建的新类,它继承了父类的某些属性和方法,同时可以增添新的属性和方法。,Java,中子类不能访问父类的,private,成员,但可以访问其父类的,public,成员。父类的属性或方法使用其他访问控制符修饰时,子类对父类的属性或方法的继承将受到一定的限制,。,4.1.2 子类的继承性的访问控制,1子类和父类在同一包中的继承性,当子类和父类处在同一个包中时,子类可继承了其父类中不是private的成员变量和方法。继承的成员变量以及方法的访问权限保持不变。,2子类和父类不在同一包中的继承性,当子类和父类不在同一个包中时,子类只能继承父类的protected、public成员变量和方法,不能继承父类的友好变量和友好方法。继承的成员或方法的访问权限不变。,3子类对父类私有属性或方法的访问,子类不能直接访问从父类中继承的私有属性及方法,但可以使用公有(及保护)方法进行访问。,class A,public int a=4;,private int b=5;,protected int c=6;,public int outputB()return b;,public class B extends A,public int d;,public static void main(String args),B b=new B();,ba.testVisitControl();,public void testVisitControl(),System.out.println(a);/允许,System.out.println(b);/不允许,System.out.println(outputB();/允许,System.out.println(c);/允许,说明:,(1)子类B和父类A在同一包中;,(2)子类B能继承父类的public型属性a和protected属性c,因此操作System.out.println(a);和System.out.println(c);是符合逻辑的。,(3)子类B不能继承父类的private型属性b,因此对在B中未作任何申明的变量b的操作System.out.println(b);是不允许的。,(4)子类B不能继承父类的private型属性b,但可以通过公共方法对b进行访问,System.out.println(outputB();是符合逻辑的。,4.1.3 子类对象的构造过程,Java语言中,使用构造方法来构造并初始化对象。当用子类的构造方法创建一个子类的对象时,子类构造函数总是先调用(显式的或隐式地)其父类的某个构造函数,以创建和初始化子类的父类成员。如果子类的构造方法没有指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。然后执行子类构造函数。,4.1.3 子类对象的构造过程,子类对象的构造过程为:,(,1,)将子类中声明的成员变量或方法做为子类对象的成员变量或方法。,(,2,)将从父类继承的父类的成员变量或方法做为子类对象的成员变量或方法。,值得指出的是,尽管子类对象的构造过程中,子类只继承了父类的部分成员变量或方法。但在分配内存空间时,所有父类的成员都分配了内存空间。,4.1.4 子类的内存分布,在,JVM,中类被表示为一块内存区域,分别存放类名和类的静态成员,可以用如图,4-1(a),表示:,【,实例,4-5】,class A,static,int,svar1=10;,static,int,svar2=20;,static void sfun1(),int,var1=1;,int,var2=2;,void fun1(),类,A,的内存映像如图,4-1(b),ClassName,static var1,static fun1,static varN,static funM,类名,属性区,方法区,图,4-1,类的内存映像示意图,A,svar2,sfun1,20,svar1,10,(,a,),(,b,),4.1.4 子类的内存分布,在,JVM,中对象也被表示为一块内存区域,分别存放到对象所属类的引用和对象的成员,可以用图,4-2(a),表示:,【,实例,4-6】,A ref1=new A();,A ref2=ref 1;,对象,ref1,和,ref2,的内存映像如图,4-2(b),所示。,:,ClassRef,var1,fun1,varP,funQ,类的引用,属性区,方法区,图,4-2,对象的内存映像示意图,ref1,ref2,A,:A,var2,fun1,2,var1,1,(,a,),(,b,),4.1.4 子类的内存分布,【,实例,4-7】,class B extends A,static,int,svar2=30;,int,var2=3;,void fun1(),A ref1=new A();,B ref2=new B();,ref1=ref2;,对象,ref1,和,ref2,的内存映像如图,4-3,所示。,ref1,ref2,B,A/s,var2,sfun1,20,A/s,var,1,10,B/s,var2,30,A,A/svar2,sfun1,20,A/svar1,10,:B,A/,var2,fun1,2,A/,var,1,1,B/,var2,3,:A,var2,fun1,2,var,1,1,图,4-3,对象的内存映像示意图,4.1.5 子类对象的成员初始化,初始化规定及分类,子类对象的成员初始化之前必须完成父类或祖先类对象的成员的初始化,初始化的方式有两种:隐式初始化和显式初始化。,1,隐式初始化,当父类提供了默认的构造函数,且子类的构造函数中没有显式调用父类的其它构造函数,则在执行子类的构造函数之前会自动执行父类的构造函数,直到执行完,Object,的构造函数后才执行子类的构造函数。,4.1.5 子类对象的成员初始化,【,实例,4-8】,class A,int,x;,A()x=1;,class B extends A,int,y;,B()y=-1;,B,rb,=new B();,子类对象,rb,的隐式初始化过程如图,4-4,所示。,Constructors in Subclasses,new B(),A,Object,x=1;,y=-1;,y=0;,x=0;,调用,A(),调用,Object(),返回,返回,图,4-4,子类对象的隐式初始化,4.1.5 子类对象的成员初始化,2,显式初始化,可以在子类构造函数的第一条语句通过,super(),或,super(),调用父类的默认构造函数或特定签名的构造函数。,当父类没有提供默认构造函数时,即父类定义的构造函数都是有参的,则必须在子类构造函数第一条语句通过,super(),完成父类对象成员的初始化工作。,4.1.5 子类对象的成员初始化,【实例4-9】,class point,private,int,x,y;,point(int,x,int,y),this.x,=x;,this.y,=y;,class circle extends point,int,radius;,circle(int,r),radius=r;,4.1.5 子类对象的成员初始化,说明:在本实例中,构造方法circle(int r)存在错误,可作如下改正。,class circle extends point,int,radius;,circle(int,r,int,x,int,y),super(x,y);,radius=r;,4.1.6 成员变量的隐藏,当在子类中定义与父类中同名的成员变量时,子类就隐藏了继承的成员变量,即子类对象以及子类自己声明定义的方法操作与父类同名的成员变量。,【实例4-10】,class A,protected double y=2.13;,class B extends A,int y=0;,void g(),y=y+10;,System.out.printf(y=%dn,y);,class Example,public static void main(String args),B b=new B();,b.y=-20;,b.g();,4.1.6 成员变量的隐藏,说明:,在本实例中,子类B定义了整型成员变量y,隐藏了从父类A继承的double型变量y。该程序的运行结果如下:,y10,4.1.7 方法的重载与方法的覆盖,1,方法重载,方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完全相同;例如:,【,实例,4-11】,class point,int,x,y;,point(int,a,int,b)x=a;y=b;,point()x=-1;y=-1;,4.1.7 方法的重载与方法的覆盖,说明:,在本实例中,定义了两个名称均为point的构造方法,在需要使用point构造方法时,可通过参数个数来识别不同的构造方法。,注意事项:,方法重载的一个误区是靠返回值区别重载,即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的。,【,实例,4-12】,class A,int,x,y;,int,show(int,a)a,=a*2;return a;,double,show(int,b)b,=b*4;return b;,public class,reloadingExample,public static void main(String,args,),A a=new A();,int,i=1;,double d=1.0;,System.out.println(int,show()=+,a.show(i,);,System.out.println(double,show()=+,a.show(i,);,4.1.7 方法的重载与方法的覆盖,4.1.7 方法的重载与方法的覆盖,2,方法覆盖,方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。,3,方法重载与方法覆盖的区别,重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法的特征一定不完全相同。,覆盖则要求子类中的方法特征与父类定义的对应方法的特征完全一样,即这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。例如:,【实例4-13】,class point,int,x,y;,point(),this(0,0);,point(int,x,int,y),this.x,=x;,this.y,=y;,double area(),return 0;,class circle extends point,int,radius;,circle(int,r,int,x,int,y),super(x,y);,radius=r;,double area(),return,Math.PI,*radius*,radius,;,4.1.7 方法的重载与方法的覆盖,说明:,在本实例中,子类circle中的方法area()和父类point中的方法area()的特征相同,故子类的方法覆盖父类的方法。,【实例4-14】,class point,int,x,y;,point(),this(0,0);,point(int,x,int,y),this.x,=x;,this.y,=y;,double area(),return 0;,class circle extends point,int,radius;,circle(int,r,int,x,int,y),super(x,y);,radius=r;,double,area(float,z),return,Math.PI,*radius*,radius,;,4.1.7 方法的重载与方法的覆盖,说明:,在本实例中,子类,circle,中的方法,area(),和父类,point,中的方法,area(),的特征不相同,父类,point,中的方法,area(),含参数,z,,故子类的方法未能覆盖父类的方法,这时子类就出现两个方法具有相同的名字。,4.1.8 this关键字,基本使用说明:,this,只能用于与实例有关的代码块中,如实例方法、构造方法、实例初始化代码块或实例变量的初始化代码块等,,this,就代表当前或者正在创建的实例对象的引用,通常可以利用这一关键字实现与局部变量同名的实例变量的调用。在构造方法中还可以用,this,来代表要显式调用的其它构造方法。除此以外,使用,this,关键字都将引发编译时错误。,4.1.8 this关键字,1,在类的构造方法中使用,this,关键字,在构造方法内部使用,this,,代表使用该构造方法所创建的对象。,【实例4-15】,class Tom,int,n;,Tom(int,x),this.show,();,n=x;,this.show,();,void show(),System.out.println(n+n,);,public static void,main(String,args,),Tom,tom,=new Tom(10);,4.1.8 this关键字,说明:,在本实例中,构造方法Tom(int x)中出现了this,表示该对象在构造自己时调用了方法show()。运行结果为:,n0,n10,4.1.8 this关键字,此外,在构造方法内部使用,this,,可用于指代另外一个构造函数,但不能指代非构造函数。例如:,【,实例,4-16】,class point,int,x,y;,point()this(-1,-1);,point(int,a,int,b)x=a;y=b;,说明:在本实例中,构造方法,point(),中的,this,指代构造方法,point(int,a,int,b),。,4.1.8 this关键字,2,在类的实例方法中使用,this,关键字,在实例方法内部使用,this,,代表使用该方法的当前对象。,【实例4-17】,class A,int,x;,void fun(),this.x,=10;,this.g(this.x,);,void,g(int,x),System.out.println(x,=+x);,class ex1,public static void,main(String,args,),A a=new A();,a.fun,();,4.1.8 this关键字,说明:,在本实例中,实例方法fun中出现了this,this就代表使用fun的当前对象。因此,this.x表示当前对象的变量x,将10赋给该对象的变量x。this.g表示当前对象的方法g时,传递参数为this.x。通常情况下,可以省略成员变量(或方法)名字前面的“this.”。,4.1.8 this关键字,3,使用,this,区分成员变量和局部变量,如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。这时如果想在该方法内使用成员变量,成员变量前面的“,this.”,就不可以省略,如:,【,实例,4-18】,class point,int,x,y;,void,init(int,x,int,y),this.x,=x;,this.y,=y;,说明:,在本实例中,,this.x,和,this.y,是指类,point,的属性变量,x,和,y,,语句“,this.x,=x;”,和“,this.y,=y;”,等号右边的,x,和,y,则是和方法,init,()的形参,x,和,y,。,4.1.9 super关键字,super,只能用于与实例有关的代码块中,如实例方法、构造方法、实例初始化代码块或实例变量的初始化代码块等,,super,代表当前或者正在创建的实例对象的父类,通常可以利用这一关键字实现对父类同名属性或方法的调用。在构造方法中还可以用,super,来代表要调用的父类构造方法,以实现构造方法链的初始化。由于,Object,类为,Java,语言的根类,已经没有父类,因此,如果在,Object,类中使用了关键字,super,,将引发编译时错误。,4.1.9 super关键字,1使用super调用父类的构造方法,子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用并且必须使用关键字super来表示,而且super必须是子类构造方法中的第一条语句。这点在子类对象的构造过程一节已举例说明,在此不在赘述。,2使用super操作被隐藏的成员变量和方法,如果在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。,【实例4-19】,class A,int,x=2,y=3;,double add()return,x+y,;,class B extends A,int,x=20,y=30;,double add()return,super.x+super.y,;,double,addB,()return,x+y,;,double,addA,()return,super.add,();,【实例4-19】,class ex2,public static void,main(String,args,),A a=new A();,B b=new B();,System.out.println(b.add,=+,b.addB,();,System.out.println(a.add,=+,a.add,();,System.out.println(a.add,=+,b.addA,();,4.1.9 super关键字,说明:,在本实例中,子类,B,使用,super.x,和,super.y,调用父类,A,被隐藏的成员变量,x,和,y,,使用,super.add,()调用父类,A,被隐藏的方法,add,()。其结果如下:,b.add=50,a.add=5,a.add=5,4.1.10 对象的上、下转型对象,1,向上转型,向上转型是指将子类类型的引用赋值给其父类或祖先类类型的引用,赋值操作中包含了隐式的类型转换。,Object obj1=new String(“good”);/,对象的上转型,Object obj2=new Integer(100);/,对象的上转型,例如,类,B,是类,A,的子类。,A a,;,B b=new B,(),;,a=b;,4.1.10 对象的上、下转型对象,此时称对象a是子类对象b的上转型对象,对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。上转型对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法。上转型对象不能操作子类新增的方法和成员变量。将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。,4.1.10 对象的上、下转型对象,2,向下转型,向下转换是指将某类类型的引用赋值给其子类类型的引用,赋值操作必须进行显式(强制)的类型转换。,String str1=(String)obj1;/,对象的下转型,Integer int1=(Integer)obj2;/,对象的下转型,4.2,接口,4.2.1 abstract类,4.2.2 接口的含义,4.2.3 接口回调,4.2.4 接口与抽象类的异同,4.2.1 abstract类,用关键字,abstract,修饰类称为,abstract,类(抽象类)。如:,abstract class A,abstract,类不能用,new,运算符创建对象,必须产生其子类,由子类创建对象。若,abstract,类的类体中有,abstract,方法,只允许声明,而不允许实现,而该类的子类必须实现,abstract,方法,即重写父类的,abstract,方法。一个,abstract,类只关心子类是否具有某种功能,不关心功能的具体实现。具体实现由子类负责。,因此,抽象类的唯一目的是为子类提供公有信息,它是用来被继承的,抽象类不能创建对象。,4.2.2 接口的含义,Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。,使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口的声明和接口体。,4.2.2 接口的含义,1接口的声明,声明接口的语法如下:,interface /接口声明,接口体,接口名的命名规范与类相同,接口也可以指定所属的包。,接口的修饰符可以有以下几种:,(1)public:与类的public修饰符相同;,(2)abstract:通常被省略,因为接口中的方法都是抽象的;,(3)strictfp:通常并不能限制接口中方法的实现,一般不使用。,4.2.2 接口的含义,2接口体,接口体中包含常量定义和方法定义两部分。,(1)接口中的成员都是public的,不能指定其它的访问控制修饰符。,(2)常量定义。接口中属性的域默认是static final的,必须显式初始化。,(3)方法。只能提供方法头声明,不能提供实现,且除abstract外,不能使用其它修饰符。接口中的方法被默认是public和abstract的,接口在声明方法时可以省略方法前面的public和abstract关键字,但是,类在实现接口方法时,一定要用public来修饰。,(4)嵌套类和嵌套接口;,4.2.2 接口的含义,3,接口的多继承,接口支持多亲继承,可以在关键字,extends,后面跟多个接口的列表,中间用逗号隔开,如:,public interface SerializableRunnable extends,Runnable,子接口拥有所有父接口中声明的方法。子接口中的域将隐藏父接口中声明的同名域,被隐藏的父接口中的域必须通过父接口名访问。,子接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要。实现接口的类也必须实现此接口的父接口。,4.2.2 接口的含义,4接口的使用,一个类通过使用关键字implements 声明自己实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,如:,class A implements Printable,Addable,如果一个类实现某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。类实现的接口方法以及接口中的常量可以被类的对象调用。,如果父类实现了某个接口,则其子类也就自然实现这个接口。接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。以下例子给出了类是如何实现接口的。,【实例4-21】,interface C,public abstract,int,fun(int,x,int,y);,class A implements C,public,int,fun(int,x,int,y)return 2*(,x+y,);,class B implements C,public,int,fun(int,x,int,y)return,x*y;,public class Example,public static void,main(String,args,),A a=new A();,B b=new B();,System.out.println(长方形周长+a.fun(12,8);,System.out.println(长方形面积+b.fun(12,8);,4.2.2 接口的含义,说明:,在本实例中,接口,C,中方法,fun(),分别在类,A,和,B,中实现。类,A,方法,fun(),功能是计算长方形的周长。类,B,方法,fun(),功能是计算长方形的面积。,4.2.3 接口回调,接口回调,是指把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称作对象功能的接口回调。,不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。,【实例4-22】,interface,ShowMessage,void,show(String,s);/,接口中的方法默认都是public,class Car implements,ShowMessage,public void,show(String,s)/,在使用接口的类中要显示表示public,System.out.println(Car,=+s);,class Bicycle implements,ShowMessage,public void,show(String,s)/,在使用接口的类中要显示表示public,System.out.println(Bicycle,=+s);,【实例4-22】,public class,interfacecallbackExample,public static void,main(String,args,),ShowMessage,dm;/,声明接口变量,dm=new Car();/,接口变量中存放对象的引用,dm.show(奔驰,);/,接口回调,dm=new Bicycle();/,接口变量中存放对象的引用,dm.show(捷安特,);/,接口回调,4.2.3 接口回调,运行结果为:,Car=,奔驰,Bicycle=,捷安特,说明:在本实例中,,(,1,),ShowMessage,为接口,类,Car,和,Bicycle,使用接口,ShowMessage,,分别实现接口中的方法,show,。,(,2,)类,interfacecallbackExample,中,语句执行“,dm=new Car();”,或“,dm=new Bicycle();”,后将对对象的引用存放在接口变量,dm,中。,4.2.4 接口与抽象类的异同,接口和抽象类的相同点:,(,1,)都有空的方法,都必须在子类中实现这些方法。,(,2,)都不能用,new,关键字来创建这两种类型的对象。,(,3,)都可以具有继承关系。,(,4,)接口和类一样可以具有,public,属性。,4.2.4 接口与抽象类的异同,接口和抽象类的不同点:,(,1,)在抽象类中,空的方法必须加,abstract,关键字,而在接口中不需要。,(,2,)在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法。,(,3,)接口允许多继承,类仅支持单继承。,4.3,特殊类,4.3.1 final类131,4.3.2 内部类132,4.3.1 final类,final,类不能被继承,即不能有子类,如:,final class A,将一个类声明为,final,类一般是由于安全性考虑。,声明,ChessAlgorithm,类为,final,类,final class ChessAlgorithm .,4.3.1 final类,如果写下如下程序:,class BetterChessAlgorithm extends ChessAlgorithm ,编译器将显示一个错误,Chess.java:6:Cant subclass final classes:class ChessAlgorithm,class BetterChessAlgorithm extends ChessAlgorithm,1 error,4.3.1 final类,一旦一个方法被修饰为,final,方法,则这个方法不能被重写,即不允许子类通过重写隐藏继承的,final,方法。一般,对于一些比较重要且不希望子类进行更改的方法,可以声明为,final,方法。可防止子类对父类关键方法的错误重写,增加了代码的安全性和正确性,final,方法举例,class Parent,public Parent()/,构造方法,final int getPI()return Math.PI;/,最终方法,4.3.1 final类,说明,getPI(),是用,final,修饰符声明的终结方法,不能在子类中对该方法进行重载,因而如下声明是错的,Class Child extends Parent,public Child()/,构造方法,int getPI()return 3.14;/,重写父类中的终结方法,不允许,4.3.2 内部类,Java,语言支持在一个类中声明另一个类,即类中可以嵌套类。嵌套在其他类中的类称作内部类,而包含内部类的类成为内部类的外嵌类。,内部类同样可以声明自己的方法和成员变量,外嵌类把内部类看作是自己的成员。外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。不过,内部类的类体中不可以声明类变量和类方法。此外,外嵌类可以用内部类声明对象,作为外嵌类的成员。,【实例4-23】,class,CenterEast,String River=,千湖之省,!;,class China,float x=6.0f,y=10.0f;,HuBei,hubei,;/,内部类声明的对象,作为外嵌类的成员,。,China(),hubei,=new,HuBei,();,void fun(),System.out.println(这里是中国,);,hubei.showrate,();,【实例4-23】,class,HuBei,extends,CenterEast,/,内部类的声明,float z;,void,showrate,(),System.out.println(湖北是+River+占全国湖泊比例+z,);,void,countrate,(),z=,x/y,;,fun();,【实例4-23】,public class Example,public static void,main(String,args,),China,china,=new China();,china.fun,();,china.,hubei,.,countrate,();,4.3.2 内部类,结果为:,这里是中国,湖北是千湖之省!占全国湖泊比例0.0,这里是中国,湖北是千湖之省!占全国湖泊比例0.6,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服