道招

Java基础第十讲:面向对象基础(四)

如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!

Java基础第十讲:面向对象基础(四)

本讲内容:抽象类、初始化块 一、抽象类 用 abstract 修饰的类定义,我们称之为抽象类,抽象类不能被实例化。 用 abstract 修饰的方法,我们称之为抽象方法,抽象方法不能有方法体。 面向对象中,所有的对象都是某一个类的实例,但是并不是每个类都可以实例化成一个对象。如果一个类中没有足够的信息来描绘一个具体的对象,那么这个 类就不能被实例化,我们称之为抽象类。抽象类用来描述一系列看起来不同,但究其本质是相同的对象。譬如把苹果、橘子、梨等抽象出来一个概念叫水果,我们把 狗、老鼠、猫、狮子、大象、猪等抽象出来个概念叫动物。这时候我们把动物抽象成一个Animal类时,就最好不要让它直接初始化,创建出一个 Animal()实例对象的结果似乎难以想象。 抽象类被继承之外,没有用途,没有目的。 下面我们用一个Test.java的例子看一下什么叫抽象类:  
01 abstract class Animal {
02     abstract void makenoise();
03 }
04
05 class Lion extends Animal {
06
07     @Override
08     void makenoise() {
09         System.out.println("狮子吼!");
10     }
11 }
12
13 class Dog extends Animal {
14
15     @Override
16     void makenoise() {
17         System.out.println("狗叫!");
18     }
19 }
20
21 public class Test {
22
23     public static void main(String[] args){
24
25         Animal a1 = new Dog();
26         Animal a2 = new Lion();
27
28         a1.makenoise();
29         a2.makenoise();
30     }
31 }
编译和运行程序,我们看看结果: image 这个例子里,我们有这么几点需要留意:
  1. 一个编译单元里是可以写多个顶级类的,只要public修饰的顶级类只有一个就行了。
  2. 用 abstract 修饰的类是抽象类
  3. 用 abstract 修饰的方法是抽象方法,抽象方法没有方法体,也就是说不能写大括号。
  4. 抽象类实际上是定义了一个标准和规范,等着他的子类们去实现,譬如动物这个抽象类里定义了一个发出声音的抽象方法,它就定义了一个规则,那就是谁要是动物类的子类,谁就要去实现这个抽象方法。
  5. 狗和狮子的类继承了动物这个抽象类,实现了发出声音的方法。
  6. 一个对象除了被看成自身的类的实例,也可以被看成它的超类的实例。我们把一个对象看做超类对象的做法叫做向上转型。譬如 Animal a1 = new Dog();
  7. 虽然都是动物类型,但是方法在运行时是按照它本身的实际类型来执行操作的。因此 a1.makenoise()执行的是狗叫,a2.makenoise()执行的是狮子吼,我们称之为运行时多态。
  我们再看一下把一个类看做一个超类有什么样的损失或者不便,我们把上面的例子稍微改一下:
01 abstract class Animal {
02     abstract void makenoise();
03 }
04
05 class Lion extends Animal {
06
07     @Override
08     void makenoise() {
09         System.out.println("狮子吼!");
10     }
11 }
12
13 class Dog extends Animal {
14
15     @Override
16     void makenoise() {
17         System.out.println("狗叫!");
18     }
19
20     void bark(){
21         System.out.println("汪,汪!");
22     }
23 }
24
25 public class Test {
26
27     public static void main(String[] args){
28
29         Animal a1 = new Dog();
30         Animal a2 = new Lion();
31
32         a1.makenoise();
33         a2.makenoise();
34
35         ((Dog)a1).bark();
36     }
37 }
运行程序,查看结果: image 我们把焦点放在第35行,我们再a1前面加了一个(Dog),这个做法的意思是把a1强制转换为Dog对象,只有转换为Dog对象后,才能使用bark方法,否则即使你知道他是一个Dog对象也不能调用bark方法。这就是子类对象付给超类引用所带来的不便或者说是损失。 二、初始化块 我们已经知道在类中有两个位置可以放置执行操作的代码,这两个位置是方法和构造函数。初始化块是第三个可以放置执行操作的位置。当首次加载类(静态初始化块)或者创建一个实例(实例初始化块)时,就会运行初始化块。 我们看一个例子:
01 class SuperClass{
02     SuperClass(){
03         System.out.println("父类SuperClass的构造函数");
04     }
05 }
06
07 public class Initialize extends SuperClass {
08
09     Initialize(int x){
10         System.out.println("带参数的构造函数");
11     }
12
13     Initialize(){
14         System.out.println("不带参数的构造函数");
15     }
16
17     static {
18         System.out.println("第一个静态初始化块");
19     }
20
21     {   System.out.println("第一个实例初始化块");}
22
23     {   System.out.println("第二个实例初始化块");}
24
25     static {
26         System.out.println("第二个静态初始化块");
27     }
28
29     public static void main(String[] args){
30         new Initialize(1);
31         new Initialize();
32     }
33 }
编译并运行程序,查看结果: image 从上面的例子中我们需要留意如下几点:
  1. 初始化块的语法相当简单,它没有名称,没有参数,也没有返回值,只有一个大括号。用 static 修饰的初始化块就要静态初始化块,相对应的,没有static修饰的初始化块就叫实例初始化块。
  2. 静态初始化块在首次加载类时会运行一次。
  3. 实例初始化块在每次创建对象时会运行一次。
  4. 实例初始化块在构造函数的super()调用之后运行。
  5. 初始化块之间的运行顺序取决于他们在类文件中出现的顺序,出现在前面的先执行。
  6. 初始化块从书写惯例上应该写在靠近类文件的顶部,构造函数附近的某个位置。
  好吧,本讲就到这里。 分享至上:分享源头
更新时间:
上一篇:Java基础第九讲:面向对象基础(三)下一篇:Java基础第十一讲:面向对象基础(五)

相关文章

Java基础第九讲:面向对象基础(三)

本讲内容:继承、变量隐藏、方法重写、包、修饰符、this、super 一、继承 1、继承的概念 继承是面向对象的三大特性之一。在语义上继承的意思是照法律或遵照遗嘱接受死者的财 阅读更多…

Java基础第十一讲:面向对象基础(五)

本讲内容:接口 一、为什么要有接口 我们已经知道Java中只支持单继承,或者说不允许多重继承的出现,又可以说一个类只能有一个父类。为了提供类似多重继承的功能,Java提供了接口的 阅读更多…

Java基础第八讲:面向对象基础(二)

本讲内容:成员变量、方法、方法的重载、构造函数 一、用程序讲解小白的故事 小白是一条狗,它心情好的时候会恭喜人发财,它心情差的时候会对路人撒野,吓得路人落荒而逃。下面我们用面向对象的方 阅读更多…

Java基础第七讲:面向对象基础(一)

本讲内容:面向对象的概念和发展、面向对象的特征 一、面向对象(Object Oriented)编程语言的历史 1950年有个叫做荷兰德的学生作为程序员进入IBM的时候,这个世界上的程序 阅读更多…

Java基础第十二讲:面向对象基础(六)

本讲内容:内部类 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中 阅读更多…

关注道招网公众帐号
道招开发者二群