`

Java基础恶补——OO

    博客分类:
  • Java
 
阅读更多

[SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065)]  chapter 2

 

一. 封装, IS-A, HAS-A

1. 通过封装可以隐藏接口(或API)的实现细节。

2. 封装代码的特点:实例变量是 protected 或 private 的,通过 getter, setter 方法提供访问。

3. IS-A:

1) 指的是继承或实现。

2) 表现形式为关键字 extends 。

3) 和 "inherits from,"  "is a subtype of " 是同等含义。

4. HAS-A 指的是一个类的实例中存在着对另一个类或本类的实例的引用。

 

二. 继承

1. 继承允许一个类成为另一个的子类,并继承父类的 public, protected 变量和方法。

2. 继承是 IS-A, 多态, overriding, overloading, casting 的关键概念。

3. 所有类(Object 除外)都是Object的子类,继承Object的方法。

 

三. 多态

1. 多态的意思是“多种形式”。

2. 1个引用变量总是1个单独的、不能被改变的类型,但它可以指向一个子类型对象。

3. 1个对象能被1个基类类型的多个不同子类类型的变量所引用。

4. 引用变量类型决定着所能调用的方法。

5. Polymorphic method invocations apply only to overridden instance methods.

 

四. Overriding and Overloading

1. 方法可以被 overridden 或 overloaded, 构造函数只能被overloaded 而不能被overridden。

2. 抽象方法必须被第1个非抽象子类所 overridden。

3. Overriding 方法:

1) 必须具有相同的参数列表、返回类型(从Java5开始,返回类型可以是子类类型)。

2) 不能用更高1级的访问控制符来修饰,但可以用低一些访问控制符来修饰。

3) 不能抛出新的或更广的 checked exceptions,但可以抛出任何unchecked exception 或 范围更小的checked exceptions。

4. final 方法不能被 overridden。

5. 只有能被继承的方法才能被 overridden,私有方法不能被继承。

6. 子类可以通过 super.overriddenMethodName() 在 overridden 方法中调用父类该方法。

7. Overloading 意思是相同的方法名称、不同的参数。

8. Overloaded 方法:

1) 必须具有不同的参数列表。

2) 可以改变返回类型(参数列表仍然需要是不同的)。

3) 可以具有不同的访问控制修饰符、异常。

9. 父类的方法可以被子类 overloaded。

10. 多态只应用于overriding,而不是overloading。

11. 对象类型决定着在运行时调用哪个overridden方法。

12. 引用类型决定着在编译时调用哪个overloaded方法。

 

五. 引用变量类型转换

1. 共有2种类型:向下转换、向上转换。

2. 向下转换:

1) 如果1个引用变量指向的是子类类型对象,则可以将该引用变量类型转变为该子类类型对象。

2) 类型转换时必须使用显式地转换,转换的结果是该引用变量可以访问该子类类型对象的成员。

3. 向上转换:

1) 可以显示地或隐式地转换引用变量类型为父类类型。

2) 它是安全的操作。

 

. 实现接口

1. 实现1个接口时表示遵从它的约定。

2. 通过正确和具体地overriding该接口所定义的所有方法来实现1个接口。

3. 1个类可以实现多个接口。

 

. 返回类型

1. Overloaded 方法可以改变返回类型,而 overridden 方法不能改变返回类型( covariant 类型除外)。

2. 返回类型可以用null作为返回值。

3. 1个数组是合法的返回类型。

4. 当返回类型是原子类型时,任何可以隐式地转化为该返回类型的值都是合法的。

5. 声明为void时,不能返回值,但可以使用 return; 但当有返回类型时则return后必须有值。

6. 可以返回声明类型的子类类型值。

7. 用接口类型作为返回类型时,必须返回接口的实现类型值。

 

. 构造函数和实例化

1. 1个构造函数当new1个对象时被调用。

2. 1个对象的继承树中的每个父类的构造函数都会被调用。

3. 每个类,甚至抽象类,都至少有1个构造函数。

4. 构造函数的名称必须和类名相同。

5. 构造函数不能有返回类型,如果有返回类型,则是方法而非构造函数。

6. 构造函数可以用任何的访问控制修饰符进行修饰。

7. 典型的构造函数执行:

1) 构造函数调用父类的构造函数,父类再调用父类的,直到Object的构造函数为止。

2) Object的构造函数执行并返回其调用者,调用者执行后再返回其调用者,直到实例被创建。

8. 如果没有在1个类中创建任何构造函数,则编译器会创建1个默认的构造函数。

9. 默认构造函数是无参的,并会调用无参的super()。

10. 每个构造函数的第1个状态必须是this()或super()。

11. 编译器会自动调用super(),除非已经调用了this()或super()。

12. 实例成员只有在构造函数运行后才能被访问。

13. 抽象类的构造函数在具体子类实例化时被调用。

14. 接口没有构造函数。

15. 如果父类没有无参构造函数,则必须创建1个构造函数并调用有参的super构造函数。

16. 构造函数不能被继承,所以不能被overridden。

17. 1个构造函数只能被另1个构造函数直接调用,其他情况下都不能直接调用构造函数。

18. 调用this()的一些问题:

1) May appear only as the first statement in a constructor.

2) 参数列表决定着overloaded的构造函数中哪个被调用。

3) 构造函数可以调用构造函数,但需要在某个点上调用super(),否则将引起stack explode。

4) 在1个构造函数里不能既调用this()又调用super(),只能是其一。

 

. 静态

1. 用静态方法来实现不依赖于实例的行为。

2. 用静态变量来保存和特定于类(而非特定于实例)的数据,静态变量只有1份copy。

3. 所有的静态成员都属于类,而不属于任何实例。

4. 1个静态方法不能直接访问1个实例变量。

5. 静态成员通过 类名.成员名 的方式进行访问(用 实例名.成员名 的方式也能访问,但这只是个语法小把戏)。

6. 静态方法不能被overridden,但可以被重新定义。

 

. 耦合和内聚

1. 耦合指的是1个类中所关联的其他类的程度。

2. 1个松耦合设计的系统,类的封装性较好,彼此之间的关联度降低,limit the breadth of API usage。
3. 内聚指的是1个类具有单一的、界限清楚的角色或职责的程度。

4. 1个高内聚的类的成员均具有单一的、界限清楚的角色或职责。

 

附:JAVA中方法和变量在继承中的覆盖和隐藏

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics