




已阅读5页,还剩94页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,Java 初级,第六章 面向对象(下),2,主要内容:,this与super 构造方法的多态与继承 抽象类 接口 抽象类与接口 引用 类的其他相关内容,3,this与super,4,this,this 指代当前对象,主要应用场合: 在一些容易混淆的场合,如成员方法的参数名与数据成员同 名;成员方法的局部变量名与数据成员同名。 this.数据成员 this.成员方法 this(参数)引用重载的构造方法(见后节),5,this例1,public class Test int i; public Test(int i) this.i = i; /与方法参数名相同 public void otherMethod() int i=3; this.i = i+2; /与局部变量名相同 注意:this.i指的是类定义的属性i,而i指的是局部变量i。,6,this例2,class FighterPlane private String name; private int missileNum; private A a; public FighterPlane(String _name, int _missileNum) = _name; this.missileNum=_missileNum; public void setA(A _a) if (_a !=null) this.a = _a ; public String getName() return ; ,class A FighterPlane fp; public A(FighterPlane fpp) this.fp = fpp; fpp.setA(this); public void invoke() /发送消息给FighterPlane的对象 System.out.println(this.fp.getName(); public class Run public static void main(String args) FighterPlane ftp = new FighterPlane(“su35“,10); A a = new A(ftp); a.invoke(); ,7,super,super访问当前类的直接父类,主要应用场合: 子类的数据成员或成员方法与父类的数据成员或成员方法名 字相同时,当要调用父类的同名方法或同名数据成员时则可 用super来指明。 super.数据成员 super.成员方法(参数) super(参数)/调用父类构造函数,8,super例1,class A int x=4;int y=1; public void Printme() System.out.println(“x=“+x+“ y=“+y); System.out.println(“class name: “+getClass().getName(); public class AA extends A int x; public void Printme() int z=super.x+6; super.x = 5; super.Printme(); System.out.println(“I am an “+getClass().getName(); x=6; System.out.println(“z=“+z+“ x=“+x+“ super.x=“+super.x+“ y=“+y+“ super.y=“+y); public static void main(String arg) int k; A p1=new A(); AA p2=new AA(); p1.Printme(); p2.Printme(); ,9,super例1运行结果,运行结果如下:,x=4 y=1 class name: A x=5 y=1 class name: AA I am an AA z=10 x=6 super.x=5 y=1 super.y=1,10,super例1讲解,子类和父类定义了同名数据成员,子类继承了父类的x,自 己又定义了一个x,则会发生父类数据成员的隐藏。在子类 中用的x都是子类自己的,若要使用父类x,则必须用super.x。 子类在覆盖父类方法的同时,调用父类的super.Printme(),这 个方法中的成员变量均为父类的成员变量。super.Printme()中 的代码虽然调用父类代码,但其中的this指的是子类对象。,11,12,构造方法的多态与继承,13,构造方法的多态,构造方法的多态:重载和覆盖 一个类的若干个重载的构造方法之间可以相互调用。当一 个构造方法需要调用另一个构造方法时,可以使用关键字 this,同时这个调用语句应该是整个构造方法的第一个可执 行语句。 使用关键字this来调用同类的其它构造方法,优点同样是 以最大限度地提高对已有代码的利用程度,减少程序的维护 工作量。,14,构造方法的多态例1,class AddClass public int x=0,y=0,z=0; AddClass (int x) this.x=x; AddClass (int x,int y) /调用第一个构造方法 this(x); this.y=y; AddClass (int x,int y,int z) /调用第二个构造方法 this(x,y); this.z=z; public int add() return x+y+z; ,public class RunAddClass public static void main(String args) AddClass p1=new AddClass(2,3,5); AddClass p2=new AddClass(10,20); AddClass p3=new AddClass(1); System.out.println(“x+y+z=“+p1.add(); System.out.println(“x+y=“+p2.add(); System.out.println(“x=“+p3.add(); ,运行结果:x+y+z=10 x+y=30 x=1,15,构造方法的继承,构造方法的继承遵循以下的原则: 父类构造方法,子类可以在自己的构造方法中使用super来 调用,但必须是子类构造方法的第一个可执行语句。 若子类构造方法中没有显式调用父类构造方法,也没有用 this调用重载的其它构造方法,则在产生子类的对象时, 系统在调用子类构造方法的同时,默认调用父类无参构造 方法。若子类构造方法中显式调用了父类构造方法,或使 用了this,则不会默认调用父类无参构造方法。 综上两点:子类构造方法必定调用父类的构造方法。如果 不用super调用,必然隐含调用super()。,16,构造方法的继承例1,public class SonAddClass extends AddClass int a=0,b=0,c=0; SonAddClass (int x) super(x); a=x+7; SonAddClass (int x,int y) super(x,y); a=x+5; b=y+5; SonAddClass (int x,int y,int z) super(x,y,z); a=x+4; b=y+4; c=z+4; public int add() System.out.println(“super:“+super.add(); return a+b+c; public static void main(String args) SonAddClass p1=new SonAddClass (2,3,5); SonAddClass p2=new SonAddClass (10,20); SonAddClass p3=new SonAddClass (1); System.out.println(“a+b+c=“+p1.add(); System.out.println(“a+b=“+p2.add(); System.out.println(“a=“+p3.add(); ,运行结果如下: super: x+y+z=10 a+b+c=22 super: x+y+z=30 a+b=40 super: x+y+z=1 a=8,17,构造方法的继承例2,class Pare int i; Pare()i=6; class Construct extends Pare Construct() Construct(int num) public static void main(String args) Construct ct = new Construct(9); System.out.println(ct.i); ,注:如果仅含有带参数的构造方法,没有无参数构造方法,因为本子类Construct自动调用super(),因而程序会出现编译问题。,18,子类对象实例化的过程,为对象分配内存空间,对成员变量进行默认的初始化,注:局部变量必须进行显示初始化。,19,绑定构造方法,将new中的参数传递给构造方法的形式参数。 调用this或super语句(二者必居其一,不能同时存在),有了this, 则第四步被省略,但有了super则不省略。 进行实例变量的显式初始化操作, 如: public class A int value=4; /显式初始化 B b = new B(); /显式初始化,注:B为一另一个类 执行当前构造方法的方法体中的程序代码。如果本类是applet,则init()方法在构造方法调用后执行。,见下图,20,对象成员变量初始化流程图,21,class Construct int i=1; Construct(int num,int i) this.i=i; public static void main(String args) Construct ct=new Construct(2,3); System.out.println(ct.i); ,子类对象实例化例1,22,class Pare int i =3; Pare() class Construct extends Pare int i=8; Construct() Construct(int num)this();/i=num; int getSuper()return super.i; public static void main(String args) Construct ct = new Construct(9); System.out.println(ct.i); System.out.println(ct.getSuper(); ,子类对象实例化例2,23,抽象类,24,抽象类的定义,抽象(abstract)类的概念:用abstract修饰的类称为抽象类,用abstract 修饰的成员方法称为抽象方法。 抽象类和具体类的关系就是一般类和特殊类之间的关系,是 继承和被继承的关系。 抽象类不能创建对象,创建对象由具体子类来实现,但可以 有声明,声明能引用所有具体子类的对象。 抽象类中可以有零个或多个抽象方法,也可以包含非抽象方 法。只要有一个抽象方法,类前就必须有abstract修饰。若没 有抽象方法,类前也可有abstract修饰。,25,对于抽象方法,在抽象类中只指定方法名及类型,而不写实现 代码。抽象类必定要派生子类,若派生的子类是具体类,则具 体子类中必须实现抽象类中定义的所有抽象方法(覆盖); 若子类还是抽象类,如果父类中已有同名abstract方法,则子 类中就不能再有同名的抽象方法了。 在抽象类中,非抽象方法可以调用抽象方法。 abstract不能与final并列修饰同一个类(产生逻辑矛盾); abstract 不能与private ,static(因为static修饰的方法必然被直 接调用),final或native并列修饰同一个方法;abstract 类中不能 有private成员这些因为抽象类必然要有子类。,26,抽象类的一个例子,abstract class Shape abstract double area(); /抽象父类 class Circle extends Shape private int r; Circle(int r) this.r=r; public double area()return 3.14*r*r; class Rectangle extends Shape public int width,height; Rectangle(int w,int h) width=w;height=h; public double area() return width*height; ,public class Shapes public static void print_area(Shape s) double area = s.area(); System.out.println(s.getClass().getName()+“:“+area); public static void main(String arg) double shape_area=0; Shape c1=new Circle(2); Shape c2=new Circle(3); Shape r1=new Rectangle(2,3); Shape s1=new Shape3; s10=c1; s11=c2;s12=r1; for (int i=0;i3;i+)print_area(s1i); ,27,抽象类的产生过程,抽象类形成的思维过程:客观事物对象类抽象类。 如:矩形、三角形、圆形类的属性和方法如图 :,28,抽象类的产生过程(Cont),对以上三类进行抽象 :,29,抽象类的产生过程(Cont),程序:,import java.awt.*; import java.applet.*; abstract class Shapes protected int x,y,k; protected double m; public Shapes(int x,int y,int k,double m) this.x=x; this.y=y; this.k=k; this.m=m; abstract public double getArea(); abstract public double getPerimeter(); ,30,抽象类的产生过程(Cont),class Circle extends Shapes public double getArea() return(m* m *Math.PI); public double getPerimeter() return(2*Math.PI* m); public Circle(int x,int y,int width) /m充当了半径,k充当了直径 super(x,y, width, width/2.0); ,class Rectangle extends Shapes public double getArea() return(k*m); public double getPerimeter() return(2*k+2*m); public Rectangle(int x,int y,int width,int height) super(x,y,width,height); ,31,抽象类的产生过程(Cont),class Triangle extends Shapes public double getArea() return(Math.sqrt(m*( m-k)*( m-x)*(m-y); public double getPerimeter() return(k+x+y); public Triangle(int baseA,int baseB,int baseC) super(baseA, baseB, baseC,0); /m充当了周长的一半 m= (baseA+ baseB+ baseC)/2.0; ,32,抽象类的产生过程(Cont),public class RunShape extends Applet Rectangle rect=new Rectangle(5,15,25,25); Triangle tri=new Triangle(5,5,8); Circle cir =new Circle(5,90,25); public void paint(Graphics g) /绘制矩形,输出矩形的面积和周长 g.drawRect(rect.x,rect.y,rect.k,(int)rect.m); g.drawString(“Rect Area:“+rect.getArea(),50,35); g.drawString(“Rect Perimeter:“+rect.getPerimeter(),50,55); /输出三角形的面积和周长 g.drawString(“Triangle Area:“+tri.getArea(),50,75); g.drawString(“Triangle Perimeter:“+tri.getPerimeter(),50,95); /绘制圆,输出圆的面积和周长 g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k); g.drawString(“Circle Area:“+cir.getArea(),50,115); g.drawString(“Circle Perimeter:“+cir. getPerimeter(),50,135); ,33,运行结果:,34,可引用具体子类对象,public class RunShape extends Applet Rectangle rect=new Rectangle(5,15,25,25); Triangle tri=new Triangle(5,5,8); Circle cir=new Circle(5,90,25); /增加两个方法,注意抽象类的声明为s,ab为字符串输出的坐标。 private void drawArea(Graphics g,Shapes s,int a,int b) g.drawString(s.getClass().getName()+” Area”+s.getArea(),a,b); private void drawPerimeter (Graphics g,Shapes s,int a,int b) g.drawString(s.getClass().getName()+” Perimeter”+s.getPerimeter(),a,b); public void paint(Graphics g) g.drawRect(rect.x,rect.y,rect.k,(int)rect.m); drawArea (g,rect,50,35); drawPerimeter(g,rect,50,55); drawArea (g, tri,50,75); drawPerimeter(g,tri,50,95); g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k); drawArea (g, cir,50,115); drawPerimeter(g,cir,50,135); ,35,可引用具体子类对象(Cont),36,抽象类设计注意,在设计抽象类的具体子类时,追求它们在实现抽象方法方面所表 现的不同性。例如作为shapes,当s引用矩形时,返回矩形周长 和面积,当引用三角形时,返回三角形周长和面积,当引用圆时 返回圆周长和面积等等。作为抽象类的具体实现者,每个子类必 须给出其周长和面积的具体计算方式。 在确定抽象类的抽象方法时,一定要确保这些抽象方法就是同类 对象共同行为的抽取,否则,抽象方法的设计不当,会为继承这 个抽象类的体系带来不利影响。因为抽象类中的任何改动都将关 系到整个类体系的改变,所以抽象类中的信息应尽可能和研究对 象的本质相关。,37,抽象类设计不当的举例,abstract class Door public abstract void open(); public abstract void close(); public abstract void alarm(); 报警门子类的代码实现如下: class AlarmDoor extends Door public void open() public void close() public void alarm() 但其它类也要继承Door,由于继承关系,必须实现一个和它不相干的方法alarm,这显然对于其它子类的实现带来不便。,38,接口(interface),39,接口的定义,接口的两种含义: 可以被引用调用的方法(public方法或同包中的protected方法或默认方法); 另一种是同“类”概念地位相当的专有概念interface, interface是方法说明的集合。,40,interface声明格式,public interface 接口名extends 父接口名列表 /静态常量数据成员声明 publicstaticfinal 域类型 域名 = 常量值 /抽象方法声明 publicabstract返回值 方法名(参数列表)throws 异常 ,41,定义接口要注意几点,接口定义用关键字interface,而不是用class,interface前的修饰符要么为public,要么为缺省。 接口定义的数据成员全是static final(静态常量)。即使没有修饰符,其效果也等效,访问级别要么为public,要么为缺省。 接口中没有构造方法;所有成员方法都是抽象方法(与抽象类有所不同)。即使没有修饰符,其效果完全等效,访问级别要么为public,要么为缺省。注:方法前不能修饰为final。 接口具有继承性,可通过extends关键字声明接口的父接口。,42,Sofa.java interface Sittable void sit(); interface Lie void sleep(); interface Chair extends Sittable interface Sofa extends Sittable, Lie ,通过接口实现多继承,43,接口实现要注意几点,在类中,用implements关键字来实现接口。一个类可以实现多个接口,在implements后用逗号隔开多个接口的名字。一个接口也可被多个类来实现。 接口的实现者可以继承接口中定义的常量,其效果等效于在这个实现类当中定义了一个静态常量。 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致。,44,如果实现接口的类是abstract类,则它可以不实现该接口的所有方法。但对于抽象类的任何一个非抽象的子类而言,接口中的所有抽象方法都必须实现。这些方法体可以来自抽象的父类(被子类继承),也可以来自子类自身的实现,这主要体现了非抽象类中不能存在抽象方法的原则。 接口的抽象方法的访问限制符如果为缺省或public时,类在实现方法时,必须显式使用public修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围。,45,Sofa.java interface Sittable void sit(); interface Lie void sleep(); class Sofa implements Sittable, Lie public void sit() public void sleep() ,接口实现例 1,46,接口实现例 2,interface Parent (static final) int i=1; interface Son extends Parent (static final) int j=2; public abstract void test(); ,public class Te implements Son public void test() System.out.println(i); System.out.println(j); public static void main(String args) Te t = new Te(); t.test(); ,程序执行结果为1和2,47,接口实现例 3(洗衣机),定义接口(洗衣机的功能) interface Washer public abstract void startUp(); /启动 public abstract void letWarterIn(); /进水 public abstract void washClothes(); /洗衣 public abstract void letWarterOut(); /排水 public abstract void stop(); /停止 ,48,实现接口(假定有一个叫玫瑰牌的洗衣机,实现了所有接口,且自己还独有一项功能叫“脱水”),class RoseBrand implements Washer public void startUp() System.out.println(“startUp“); public void letWarterIn() System.out.println(“letWarterIn“); public void washClothes() System.out.println(“washClothes“); ,public void letWarterOut() System.out.println(“letWarterOut“); public void stop() System.out.println(“stop“); /脱水 public void dehydrate() System.out.println(“dehydrate “); ,49,使用接口,public class Consumer public static void main(String args) Washer w = new RoseBrand(); w.startUp(); w.letWarterIn(); w.washClothes(); w.letWarterOut(); w.stop(); /w.dehydrate ();通过接口调用实现类独有方法时会报错 ,50,另外:当洗衣功能的实现者在启动环节进行了革新,如:,public class RoseBrand implements Washer public void startUp() System.out.println(“prepare“); System.out.println(“startUp“); 。 注:由于接口定义没有发生任何变化,所以Consumer中 的代码不用进行变动。,51,接口的作用,在团队开发中,当功能没 有实现和使用前,先定出 接口,再进行功能的实现 以及使用,接口(说明者) 从而扮演将实现者和使用 者有机联系到一起的角色。,52,作用:将那些带有集合特点的类中的节点加入到当前LinkedList中 构成当前链表对象的节点。 方法描述: 第一个为index,含义为链表中节点的相对位置; 第二个为Collection(接口),定义集合类的一些特征; 方法的内容如下 public boolean addAll(int index, Collection c) int numNew = c.size(); 调用此方法时,第二个参数可以为Collection的所有实现类对 象,共有十一种可能(见下页),它们都有size()方法。,例 4(java.util.LinkedList中addAll方法),53,Collection直接实现类有(这些类还有相应的子类): AbstractCollection、AbstractList、AbstractSet、ArrayList、BeanContextServicesSupport、BeanContextSupport、HashSet、LinkedHashSet、LinkedList、TreeSet、Vector。,若没有Collection接口,LinkedList的addAll方法就要这样写: public boolean addAll(int index, AbstractCollection c) public boolean addAll(int index, AbstractList c) public boolean addAll(int index, AbstractSet c) public boolean addAll(int index, ArrayList c) 相对于上面的一个方法,这样实现在编程思想上显得十分笨 拙。因此,在面向对象设计中,应尽量面向抽象类和接口编程。,54,接口在Java事件处理中的作用,JDK1.2后,类型改为事件监听者模式(将事件发生对象与事件处理对象分开):,55,如:在java.awt.TextField中输入内容后回车,系统自动产生一个事件ActionEvent,谁来处理这个事件呢? 哪个类实现了ActionListener 中的actionPerformed(ActionEvent e)方法,并在TextField进行了注册,哪个类就是监听者.,JDK中定义了一个ActionListener接口,其中只有一个方法,56,Java事件处理例1,import java.applet.*; import java.awt.*; import java.awt.event.*; public class myApplet extends Applet implements ActionListener private TextField input; private double d=0.0; public void init() input = new TextField(10); add(input); input.addActionListener(this);/注册 public void paint(Graphics g) g.drawString(“您输入了数据“+d,10,50); public void actionPerformed(ActionEvent e) d=Double.valueOf(input.getText().doubleValue(); repaint(); ,57,myApplet.html: ,Java事件处理例1运行结果,58,Java事件处理例1浏览器运行结果,在浏览器中的执行效果,59,import java.applet.*; import java.awt.*; import java.awt.event.*; class Listener implements ActionListener private myApplet mya; public Listener(myApplet a) this.mya = a; public void actionPerformed(ActionEvent e) mya.d=Double.valueOf(mya.input. getText().doubleValue(); mya.refresh(); /end Class,public class myApplet extends Applet public TextField input; public double d=0.0; public void init() input = new TextField(10); add(input); input.addActionListener(new Listener(this); public void paint(Graphics g) g.drawString(“您输入了数据“+d,10,50); public void refresh() repaint(); /end Class,Java事件处理例2,60,程序结构,运行结果,61,抽象类与接口,62,抽象类与接口相同点,二者都不能实例化,但都可以有自己的声明; 并能引用子类或实现类对象; 都有抽象方法,注:抽象类可以没有抽象方法。,63,抽象类可以有变量属性,接口则不能必须为静态常量。 抽象类可以有具体方法,但接口不能接口必须全部为抽象方法。所以,在抽象模型中需要有变量属性或具体方法存在时,应该选择抽象类。 抽象类是一个类,需要子类去实现,它们之间的关系是继承关系;而接口不是类,它需要类去实现,实现类和接口之间是实现与被实现的关系。,抽象类与接口不同点,64,对Door进行抽象认识,如果我们认为Door都应有一个名称属性和 开关的抽象行为,最好将门定义为一个抽象类,因为门的名称属 性是个变量,而接口只允许定义静态常 abstract class Door private String name; public abstract void open(); public abstract void close(); ,抽象类与接口例1,65,interface Door public abstract void open(); public abstract void close(); ,在新的子接口NewDoor中增加抽象方法,可新编写它的实现类和使用类,即保证了原系统的稳定,又对程序进行了扩展。所以,当抽象模型中既无变量属性,也无具体方法,应选择接口较好。,抽象类与接口例2,继承Door接口,编写一个新子接口: interface NewDoor extends Door public abstract void installCriterion (); ,66,抽象类和接口可以配合,实现在增加抽象方法的情况下,对 原系统影响最小。 abstract class Door public abstract void open(); public abstract void close(); class CriterionDoor extends Door implements Criterion public void open() public void close() public void installCriterion () 保持了原先继承Door的类和使用Door接口的类的稳定,同时又 增加了代表新功能的抽象方法 。,interface Criterion public void installCriterion (); ,抽象类与接口联系,67,引 用,68,引用的性质,引用如何形成:先声明,后赋予对象,成为引用。 抽象类声明进行引用有什么特点? 抽象类声明可以引用所有具体子类对象,此概念可以推广到所有具有父子关系的类,以及接口和实现类。 引用可以替换吗? 替换是有原则的:父类引用可以指向子类对象,子类声明不能引用平行级别的其它类的对象,也不能引用父类对象。,69,父类声明和子类声明引用同一个子类对象有什么区别? 父类声明是从父类的角度去引用对象,子类声明是从子类角度引用对象。父类引用子类对象时,可以经过显式的转化赋给子类的声明,但子类的引用赋值给父类的声明则不需要。 接口声明进行引用有什么特点? 只能引用实现类对象的接口方法。,见下例,70,A a = new A(); a = new A1(); A1 a1= (A1)a ; a = new A2(); A a= a1; 此时a与a1共同引用了A1对象,但是a只能引用A1对象中继承A类的属性和方法,而不能引用A1类自己定义的成员。 A1 a1 = new A2(); /error!A1与A2为平行类,不能互相引用 A1 a1 = new A(); /error!子类声明不能引用父类对象。,假定A为具体类,71,引用举例,interface Animal void soundOff(); class Elephant implements Animal public void soundOff() System.out.println(“Trumpet“); class Lion implements Animal public void soundOff() System.out.println(“Roar“); public void hunt() System.out.println(“Hunt“); ,class Alpha static Animal get( String choice ) if ( choice.equalsIgnoreCase(“meat eater“) return new Lion(); else return new Elephant(); public static void main(String args) Lion l = (Lion)Alpha.get(“meat eater“); ,72,引用比较,class Uncle class Pare class Pare1 extends Pare class Pare2 extends Pare1 class Pare3 extends Pare2 public static void main(String args) Uncle u = new Uncle(); Pare p = new Pare(); Pare1 p1 = new Pare1(); Pare2 p2 = new Pare2(); if ( p instanceof Pare) System.out.println(“p instanceof Pare“); if (!( p1 instanceof Pare) System.out.println(“p1 not instanceof Pare“); else System.out.println(“p1 instanceof Pare“); if ( p2 instanceof Pare) System.out.println(“p2 instanceof Pare“); if ( p1 instanceof Pare1) System.out.println(“p1 instanceof Pare1“); ,instanceof的用法:判断某个对象是否为某个类的可引用实例。,73,if ( p2 instanceof Pare1) System.out.println(“p2 instanceof Pare1“); if ( p1 instanceof Pare2) System.out.println(“p1 instanceof Pare2“); else System.out.println(“p1 not instanceof Pare2“); /*if (p instanceof Uncle) System.out.println(“p instanceof Uncle“); else System.out.println(“p not instanceof Uncle“);*/ if (null instanceof String) System.out.println(“null instanceof String“); else System.out.println(“null not instanceof String“); /end main /end class 输出结果为:,注: instanceof是运算 符,比较结果有三种, true、false、语法错误 (如例中注释掉代码)。 若对比较结果取反 必须加() ,如上例的if (!( p1 instanceof Pare)。,74,equals方法:equals方法是object的方法,因此,所有类可以利用它比较本引用和某个引用是否指向同一对象。,class Pare class Pare1 extends Pare class Pare2 public static void main(String args) Pare p = new Pare(); Pare1 p1 = new Pare1(); Pare pp = p1; if (p1.equals(pp) System.out.println(“p1与pp引用相同“); else System.out.println(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数控线切割操作工应知考核试题及参考答案
- 2025年教育行业教育信息化建设报告:教育信息化建设策略与实施
- 2025年教师信息技术与课程整合应用研究报告
- 2025年文化与娱乐产业跨界合作案例分析报告
- 2025年物联网设备安全漏洞应对与防护策略深度解读报告
- 押题宝典执业药师资格证之《西药学专业二》试题附答案详解【b卷】
- 解析卷沪科版9年级下册期末试题含答案详解(考试直接用)
- 2025年农业科技产品区域代理合作协议书
- 2025年度酒店客房清洁外包服务承包合同
- 2025年度高品质桶装水配送服务及运输合作协议
- 汽车产品初期流动管理计划
- 《战略资源稀土》课件
- 《过程审核讲义》课件
- 中医内科学虚劳培训课件
- 人教版新目标九年级上英语教学计划
- DB41T 2086-2020 加油加气站内电动汽车充电设施建设技术规范
- 峥嵘岁月 课件-2024-2025学年高中音乐人音版(2019) 必修 音乐鉴赏
- GB 21258-2024燃煤发电机组单位产品能源消耗限额
- DB34T 4379-2023 农村房地一体不动产确权登记技术规程
- 数字媒体艺术史全册完整教学课件
- 电力建设施工技术规范 第5部分:管道及系统-DLT 5190.5
评论
0/150
提交评论