[疯狂Java讲义精粹] 第四章|面向对象(上)

0. Java提供了private、protected和public三个访问控制修饰符实现封装, 提供了extends关键字然子类继承父类, 子类继承父类就可以继承到父类的Field和方法, 如果访问控制允许, 子类实例可以直接调用父类里定义的方法。


1. 面向对象三大特征: 封装, 继承, 多态态态态态态态!


2. 创建类:

[修饰符] class 类名
{
    零到多个构造器定义...
    零到多个Field(即成员变量)...
    零到多个方法...
} 
* 修饰符是public, final, abstract 三者之一,或者省略.

* 类名规范是: 由一个或多个有意义的单词连接而成, 每个单词首字母大写 其余小写, 单词间不用分隔符.


构造器用于构造该类的实例, Java语言通过new关键字调用构造器, 从而返回该类的实例((? 构造器代码中不能显示地使用return返回该类的对象, 如果有的话算方法) 没有构造器就不能创建实例. 当没有自主编写构造器时, 由系统提供默认构造器.).

定义构造器:

[修饰符] 构造器名 (形参列表)
{
    零到多条语句组成的构造器执行体
}

* 修饰符: 可省略. 也可public, protected, private之一.

* 构造器名: 必须与类名相同.

如果定义了构造器的返回值或定义为void, 则被编译器识别为方法.


定义Field:

[修饰符] Field类型 Field名 [= 默认值];

* 修饰符: 可省略. 也可public、protected、 private、static、final. 其中public、protected、private 三个中最多出现一个, 可与static、final(可同时出现)组合起来修饰Field. 

* Field名规范: 由一个或多个有意义的单词连接而成, 第一个单词首字母小写, 后面每个单词首字母大写, 其余小写, 单词间不用分隔符.


定义方法:
[修饰符] 方法返回值类型 方法名(形参列表)
{
    零到多条语句组成的方法体
}

* 修饰符: 可省略. 也可public、protected、 private、static、final. 其中public、protected、private 三个中最多出现一个, final与abstract最多出现一个, 都可与static 组合起来修饰Field. 

* 方法名规则: 与Field同, 通常以动词开头.

  形参列表: 形似 (形参类型 形参名, 形参类型 形参名, 形参类型 形参名).

类里的各成员间的定义顺序没影响, 可相互调用.


3. static 修饰的成员属于这个类本身, 不属于该类的实例(但可以被实例调用(调用时实际上是还是在用该实例所属的类所调用的)), 通常把static修饰的Field和方法成为类Field和类方法. 没用static修饰的Field和方法属于该类的实例, 不属于该类, 成为实例Field和实例方法.


4. 创建实例: 

//Person 是已有的类
Person p = new Person(); //或分开写成 Person p; p = new Person();
//如是调用Field 和 方法
p.name = "xxx";
p.say("xxxxxxx");

5. Java里的引用相当于C的指针.


6. this 关键字指向调用该方法的对象(不是类). this关键字的作用是让(构造器或) 另一个方法访问该类里的另外一个方法或Field.  this可省略.


7. static修饰的方法中不能使用this引用(* 因为static修饰的方法属于类, 而在类初始化时不可能有对象存在, 所以this不可能引用到对象), 所以static修饰的方法不能访问static修饰的普通成员. 因此Java规定, 静态成员不能直接访问非静态成员.


8. this通常可以省略, 但如果这个局部变量和Field同名, 但程序又需要在该方法里访问这个被覆盖的Field时则必须使用this前缀.


9. 定义方法时,在最后一个形参类型后增加三个点(...), 表名该参数可以接受多个值(多个参数值被当做数组传入(可以直接传给变长形参一个数组)). (void test(int a, String... books){}).


10. 如果一个类(? 或对象)中有两个或两个以上方法名称相同, 但形参列表不同的话, 被称作方法重载.(方法的返回值类型不能作为判断重载的依据.)


