Java基本二

来源:互联网 发布:若水软件 编辑:程序博客网 时间:2024/06/08 14:02

1. super

super 关键字的功能:
调用父类中声明为 private 的变量。
点取已经覆盖了的方法。
作为方法名表示父类构造方法。

无论是 super() 还是 this(),都必须放在构造方法的第一行。

值得注意的是:
在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
不能在构造方法以外的任何方法内调用构造方法。
在一个构造方法内只能调用一个构造方法。

最后注意 super 与 this 的区别:super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。

2. 覆盖

覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。

被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。

方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。

3. static

静态初始器(静态块)
块是由大括号包围的一段代码。静态初始器(Static Initializer)是一个存在于类中、方法外面的静态块。静态初始器仅仅在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。

public class Demo {    public static int i;    static{        i = 10;        System.out.println("Now in static block.");    }    public void test() {        System.out.println("test method: i=" + i);    }    public static void main(String[] args) {        System.out.println("Demo.i=" + Demo.i);        new Demo().test();    }}

静态导入
导入类的静态变量和静态方法

import static packageName.className.methonName; // 导入某个特定的静态方法

import static packageName.className.*;  // 导入类中的所有静态成员

PS:main() 也是一个静态方法,不对任何对象进行操作。实际上,在程序启动时还没有任何对象,main() 方法是程序的入口,将被执行并创建程序所需的对象。

4. final

声明类、变量和方法时,可使用关键字 final 来修饰。

final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次。
final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。

需要注意的是,如果将引用类型(任何类的类型)的变量标记为 final,那么该变量不能指向任何其它对象。但可以改变对象的内容,因为只有引用本身是 final 的。

被 static 或 private 修饰的方法会被隐式的声明为 final,因为动态绑定没有意义。

5. 接口

所有的方法必须都是抽象的,不能有方法体,它比抽象类更加“抽象”。

方法默认为 public abstract 的,因而在声明方法时可以省略这些修饰符。

接口中没有构造方法,不能被实例化。

如果一个类不能实现该接口的所有抽象方法,那么这个类必须被定义为抽象方法。

不允许创建接口的实例,但允许定义接口类型的引用变量,该变量指向了实现接口的类的实例。

6. 接口和抽象类的比较

类是对象的模板,抽象类和接口可以看做是具体的类的模板。

相同点:

都代表类树形结构的抽象层。在使用引用变量时,尽量使用类结构的抽象层,使方法的定义和实现分离,这样做对于代码有松散耦合的好处。
都不能被实例化。
都能包含抽象方法。抽象方法用来描述系统提供哪些功能,而不必关心具体的实现。

区别:

1) 抽象类可以为部分方法提供实现,避免了在子类中重复实现这些方法,提高了代码的可重用性,这是抽象类的优势;而接口中只能包含抽象方法,不能包含任何实现。

2)一个类只能继承一个直接的父类(可能是抽象类),但一个类可以实现多个接口,这个就是接口的优势。

接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:
行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

0 0
原创粉丝点击