这次主要剖析以下问题: 抽象类与接口的区别、别名、局部变量的语句块作用域、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); } } |