黑马程序员-Java面向对象
1. 什么是面向对象?
将功能封装进对象,强调具备了功能的对象。
特点: 将复杂的事情简单化, 面向对象将以前的过程中的执行者,变成了指挥者。
2. 类和对象的关系
类是具体事物的抽象,概念上的定义;对象即是该类事物实实在在存在的个体。
Java中用类描述事物就是描述事物的属性和行为。
成员变量和局部变量的区别?
|--成员变量: 定义在类中,整个类中都可以被访问;
随着对象的建立而建立,存在于对象所在的堆内存中;
有默认初始化值。
|--局部变量: 只定义在局部范围内;
存在于栈内存中,作用的范围结束,变量空间会自动释放;
局部变量没有默认初始化值。
匿名对象:当对对象方法仅进行一次调用时;匿名对象可以作为实际参数进行传递。
3. 面向对象的特征
|--封装: 隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离;便于使用;提高重用性;提高安全性。
构造函数
特点:函数名与类名相同
不用定义返回值类型
不可以写return语句
作用: 给对象初始化
|--继承:共性抽取。多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,提高代码复用性。
好处:提高了代码的复用性;让类与类之间产生了关系,多态的前提。
特点:Java只支持单继承,但是支持多层继承(继承体系)
|--抽象类
特点:1. 抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰。
2. 抽象方法只定义方法声明,并不定义方法实现。
3. 抽象类不可以被实例化
4. 只有通过子类继承抽象类并实现其中所有抽象方法后,该子类才可以实例化。‘
细节:1. 抽象类中有构造函数,用于给子类对象进行初始化。
2. 抽象类可以定义非抽象方法。
3. 抽象关键字abstract不可以与final,private,static共存。
4. 抽象类中可以不定义抽象方法。
模板方法设计模式:当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
|--接口:接口是对外提供的规则;是功能的扩展;接口的出现降低了耦合性。
具有固定的成员修饰符:成员变量 public static final
成员方法 public abstract
特点:1. 类与接口是实现关系implements。
2. 接口可以被多实现,避免了单继承的局限性。
3. 接口可以多继承接口。
抽象类与接口的区别:
1. 抽象类只能被单继承;接口可以被多实现。
2. 抽象类中可以定义非抽象方法,子类可以直接继承使用;接口中都有抽象方法,需要子类去实现。
3. 抽象类使用的是is a关系;接口使用的是like a关系。
4. 抽象类的成员修饰符可以自定义;接口中的成员修饰符是固定的:public。
覆盖与重载
|--覆盖(override):子父类一模一样。
注意:父类中的私有方法不可以被覆盖;
覆盖时,子类方法权限要大于等于父类方法权限;
静态只能覆盖静态。
|--重载:只看同名函数的参数列表。返回值可以相同也可以不同,无法以返回值类型作为重载函数的区分标准。
|--多态:事物的多种体现形式
体现:父类引用指向子类对象。
好处:提高了程序的扩展性。
弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以方法子类中特有的方法。
前提:1. 必须要有关系(继承、实现)。
2. 通常会有覆盖操作。
内部类:将一个类定义在另一个类的里面,
访问特点: 1. 内部类可以直接访问外部类中的成员,包括私有成员。
2. 而外部类要访问内部类中的成员必须要建立内部类的对象。
4. 关键字
|--this:this代表本类对象的引用。
什么时候使用this?
当在函数内需要用到调用该函数的对象时,就用this。
|--super:super代表父类引用
作用:当子父类出现同名成员时,可以用super进行区分;
子类要调用父类构造函数时,可以使用super语句。
关于super()和this()
两个语句只能有一个定义在第一行,所以只能出现其中一个;
因为super()或者this()都是调用构造函数,构造函数用于初始化,初始化的动作要先完成,所以一定要定义在第一行。
|--static
被static修饰后的成员具有的特点: 随着类的加载而加载;
优先于对象存在;
被所有对象所共享;
可以直接被类名调用。
注意点: 静态方法只能访问静态成员;
静态方法中不可以写this, super关键字;
主函数是静态的。
|--final:可以修饰类,方法,变量
特点: 被final修饰的类是一个最终类,不可以被继承;
被final修饰的方法是一个最终方法,不可以被覆盖;
被final修饰的变量是一个常量,只能赋值一次。
5. 异常
Throwable:子类以父类名作为子类的后缀名。可抛出性。
|--Error:错误,通常出现重大问题时,不编写针对代码对其处理。
|--Exception:在运行时运行出现的一切情况,可以通过try catch finally处理。
Throwable中的方法:
|--getMessage():获取异常信息,返回字符串。
|--toString():获取异常类名和异常信息,返回字符串。
|--printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值vvoid。
|--printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
throws和throw:
|--throws:用于标识函数暴露出的异常;用在函数上,后面跟异常类名。
|--throw:用于抛出异常对象;用在函数内,后面跟异常对象。
异常处理:
try{需要检测的代码}catch(异常类、变量){异常处理代码}finally{一定会执行的代码}
注意:finally代码块只有一种情况不会被执行,就是在之前执行了system.exit(0)。
自定义异常:
步骤:1. 自定义类继承Exception或者其子类。
2. 通过构造函数定义异常信息。
3. 通过throw将自定义异常抛出。
异常细节:
1. RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
2. 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
3. 如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常。
包之间的访问: