面向对象(下)

来源:互联网 发布:淘宝先锋乒羽商城 编辑:程序博客网 时间:2024/06/05 05:06

1.this和super各有几种用法?

答:this的用法有3种;

(1)this.域变量、this.成员方法:在一些容易混淆的场合,在方法内借助(2)this来明确表示用的是类的域变量;

(3)this(参数)——引用重载的构造方法

(4)this指代当前对象

super的用法有2种;

(1)super.域变量、

(2)super.成员方法(参数)

 

super和this的异同:

(1).super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 

(2).this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
(3).super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)

(4).this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

(5).调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

(6).super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

(7).super()和this()均需放在构造方法内第一行。

(8).尽管可以用this调用一个构造器,但却不能调用两个。

(9).this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

(10).this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

(11).从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

---------------------------------------------------------------------------------------------------------------------------------

2.子类对象实例化的具体过程是什么?

答: (1).为子类对象分配内存空间,对域变量进行默认初始化。

     (2).绑定构造方法,将new对象中的参数传递给构造方法的参数形式。

     (3).调用this或super语句,注意二者必居其一,但不能同时存在。

     (4).进行实例变量的显示初始化操作。

     (5.).执行当前构造方法体中的程序代码。

---------------------------------------------------------------------------------------------------------------------------------

 

3.类的域变量和方法中定义的局部变量在初始化上有何区别?

答:类的域变量属于全局变量,在类初始化的时候就开始创建了;局部变量必须在方法内进行初始化,在调用到该方法时,才会为该变量创建

---------------------------------------------------------------------------------------------------------------------------------

 

4.模仿形成抽象类的过程,自选角度,形成一个自己的抽象类,并在程序的类继承和应用中体现抽象类的作用?

答:对学生类的一个抽象:

package 课后习题;abstract class student {    //成员变量    private String name;    private int age;    private int grand;    //无参构造方法    public student(){}    //带参构造方法    public student(String name,int age,int grand){        this.name=name;        this.age=age;        this.grand=grand;    }    public void setname(String name){        this.name=name;    }    public String getname(){        return name;    }    public void setage(int age){        this.age=age;    }    public int getage(){        return age;    }    public void setgrand(int grand){        this.grand=grand;    }    public int getgrand(){        return grand;    }       //抽象方法    abstract public void study();    //成员方法    public void eat(){        System.out.println("学习学习java!");    }}class Basicstudent extends student {    //构造方法    public Basicstudent(){}    public Basicstudent(String name,int age,int grand){        super(name,age,grand);    }    public void study(){        System.out.println("Basicstudent:   study");    }}class Goodstudent extends student{    public Goodstudent(){}    public Goodstudent(String name,int age,int grand){        super(name,age,grand);    }    public void study(){        System.out.println("Goodstudent:  study");    }}public class di4ti{    public static void main(String[] args){        student s =new Basicstudent();        s.setname("Basicstudent");        s.setage(20);        s.setgrand(1111);        System.out.println(s.getname()+"----"+s.getage()+"----"+s.getgrand());        s.eat();        s.study();        s =new Goodstudent("Goodstudent",20,2222);        System.out.println(s.getname()+"----"+s.getage()+"----"+s.getgrand());        s.eat();        s.study();    }}

---------------------------------------------------------------------------------------------------------------------------------

 

5.接口有什么作用?自己定义一个接口,并给出实现类和使用类?

答:Java接口是Java语言中存在的结构,有特定的语法和结构,Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口实现和类继承的规则不同,因为Java接口不涉及表象,因此Java接口本身没有任何实现。

---------------------------------------------------------------------------------------------------------------------------------

 

6.抽象类和接口的异同点是什么?

答:Java 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

接口与类相似点:

(1)一个接口可以有多个方法。

(2)接口文件保存在 .java 结尾的文件中,文件名使用接口名。

(3)接口的字节码文件保存在 .class 结尾的文件中。

(4)接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

(1)接口不能用于实例化对象。

(2)接口没有构造方法。

(3)接口中所有的方法必须是抽象方法。

(4)接口不能包含成员变量,除了 static 和 final 变量。

(5)接口不是被类继承了,而是要被类实现。

(6)接口支持多继承。

接口特性:

(1)接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。

(2)接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是public,用 private 修饰会报编译错误)。

