当前位置:编程学习 > JSP >>

Java how to program(Third Edition)——我的java手记(四)

答案:

第九章 面向对象的编程

1.java不支持多重继承(像在C++语言中那样),但它支持“接口”概念。接口使java获得了多重继承的许多优点,屏弃了相应的缺点。
2.子类可以访问其超类的public,protected和超类的包访问成员(即无权限修饰符的成员,且和它的超类在同一个包中),如果超类不允许通过继承的方式产生的子类访问它的某些成员,那么它必须以private方式声明该成员。超类的public,protected成员将成为子类的public,protected成员。子类不能继承超类的构造函数但子类的构造函数可以通过super引用来调用超类的构造函数。
3.对访问protected成员的保护限制介于对访问public成员的保护限制和对访问private成员的保护限制之间。只有超类的方法、子类的方法以及同一个包内的其他类的方法,才能访问超类的protected成员(protected成员可以进行包访问)。
4.实例分析
1)源代码
//超类Point2的定义point2.java
package Point;

 
 
public class Point2 {
  protected int x,y;

  //no-argument constructor,mast be included in the superclass,or will incur the compile error;

  public Point2() {
    setPoint(0,0);
  }
  //constructor
  public Point2(int a,int b)
  { setPoint(a,b);}
  public void setPoint(int a,int b)
  {x=a;y=b;}
  public int getX()
  {return x;}
  public int getY()
  {return y;}
  public String toString()
  {return "["+x+","+y+"]";}
}
//子类Circle2的定义;circle2.java
package Point;

 
 
public class Circle2 extends Point2{
  protected double radius;
//no-argument constructor
  public Circle2() {
    setRadius(0);
  }
//constructor
  public Circle2(double r,int a,int b){
    super(a,b);  //explict call to superclass constructor;
    setRadius(r);
  }
  public void setRadius(double r)
  {radius=(r>=0.0?r:0.0);}

 
 
  public double getRadius(){return radius;}

 
 
  public double area(){return Math.PI *radius*radius;}

 
 
  public String toString()
  {return "Center="+super.toString()+";Radius="+radius;}//call to superclass toString;
}
//测试主程序;InheritanceTest2.java
package Point;
import java.text.DecimalFormat ;
import javax.swing.JOptionPane ;

 
 
public class InheritanceTest2{
  public static void main(String arg[]){
    Point2 pointRef,p;
    Circle2 circleRef,c;
    String output;

 
 
    p=new Point2(30,50);
    c=new Circle2(2.7,120,89);

 
 
    output="Point p:"+p.toString ()+"\nCircle:"+c.toString ();

 
 

    pointRef=c;  //assign circle to pointRef;

 
 

    output+="\n\nCircle c(via pointRef):"+pointRef.toString ();  /*Polymorphism and dynamic binding,so output the result using the funcion toString of Circle2 */

/*use downcasting(casting a superclass reference to a subclass data type)to assign pintRef to circleRef*/

    circleRef=(Circle2)pointRef;

 
 
    output+="\n\nCircle c(via circleRef):"+circleRef.toString ();

 
 
    DecimalFormat precision2=new DecimalFormat("0.00");

 
 
    output+="\nArea of c(via circleRef):"+
            precision2.format (circleRef.area ());

 
 
    if(p instanceof Circle2){  //judge if the object p is a object of Circle2;
      circleRef=(Circle2)p;
      output+="\n\ncast successfull";
      }
    else
      output+="\n\np does not refer to a circle";
    JOptionPane.showMessageDialog (null,output,
    "Demostrating the \"is a\" relationship",
    JOptionPane.INFORMATION_MESSAGE );

 
 
    System.exit(0);
  }
}
2)程序运行结果:
5.如果在你的类的层次结构中定义了finalize方法,子类finalize方法应该调用超类的finalize方法(形式:super.finalize();),以保证一个对象所有部分都能正常的终止。
6.引用子类对象可以被隐式地转换为引用超类对象,因为根据继承,子类对象“是一个”超类对象。而用子类引用引向超类对象是语法错误。
7.可以用final来定义方法和类,声明为final的方法不能在子类中被覆盖,声明为static和private的方法是隐式的fianl,因为fianl方法的定义永远不能改变,编译器按这种方式优化程序,即在所有出现final方法调用的地方用方法定义的扩展代码替换方法调用的语句——这种技术叫内联代码(inlining the code)。
   声明为final的类不能是超类,即final类不能被继承,一个final类中的所有方法都是隐式的final。
8.抽象类:一个永远也不需要实例化对象的类,它的作用是作为一个恰当的类,这样其他的类就可以继承接口或者实现。对象能被实例化的类叫具体类。抽象类用abstract声明。
9.一个接口的定义由关键字inte易做图ce开始,并包括一套public abstract方法。接口也可以包含public final static数据。为使用接口;一个类必须声明它implement接口,而且必须定义接口中的每个方法,参数个数及返回类型还要与接口中定义的相同。
10.java提供了一种称为内部类的机制,使类可以在其他类中定义,这样的类可以是完整的类定义或者是“无名内部类”定义。内部类主要用于GUI事件处理。
11.内部类定义要点
1)含内部类的类在编译时将为每个内部类生成一个独立的.class文件。有名字的内部类的文件名为“外部类名$内部类名.class”;无名内部类的文件名为“外部类名$#.class”,其中,#时编译器给

上一个:Java how to program(Third Edition)——我的java手记(五)
下一个:Java how to program(Third Edition)——我的java手记(三)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,