《疯狂Java讲义》chapter 5 面向对象(上)

来源:互联网 发布:windows phone 10小米 编辑:程序博客网 时间:2024/05/18 17:25

第五章 面向对象(上)

5.1 类和对象

static修饰的方法中不能使用this引用(静态成员不能直接访问非静态成员)。

同理,对象(实例)也无法调用static修饰的成员(底层依然使用该实例)。

 

5.2 方法详解

在Java语言里,方法不能独立存在,方法必须属于类或对象。

 

Java里的方法的参数传递方式只有一种:值传递

 

5.2.3 形参个数可变的方法P119

如果在定义方法时,在最后一个形参的类型后增加三点(…),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。

如:public static void test(int a, String books){}

 

Tip:数组形式的形参可以处于形参列表的任意位置,但个数可变的形参只能处于形参列表的最后。也就是说,一个方法中最多只能有一个个数可变的形参。

 

5.2.5 方法重载

方法的返回值类型不能用于区别方法的重载。

 

5.3 成员变量和局部变量

Java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖的成员变量,用this(实例变量)或类名(类变量)作为调用者来限定访问成员变量。

 

5.4 隐藏和封装

4种访问权限:

1.private(当前类访问权限)

2. default(包访问权限):不使用任何访问控制符修饰,可以被相同包下的其他类访问。

3.protected(子类访问权限):通常情况下时希望其子类来重写这个方法。

4.public(公共访问权限):可以被所有类访问,不管访问类和被访问类是否处于同一个包下或者是否具有父子继承关系。

 

Tip:如果一个Java源文件里定义了一个public修饰的类,则这个歌源文件的文件名必须与public修饰的类的类名相同。

Tip:如果一个Java类的每个实例变量都被private修饰,并为每个实例变量都提供了public修饰setter和getter方法,那么这个类就是一个符合JavaBean规范的类。

 

5.4.3package、import和import static

在Java源程序的第一个非注释行放置如下格式的代码:

Package packageName;

 

import可以向某个Java文件中导入指定包层次下的某个类或全部类,import语句应该出现在package语句之后,类定义之前。

 

5.5 深入构造器

将构造器用protected修饰,主要用于被其子类调用;用private修饰,可以阻止其他创建该类的实例。

 

5.5.2 构造器重载

注意:使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。

 

5.6 类的继承

5.6.1 继承的特点

Java的子类不能获得父类的构造器。

 

5.6.2 重写父类的方法

遵循规则:“两同两小一大”

两同:方法名相同,形参列表相同

两小:子类方法返回值类型比父类的更小或相等,子类方法声明抛出的异常类比父类更小或相等。

一大:子类方法的访问权限应比父类更大或相等。

 

可以使用super(被覆盖的时实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

 

如果父类方法具有private访问权限,则其对子类时隐藏的,因此子类无法访问也无法重写该方法。若子类中定义了一个与父类private方法有相同名字,相同形参列表、完全相同返回值类型那个的方法,依然不是重写,只是在子类中重新定义一个新方法。

 

5.6.3 super限定

Tip:为了在子类方法中访问父类中定义的、被隐藏的实例变量,或为了在子类方法中调用负累真能干定义的、被覆盖(Override)的方法,可以通过super.作为限定来调用这些实例变量实例方法

 

5.6.4 调用父类构造器

注意:使用super调用父类构造器也必须出现在子类构造器执行体的第一行(和用this调用重载构造器一样),所以this调用和super调用不会同时出现。

 

5.7 多态

Java引用变量的两个类型:编译时类型和运行时类型

 

Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型(upcasting),向上转型由系统自动完成。

 

父类类型的引用指向子类类型的实例,运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。

 

注意:引用变量在编译阶段只能调用其编译类型所具有的方法,但运行时则执行他运行时类型所具有的方法。因此,编写Java代码时,引用变量只能调用声明该变量时所用类里包含的方法。

 

注意:对象的实例变量则不具备多态性。P149~150

5.7.2 引用变量的强制类型转换

基本类型之间的转换只能在数值类型之间进行,包括整数型、字符型和浮点型。

引用个类型转换只能在具有继承关系的两个类型之间进行。父类实例->子类实例。

 

5.7.3 instanceof运算符

格式:  A instanceof B

A:通常是一个引用类型变量

B:通常是一个类(也可以时接口)

用于判断前面的对象是否是后面的类、或者其子类、实现类的实例。若是,返回true,否则返回false。

 

5.8 继承与组合

继承:is-a 关系

组合:has-a 关系

 

仅从类复用的角度来看,父类的功能等同于被组合类,都将自身的方法提供给新类使用;子类和组合关系里的整体类,都可复用原有类的方法,用于实现自身功能。

 

继承设计与组合设计的系统开销不会有本质的差别。

 

5.9 初始化块

初始化块只在创建Java对象时隐式执行,而且在执行构造器之前执行。

 

静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。

 

不能访问非静态成员(实例成员和实例方法)

 

Tip:当JVM第一次主动使用某个类时,系统会在类准备阶段为该类所有静态成员分配内存:在初始化阶段负责初始化这些静态成员变量,初始化静态成员变量就是执行类初始化代码或者声明类成员变量时指定的初始值,它们的执行顺序与源代码中的排列顺序相同。


0 0
原创粉丝点击