11. 变量 (Field变量不用显示初始化, 形参也是.)

所有变量成员变量实例Field
  类Field
 局部变量形参
  方法局部变量
  代码块局部变量

12. (三大特征之一: 封装)访问控制符: private → default → protected → public. (当不使用任何访问控制符时, 是default. 访问控制符控制一个类的成员是否能被另一个类访问.)

  • private: 当前类访问权限. 如果类里一个成员(Field、方法或构造器等)用private修饰, 则此成员只能在当前类内部被访问.
  • default: 包访问权限. default访问控制的成员或外部类可以被相同包下的其他类访问.
  • protected: 子类访问权限. 这个成员既可以被同一包中的其他类访问, 也可以被不同包中的子类访问. 通常使用protected修饰一个方法是希望其子类来重写这个方法.
  • public: 公共访问权限. 可以被所有类访问, no matter是否在同一个包中, no matter 是否具有父子继承关系.
外部类只有两种访问控制级别: public和默认. ? 因为外部类没有处于任何类的内部, 也就没有其所在类的内部和所在类的子类两个范围. pulic修饰的可以被所有类使用, 默认的只能被同一包中的其他类使用.


13. Java引入包机制(package), 提供了类的多层命名空间, 用于解决类的命名冲突、类文件管理等问题. 如果希望把一个类放在指定的包结构下, 应在该源代码的第一个非注释行放置如下格式代码:

