Java基础第十讲:面向对象基础(四)
如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!
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 |
} |

- 一个编译单元里是可以写多个顶级类的,只要public修饰的顶级类只有一个就行了。
- 用 abstract 修饰的类是抽象类
- 用 abstract 修饰的方法是抽象方法,抽象方法没有方法体,也就是说不能写大括号。
- 抽象类实际上是定义了一个标准和规范,等着他的子类们去实现,譬如动物这个抽象类里定义了一个发出声音的抽象方法,它就定义了一个规则,那就是谁要是动物类的子类,谁就要去实现这个抽象方法。
- 狗和狮子的类继承了动物这个抽象类,实现了发出声音的方法。
- 一个对象除了被看成自身的类的实例,也可以被看成它的超类的实例。我们把一个对象看做超类对象的做法叫做向上转型。譬如 Animal a1 = new Dog();
- 虽然都是动物类型,但是方法在运行时是按照它本身的实际类型来执行操作的。因此 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 |
} |

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

- 初始化块的语法相当简单,它没有名称,没有参数,也没有返回值,只有一个大括号。用 static 修饰的初始化块就要静态初始化块,相对应的,没有static修饰的初始化块就叫实例初始化块。
- 静态初始化块在首次加载类时会运行一次。
- 实例初始化块在每次创建对象时会运行一次。
- 实例初始化块在构造函数的super()调用之后运行。
- 初始化块之间的运行顺序取决于他们在类文件中出现的顺序,出现在前面的先执行。
- 初始化块从书写惯例上应该写在靠近类文件的顶部,构造函数附近的某个位置。
- 分类:
- Java
更新时间:
相关文章
Java基础第九讲:面向对象基础(三)
本讲内容:继承、变量隐藏、方法重写、包、修饰符、this、super 一、继承 1、继承的概念 继承是面向对象的三大特性之一。在语义上继承的意思是照法律或遵照遗嘱接受死者的财 阅读更多…
Java基础第七讲:面向对象基础(一)
本讲内容:面向对象的概念和发展、面向对象的特征 一、面向对象(Object Oriented)编程语言的历史 1950年有个叫做荷兰德的学生作为程序员进入IBM的时候,这个世界上的程序 阅读更多…
Java基础第十二讲:面向对象基础(六)
本讲内容:内部类 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中 阅读更多…
Java基础第十一讲:面向对象基础(五)
本讲内容:接口 一、为什么要有接口 我们已经知道Java中只支持单继承,或者说不允许多重继承的出现,又可以说一个类只能有一个父类。为了提供类似多重继承的功能,Java提供了接口的 阅读更多…
Java基础第八讲:面向对象基础(二)
本讲内容:成员变量、方法、方法的重载、构造函数 一、用程序讲解小白的故事 小白是一条狗,它心情好的时候会恭喜人发财,它心情差的时候会对路人撒野,吓得路人落荒而逃。下面我们用面向对象的方 阅读更多…