这次主要剖析以下问题: 抽象类与接口的区别、别名、局部变量的语句块作用域、this构造和super构造
一、抽象类与接口的区别:
* 1.抽象类中可以定义所有成员变量(含实例变量和静态变量[含常量])和非空方法,而接口中只能定义常量和空方法;
* 2.抽象类在定义抽象方法时必须加abstract,而在接口中可以加但不需要加;
* 3.接口允许多继承:一个接口可以基层多个接口,实现接口的类也可以继承多个接口,但JAVA的类仅支持单继承。
package test;
interface object1 {
// int var1;
//static int var1s;
int VAR1 = 2;// 接口中只能定义常量,等同于final static int VAR1=2;
int interfaceMethod1();
abstract int interfaceMethod2();//接口中的方法其实就是抽象方法,但在接口中一般不加abstract
// int inferfaceMethod3(){} 接口中不能含有非抽象方法
}
abstract class object2 {
int var2;
static int var2s;
final static int VAR2 = 2;//抽象类中可以定义变量也可以定义常量
abstract int abstractMethod1();
//int abstractMethod2();空方法必须加abstract修饰符
//abstract int abstractMethod3(){} 抽象方法不能指定方法体
void abstractMethod4(){}//抽象类中可以含有非抽象方法
}
二、下面中的引用变量都是别名
package test2;
public class test {
int a;
public test(int i) {
this.a = i;
}
public static void main(String[] args) {
test test1 = new test(10);
test test2 = test1;
System.out.println(test1.a);
System.out.println(test2.a);
test1 = null;
// System.out.println(test1.a);
System.out.println(test2.a);
}
}
三、局部变量的语句块作用域:
语句块{}中所声明的变量的作用域处在声明该变量的语句块中,语句块外部不能访问
public class hong {
public static void main(String[] args) {
int var1 = 1;
{
int var2 = 2;
}
System.out.println(var1);
// System.out.println(var2);
// var2不能别解析,因为var2的作用域处在语句块{}中
}
}
四、this构造和super构造
二者必须位于构造函数的第一行,this()构造用于串链同一个类中的构造函数,而super()构造用于激活超类的构造函数,如果构造函数的第一句不是this()构造或者super()构造,则会插入一条指向超类默认构造函数的super()调用
class test {
int i,j;
test(int i, int j) {
this.i = i;
this.j = j;
}
}
public class SuperDemo extends test {
int k,l;
SuperDemo() {
this(11,12);
}
/* 错误,插入插入一条指向超类默认构造函数的super()调用
SuperDemo(int i, int j) {
this.k = i;
this.l = j;
}
*/
public static void main(String[] args) {
SuperDemo sd = new SuperDemo();
System.out.print(sd.i+""+ sd.j+sd.k+sd.l);
}
}
|