(3)接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别:

(1)抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

(2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

(3)接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

(4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

抽象类和接口的相同点:

(1).抽象类可以有实现(包括构造函数),而接口不可以有任何实现,重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。
 (2).抽象类中还以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;而接口中不能有成员变量、常量、静态方法,只能有公共的属性。
 (3).抽象类可以从另一个类或者一个/ 多个接口派生;而接口不能从另一个类派生却可以实现另一个或多个接口

参考网址:http://www.runoob.com/java/java-interfaces.html

---------------------------------------------------------------------------------------------------------------------------------

 

7.引用比较方法有哪些?

答:(1)equal方法比较;

(2)使用“==”进行比较;

(3)使用instanceof比较引用类型。

---------------------------------------------------------------------------------------------------------------------------------

 

8.内部类的作用是什么,什么情况下使用匿名内部类?

答:1.内部类可以直接访问外部类中的所有属性,包括修饰符为private的属性或方法

  2.在类中需要实例化这个类的地方,定义一个没有名称的类

 

一、JAVA中内部类和匿名内部类的区别

  内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。

  匿名内部类:它只能使用一次,不区分static和非static。如果用到外部类的变量的话,必须是类变量或者实例变量,就是必须是类定义的变量,或者final的局部变量。匿名内部类如果是继承某个类的话是可以重写那个类的方法的,这个和普通内部类一样。

  总结:可以用匿名内部类的地方都可以用内部类替换,但是用匿名内部类编码非常简洁,也容易读懂,除非你需要多次使用那个内部类,不然建议还是使用匿名内部类。

二、内部类的使用时机

  1、实现事件监听器的时候(比方说actionListener 。。。采用内部类很容易实现);

  2、编写事件驱动时(内部类的对象可以访问外部类的成员方法和变量,注意包括私有成员);

  3、在能实现功能的情况下,为了节省编译后产生的字节码(内部类可以减少字节码文件,即java文件编译后的.class文件);

三、匿名内部类的使用时机

  匿名内部类是内部类的一种特殊情况。它只有一个实例,而且没有引用。所以,一般在能用内部类实现,但是实例只用一次的情况下使用它(可以减少资源开销);

参考网址:http://blog.csdn.net/zhouchao001/article/details/50284765

---------------------------------------------------------------------------------------------------------------------------------

 

9.什么是数据隐藏?如何证明子类对父类同名方法进行重新定义,只能是方法的覆盖而不是方法的隐藏?

答:如果在子类中对从父类继承来的成员变量进行重新定义,即出现了子类变量对父类变量的隐藏。所谓隐藏是指子类拥有两个相同名字的变量,一个是继承自父类,另一个是由自己定义的。当子类执行它自己定义的方法时,如果操作该变量,所操作的是它自己定义的变量,而把继承自父类的变量“隐藏”起来。当子类执行从父类继承的操作时,如果操作该变量,所操作的是继承自父类的成员变量。要想执行父类的属性则需要调用super。

可以通过断点进行跟踪判断是方法的覆盖。

---------------------------------------------------------------------------------------------------------------------------------

 

10.借助JDK帮助,编写程序实现这样的功能:Applet当中的TextField,每输入任一字符,在一个label中都能动态跟踪刷新。

答:代码及注释如下:

package 第六章;import java.applet.Applet;import java.awt.Graphics;import java.awt.TextField;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;public class di12ti extends Applet implements KeyListener{     private TextField input;    char m;    String h="";    //进行初始化工作,产生对象,加入监听者    public void init(){        input = new TextField(10);        //myApplet是容器,input是组件,调用add使input嵌入容器        input.addKeyListener(this);//注册监视器        add(input); //可以直接调用本类的方法        add(m);    }    private void add(char m2) {}public void keyPressed(KeyEvent e) {}public void keyReleased(KeyEvent e) {}  public void keyTyped(KeyEvent e) { m=e.getKeyChar(); h=h+m; repaint(); } public void paint(Graphics g){        g.drawString("Label中您输入了:"+h,10,50);    }  }


原创粉丝点击