⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (13).txt

📁 Java面试大全.rar Java面试大全.rar
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    SubClass( ) { 
     super( );    //调用父类的构造方法 
     x=5;      //super( ) 要放在方法中的第一句 
     System.out.println("in SubClass :x="+x); 
    } 
     void doSomething( ) { 
     super.doSomething( ); //调用父类的方法 
     System.out.println("in SubClass.doSomething()"); 
     System.out.println("super.x="+super.x+" sub.x="+x); 
    } 
  } 
  public class Inheritance { 
     public static void main(String args[]) { 
     SubClass subC=new SubClass(); 
     subC.doSomething(); 
    } 
  } 

3. 多态性 
  在java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。 
  1) 编译时多态 
  在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。 
  2) 运行时多态 
  由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。 
  ◇ 重写方法的调用原则:java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 
在例3-6中,父类对象a引用的是子类的实例,所以,java运行时调用子类B的callme方法。 

【例3-6】 
  import java.io.*; 
  class A{ 
     void callme( ) { 
      System.out.println("Inside A''s callme()method"); 
     } 
  } 
  class B extends A{ 
     void callme( ) { 
      System.out.println("Inside B''s callme() Method"); 
     } 
  } 
  public class Dispatch{ 
     public static void main(String args[]) { 
      A a=new B(); 
      a.callme( ); 
     } 
  } 
◇ 方法重写时应遵循的原则: 
  1)改写后的方法不能比被重写的方法有更严格的访问权限(可以相同)。 
  2)改写后的方法不能比重写的方法产生更多的例外。 
4. 其它 
  ◇ final 关键字 
  final 关键字可以修饰类、类的成员变量和成员方法,但final 的作用不同。 
  1) final 修饰成员变量: 
  final修饰变量,则成为常量,例如 
  final type variableName; 
  修饰成员变量时,定义时同时给出初始值,且以后不能被修改,而修饰局部变量时不做要求。 
  2) final 修饰成员方法: 
  final修饰方法,则该方法不能被子类重写 
  final returnType methodName(paramList){ 
  … 
  } 

  3) final 类: 
  final修饰类,则类不能被继承 
  final class finalClassName{ 
  … 
  } 
  ◇ 实例成员和类成员 
  用static 关键字可以声明类变量和类方法,其格式如下: 
  static type classVar; 
  static returnType classMethod({paramlist}) { 
  … 
  } 
 如果在声明时不用static 关键字修饰,则声明为实例变量和实例方法。 
  1) 实例变量和类变量 
  每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。 
  类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。 
  2) 实例方法和类方法 
  实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。 
  但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用this或super关键字。 
  例3-7 是关于实例成员和类成员的例子。 
【例3-7】 
  class Member { 
    static int classVar; 
    int instanceVar; 
    static void setClassVar(int i) { 
     classVar=i; 
     // instanceVar=i; // 类方法不能访问实例变量 
    } 
    static int getClassVar() 
     { return classVar; } 
    void setInstanceVar(int i) 
     { classVar=i; //实例方法不但可以访问类变量,也可以实例变量 
     instanceVar=i; } 
     int getInstanceVar( ) 
     { return instanceVar; } 
    } 
    public class MemberTest{ 
     public static void main(String args[]) { 
         Member m1=new member(); 
         Member m2=new member(); 
         m1.setClassVar(1); 
         m2.setClassVar(2); 
         System.out.println("m1.classVar="+m1.getClassVar()+" 
                   m2.ClassVar="+m2.getClassVar()); 
         m1.setInstanceVar(11); 
         m2.setInstanceVar(22); 
         System.out.println("m1.InstanceVar="+m1.getInstanceVar 
              ()+" m2.InstanceVar="+m2.getInstanceVar()); 
     } 
    } 
◇ 类java.lang.Object 
  类java.lang.Object处于java开发环境的类层次的根部,其它所有的类都是直接或间接地继承了此类。该类定义了一些最基本的状态和行为。下面,我们介绍一些常用的方法。 
  equals() :比较两个对象(引用)是否相同。 
  getClass():返回对象运行时所对应的类的表示,从而可得到相应的信息。 
  toString():用来返回对象的字符串表示。 
  finalize():用于在垃圾收集前清除对象。 
  notify(),notifyAll(),wait():用于多线程处理中的同步。 

3.2.4抽象类和接口 

 1. 抽象类 
  java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下: 
  abstract class abstractClass{ …} //抽象类 
  abstract returnType abstractMethod([paramlist]) //抽象方法 
  抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。 

若一个类继承了一个抽象类,则抽象类的抽象方法必须被实现,否则子类必须声明为abstract. 
 2. 接口 
  接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面: 
  ◇ 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。 
  ◇ 通过接口指明多个类需要实现的方法。 
  ◇ 通过接口了解对象的交互界面,而无需了解对象所对应的类。 
1)接口的定义 
  接口的定义包括接口声明和接口体。 
  接口声明的格式如下: 
  [public] interface interfaceName[extends listOfSuperInterface] { … } 
  extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。 
  接口体包括常量定义和方法定义 
  常量定义格式为:type NAME=value; 该常量被实现该接口的多个类共享; 具有public ,final, static的属性。在接口中只能声明常量,不可以声明变量。 
  方法体定义格式为:(具有 public和abstract属性,不能声明为protected) 
  returnType methodName([paramlist]); 

