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);
}
}