首页 > 代码库 > 黑马程序员_面向对象
黑马程序员_面向对象
------- android培训、java培训、期待与您交流! --------
面向对象
1、定义:
面向对象是相对于面向过程而言的
面向对象和面向过程都是一种思想
2、区别:
面向对象:
是将功能封装进对象,强调了具有功能的对象,不关注过程
面向过程:
强调的是功能行为,关注实现过程
3、关系:面向对象是基于面向过程的
4、面向对象的好处:
是一种符合人类思考习惯的思想。
可以将复杂的事情简单化。
将程序员从执行者转换成操作者。
5、就近原则:
局部没有就找成员,成员没有就找父类,父类没有,就找父类的父类。找的过程,只管值是多少,不管有没有。
6、匿名对象:
使用情况:
单独使用:一次使用或者链式调用。
作为参数:此时匿名对象必须对相应的属性有可用的值
封装
1、封装的好处:
将变化隔离;
便于子类使用;
提高重用性;
提高安全性;
2、关键字private:被修饰的成员只有在对象内部才能被调用
3、在封装的过程中通常将成员变量的赋值和取值的方法取成固定的名称:get获取/set设置
原因:故名知意;
尤其是在框架中,是对属性的set/get方法进行字符串的拼接及查找,所以必须设置成get/set方法,否则该框架无法使用。
4、构造方法
定义格式:
函数名与类名相同,不用定义返回值类型,没有返回值
如:class Person{
public Person(){}
}
作用:对象的初始化
5、this关键字在构造函数中的特殊用途
构造函数直接调用另一个构造函数时,直接使用方法名是会报错的,无法找到。
在构造方法中,使用this(参数),可以调用其他参数的构造方法,但必须在第一行。
this变量还有一种用途:在局部变量隐藏成员变量时使用。
Static
1、当一个属性需要被所有实例所共享式,可使用static关键字。
2、使用注意事项:
静态变量一旦赋值则影响所有的实例
静态方法不能访问非静态的成员
静态方法中不可以写this和super关键字
3、 特点:
静态成员直接使用类名调用
随着类的加载而加载,优先于对象存在
被所有对象所共享
4、用{}划定范围的代码区域
局部代码块:
位置:存在于方法中
作用:变量作用域的控制,影响变量的生命周期
构造代码块:
位置:直接存在于类中
作用:将构造函数中相同的代码块抽取出来,在构造器之前执行
静态构造代码块:
位置:直接存在于类中,使用static修饰
作用:初始化成员变量,只初始化一次
执行顺序:静态代码块-->构造代码块-->构造方法
5、对象实例化的过程:
默认初始化
显示初始化
静态代码块(只访问静态成员)
构造代码块
构造方法
注:显示初始化和静态代码块的执行顺序是由它们在代码中的顺序决定的,但一般显示初始化在前。
6、静态和非静态的区别:
静态修饰的:对象的共享数据
非静态修饰的:对象的特有数据
javadoc的使用
1、使用方法:javadoc -d doc -author -version Tools.java
2、注意事项:
生成文档的文件必须为java文件
生成文档的类必须为公共的或受保护的
最后生成的doc文件,只需关注index网页文件
继承
1、注意事项:
任何类都直接或者间接继承Object类,不包括数组;
System.out.println(引用变量)隐藏了一步:调用toString()方法的过程
java不支持多继承,但可以使用多实现
方法重写时,采用就近原则
2、super
super代表父类内存空间的标识
当子、父类有同名成员存在时,可以使用super关键字区分
当子类调用父类的构造方法时,使用super语句
3、方法的重写
方法的重写是子类的关系,目的是提高扩展性
方法重写注意事项:
方法体可以不同(从语法角度讲),而且必须不同(从实际业务角度讲);
方法体不同,其他都相同也叫方法重写;
访问权限:子类的大于等于父类的;
方法名、参数列表必须相同;
返回值类型:
父类的返回值类型为基本数据类型时(包括void),子类方法的返回值类型必须相同
父类的返回值类型为引用类型时,子类方法的返回值类型(此时是引用类型)必须是父类的子类;
方法重载不等于方法重写;
静态的只能重写静态的,静态的方法只能被静态的重写;
继承之后构造函数的关系
1、构造方法不能被继承,只能被调用(所以也不能被重写)
2、子类创建对象时,先调用父类的无参构造方法,再调用子类的无参构造方法。
虽然调用了父类的构造方法,但是没有创建父类的实例对象,只是在子类里面有一个内存空间。
3、父类的构造方法只负责对变量进行初始化
4、在构造函数中均存在super(),这个语句在第一行,会优先执行;不默认存在有参的super语句。super语句执行完后,应思考实例对象的创建过程。
5、如果父类不存在无参的构造方法,需手动的给出有参的super语句进行调用。或者使用this语句调用本身的其他构造函数
6、this和super不能同时存在
final关键字
final修饰的类,不可被继承
final修饰的变量,不可被修改
final修饰的方法,不可被重写
注意事项:
final修饰的变量必须有值,在构造方法结束前赋值即可。可在构造方法中或者构造代码块中赋值。
对于引用数据类型(除了String类型),被final修饰后,内部属性仍可以改变。因为引用所指向的对象地址没变。
多态
1、多态存在的前提:
有继承或者实现
方法重写,否则没意义
父类或者接口指向引用的实例对象
2、多态的特点:
成员变量:
编译时,看左边有没有该变量;
运行时,看左边变量对应的值。
非静态的成员方法:
编译时,看左边有没有该方法;
运行时,先看右边有没有重写该方法,有就调用右边的方法,没有就调用左边的。
静态的成员方法:编译运行全看左边,即父类。
3、多态的好处:
提高了程序的扩展性和可维护性
抽象类
抽象类不可以被实例化;
子类继承抽象类后,需重写抽象方法,否则不能被创建实例对象;
抽象方法存在于抽象类中。
接口
1、接口的特点:
A、接口中的方法都是抽象的
B、接口的成员的修饰符都可以省略
成员变量的特点:
被public static final修饰
必须有值
命名是要大写
可以通过类名调用
成员方法的特点:
被public abstract修饰
不能有方法体
子类重写接口的方法时,要用public修饰。
C、接口无构造函数。因为成员变量时常量,不需要初始化。
D、接口只能继承接口
E、实现类必须重写跟他有关接口的所有方法
2、接口的注意事项:
接口可以继承多个;
接口没有构造函数。
3、接口和抽象类的区别:
共性:都是不断抽取出来的概念;
不同点:
A、抽象类体现继承关系,一个类只能单继承
接口体现实现关系,一个类多实现
B、抽象类是”is a“的关系
接口是” like a”的关系
C、抽象类中可以定义非抽象的类,供子类直接调用
接口的方法全是抽象的,有固定的修饰符
简洁的描述为:
抽象类是继承体系的共性内容;
接口是继承体系的扩展内容。
内部类
1、内部类无法直接创建对象
2、访问特点:
内部类可以直接访问内部类的成员,包括私有的成员。
而外部内访问内部类需要创建内部类的实例。
3、内部类的两个定义位置:
成员位置:
A、访问格式:
Outer.Inner x=new Outer().new Inner();
相当于数据类型:Outer中的Innner类型
想创建内部类的实例必须创建外部类的实例,即分别调用Outer和Inner的构造方法(不考虑静态的情况)。
B、内部类被private修饰,保证数据安全;
内部类被static修饰,方便调用。
static修饰后的访问格式:Outer.Inner x=new Outer.Inner();
调用静态内部类的方法:Outer.Inner.method();
局部位置:
不能在其他类中直接创建内部类的实例对象;
也可以直接访问外部类的成员;
无法使用Outer.Inner进行访问;
访问的格式为:在所在方法创建对象后进行方法的调用,同时可以访问在局部中的局部变量,但要用final修饰。
匿名内部类
1、属于局部内部类
2、前提:
内部类可以实现或继承一个接口或外部类
3、格式:
new 类名或者接口名(){
覆盖类或者接口中的方法,也可以自己定义内容。
};
4、使用匿名内部类的好处:
内部类的效率高;
增强阅读性。
注:当接口或者抽象类有多个方法是,使用匿名内部类十分麻烦。
包
1、访问一个类中分别被四种修饰符修饰的方法:
public protect 默认 private
本类访问: √ √ √ √
同包中的类访问: √ √ √ ×
不同包中的子类: √ √ × ×
其他包中的无关类: √ × × ×
2、跨包访问的注意事项:
跨包访问时,被访问的类需要被public修饰
可采用导包的方式解决不同包中的访问问题
当有多个包有相同的类名的类时,只能导入一个包里的这个类,而另外包中的相同名称的类只能使用权限定名(包名.类名)。
3、包的命名规则:
使用package加指定包名放在第一行。如 package cn.itcaseheima;
全部小写,如果是多级包,用“.”分开,域名反写。如黑马的包 itcaseheima.cn 应写成 cn.itcaseheima.
4、包中类的编译:
使用javac -d.类名.java可以将class文件直接生成到包中。
包中类的运行:
使用权限定名:java 包名.类名。
黑马程序员_面向对象