package lee; // * 通常由一个或多个有意义的单词连缀而成, 全小写.
public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("Hello your sister!");
    }
}
编译时应使用 (javac -d . Hello.java), 编译后当前目录生成一个lee文件夹, 其中有一个Hello.class文件.(Java规定位于包中的类, 在文件系统中也必须有与包名层次相同的目录结构.

进入lee文件夹所在目录(不是进入lee目录下), 用 (java lee.Hello) 运行Hello类.

同一个目录下的类可以直接访问而不添加包前缀, 否则要添加.


14. import语句用于导入指定包层次下的类, 导入之后可以省略包前缀. (Java默认导入java.lang包下的所有类.)

import语句应出现在package语句(如果有的话)和类定义之间.

import语句中的* 只代表类, 不代表包.

import static 语句用于导入指定类静态的Field或方法.(语句中的*代表Field和方法.)


15. Java的常用包.

Java的核心类都放在java这个包及其子包下, Java扩展的许多类都放在javax包及其子包下.

  • java.lang: Java语言的核心类, 如String、Math、System和Tread类等. 系统默认自动导入此包.
  • java.util: 大量工具类/接口和集合框架类/接口, 如Arrays、List和Set等.
  • java.net: 网络编程相关的类/接口.
  • java.io: 输入/输出编程相关的类/接口.
  • java.text: 一些Java格式化相关的类.
  • java.sql: 进行JDBC数据库编程的相关类/接口.
  • java.awt: 抽象窗口工具集(Abstract Window Toolkits)的相关类/接口, 这些类主要用于构建GUI(图形用户界面)程序.
  • java.swing: Swing图形用户界面编程相关的类/接口, 用于构建平台无关的GUI程序.

16. 构造器是一种特殊的方法, 这个特殊方法用于创建实例时执行初始化. 构造器名必须与类名相同.(默认初始化时基本类型的Field设为0或false, 引用类型设为null, 使用构造器可以改变初始化的值.)

public class ConstructorTest
{
    public String name;
    public int count;
    public ConstructorTest(String name, int count)  // *当提供了自定义的构造器时, 不能再通过new ConstructorTest()创建实例, 因为该类不再包含无参数的构造器.
    {
        this.name = name;
        this.count = count;
    }
    public static void main(String[] args)
    {
        ConstructorTest tc = new ConstructorTest("亚吼吼吼", 9999);
        System.out.println(tc.name);
        System.out.println(tc.count);
    }
}

17. 构造器可以重载. 使用this调用另一个重载的构造器只能在构造器中使用, 且必须作为构造器执行体的第一句.


18. Java是单继承, 每个子类只有一个直接父类. (子类 == 基类, 父类 == 超类.)( *子类不能继承父类的构造器.)

修饰符 class SubClass extends SuperClass
{
    // 类定义部分
}
定义一个类时如果没有显示指定这个类的直接父类, 则这个类默认扩展java.lang.Object类. 所以java.lang.Object类是所有类的(直接or间接)父类.


19. 子类包含与父类同名的方法的现象叫方法重写或方法覆盖(Override). 遵守"两同两小一大": 方法名相同, 形参名相同; 子类方法返回值类型比父类方法返回值类型更小或相等, 子类方法声明抛出的异常类比父类方法声明抛出的异常类更小或相等; 子类方法的访问权限比父类方法的访问权限更大或相等. 且覆盖方法和被覆盖方法要么都是类方法, 要么实例方法.


20. 子类覆盖了父类法后, 子类的对象无法访问父类中被覆盖的方法, 但可以在子类方法中调用父类中被覆盖的方法. 如果需要在子类方法中调用父类中被覆盖的方法, 可以使用super(被覆盖的是实例方法) 或者父类类名(被覆盖的是类方法) 作为调用者来调用父类中被覆盖的方法.


21. super用于限定该对象调用它从父类继承到的Field或方法.( *正如this不能出现在static修饰的方法中一样, super也不能出现在static修饰的方法中. (即this和super都是代表对象.))


22. 方法重载和方法重写分别是 overload和override. (重载发生在同一个类的多个同名方法之间, 重写发生在子类和父类同名方法之间.)


23. ((父类名)子类实例名).方法 --->调用父类的方法. 相当于显式地将子类实例转型为指定的父类.


24. *多态(polymorphism): Java引用变量有两种类型: 编译时类型 和运行时类型. 编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定. 如果编译时类型和运行时类型不一致, 就可能出现所谓的多态.

SuperClass sp = new SubClass();

sp总会表现出子类方法的特征. 但它不能调用子类方法里所独有的(不是重写的)方法. 与方法不同, Field不具备多态性.


25. 强制类型转换 

(type)variable;

  1. 基本类型之间转换只能在数值类型之间转换(整数型、字符型、浮点型). (数值类型和布尔类型间不能.)
  2. 引用类型之间转换只能在具有继承关系的两个类型之间进行. (如果试图把父类实例转换成子类类型, 则这个实例必须实际上是子类实例才行(即编译时类型为父类类型, 而运行时类型是子类类型), 否则运行时引发ClassCastException.

26. instaneof 运算符的前一个操作数通常是一个引用类型变量, 后一个是类, 用于判断前面的对象是否是后面的类或其子类、实现类的实例. 返回boolean变量. (instanceof运算符前面的操作数的编译时类型要么与后面的类相同, 要么与后面的类具有父子继承关系, 否则引起编译错误.)


27. final修饰符: 如果父类中的方法需要被外部类调用, 则必须以public修饰, 但又不希望子类重写该方法, 可以使用final修饰符.


28. 实现类的复用方法有继承和 *组合.


29. 初始化块: 作用is初始化对象or others. 一个类里可以有多个初始化块, 相同类型的初始化块(初始化代码(下例中(int a =9;))之间有顺序(前面定义的先执行). 初始化块在构造器之前执行. 初始化块儿的修饰符只能是static, 使用static修饰的初始化块叫静态初始化块.

public class InstanceInitTest
{
	{
		a = 6;
	}
	int a = 9;
	public static void main(String[] args) {
		System.out.println(new InstanceInitTest().a); // 输出9
	}
}

* 创建一个对象时, 系统先为该对象的所有实例Field分配内存(前提是该类已经被夹在过了), 接着程序开始对这些实例变量执行初始化, 其初始化顺序是: 先执行初始化块或声明Field时指定的初始值, 在执行构造器里指定的初始值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值