注意:在接口的实现类中,实现的接口方法必须声明为public ,因为接口中定义的方法为public(默认)。所以其实现必须声明为public.否则编译不会通过。 
2)接口的实现 
  在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。 
3) 接口类型的使用 
  接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。 
3.2.5 内部类 

 1. 内部类的定义和使用: 
  内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部匿名定义。 
  内部类有如下特性: 
  ◇ 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称.名字不能与包含它的类名相同。 
  ◇ 可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。 
  ◇ 可以定义为abstract。 
  ◇ 可以声明为private或protected。 
  ◇ 若被声明为static,就变成了顶层类,不能再使用局部变量。 
  ◇ 若想在Inner Class中声明任何static成员,则该Inner Class必须声明为static。 
例3-8】 
  import java.awt.*; 
  import java.awt.event.*; 
  public class TwoListenInner { 
    private Frame f; 
    private TextField tf; 
      public static void main(String args[]) { 
       TwoListenInner that=new TwoListenInner(); 
       that.go(); 
    } 
    public void go() { 
       f=new Frame("Two listeners example"); 
       f.add("North",new Label("Click and drag the mouse")); 
       tf=new TextField(30); 
       f.add("South",tf); 
       f.addMouseMotionListener(new MouseMotionHandler()); 
       f.addMouseListener(new MouseEventHandler()); 
       f.setSize(300,300); 
       f.setVisible(true); 
    } 
    public class MouseMotionHandler extends MouseMotionAdapter { 
      public void mouseDragged(MouseEvent e){ 
       String s="Mouse dragging:X="+e.getX()+"Y="+e.getY(); 
       tf.setText(s); 
      } 
    } 
    public class MouseEventHandler extends MouseAdapter { 
      public void mouseEntered(MouseEvent e){ 
       String s="The mouse entered"; 
       tf.setText(s); 
      } 
      public void mouseExited(MouseEvent e){ 
       String s="The mouse left the building"; 
       tf.setText(s); 
      } 
    } 
  } 

说明:Frame类的add方法来自于其祖先类Container类,addMouseMotionListener和addMouseListener方法来自于其祖先类Component, addMouseListener方法的参数为MouseListener接口,MouseAdapter类是实现了MouseListener接口的类。可见图形界面对于外部事件的响应是通过添加listener实现的 
2. 匿名类的定义和使用: 
  匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。通过对例6-7中go()部分语句的修改,我们可以看到匿名类的使用情况。 
  public void go() { 
         f=new Frame("Two listeners example"); 
         f.add("North",new Label("Click and drag the mouse")); 
         tf=new TextField(30); 
         f.add("South",tf); 
         f.addMouseMotionListener(new MouseMotionHandler(){ 
         /*定义了一个匿名类,类名没有显式地给出,只是该类是 
          MouseMotionHandler类的子类*/ 
           public void mouseDragged(MouseEvent e){ 
             String s="Mouse dragging:X="+e.getX()+"Y 
             ="+e.getY(); 
             tf.setText(s); 
           } 
         }); 
         f.addMouseListener(new MouseEventHandler()); 
         f.setSize(300,300); 
         f.setVisible(true); 
         } 
 3. 内部类的优缺点: 
  ◇ 优点:节省编译后产生的字节码文件的大小 
  ◇ 缺点:使程序结构不清楚 

习题: 

1 :造型不可以从父类向子类造型,只能从子类向父类造型。否则编译 时可以通过,执行时会报错 

如:SubClass sc = new SubClass(); BaseClass bc = (BaseClass)sc ;---是正确的 

而 BaseClass bc = new BaseClass(); SubClass sc = (SubClass)bc ;---是错误的 

BaseClass bc = new SubClass()也是正确的,并且在调用bc中的方法时执行的方法体是子类的方法体,但该方法必须同时在子类,父类中同时存在,若子类中有,而父类中没有,则不可以这样调用bc.subMethod(); 

若两个类都继承于同一个类(必须是直接继承,否则不对),则这两个类可以互相赋值,如:Panel和Frame 同继承于Container,所以Panel p = new Frame() ;和Frame f = new Panel()都是正确的,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -