面向对象基础
版权声明:任何人不得以非法或盈利目的进行营销,转载须经本人同意.本人不为此内容正确与否负责.
面向过程和面向对象都是对软件分析,设计和开发的一种思想(相辅相成),它指导者人们以不同的方式去分析,设计和开发软件
基本概念
构造器(方法)
构造方法的重载和普通方法基本没有区别
构造方法的第一句总是super()
注意:
* 1.构造方法没有返回类型
* 2.构造方法的方法名即类名
* 3.一个类中如果没有提供任何构造方法,则系统会自动提供一个默认的空参构造器
* 如果一个类中已经定义了构造方法,则系统就不会自动提供默认的空参构造器了
*
* 构造方法和set方法的异同:
* 相同:都可以给对象赋值
*
* 不同:
* a.赋值时机不同,构造方法是在创建对象时赋值,set方法是在创建对象后赋值
* b.使用次数不同,构造方法只能使用一次来赋值,set方法可以使用任意多次
* c.验证方式不同,set方法可以添加参数验证 ,构造方法默认情况下无法判断
*
* 问题:如果想要让构造方法也可以实现参数有效性判断?
* 在构造方法中直接调用已经写好判断能力的set方法即可
.......
public Customer(String name, String phone, String address) {
//this.name = name;
//调用自己类中的set方法实现name赋值,由于set方法已经做过参数有效性判断,
//所以此处同样具有相同功能
setName(name);
this.phone = phone;
this.address = address;
}
......
public void setName(String name) {
if (name.equals("梅超风")) {
this.name = "admin";
return;
}
this.name = name;
}
this的本质
创建一个对象分为如下四步(三步):
-
分配对象空间,并将对象成员变量初始化为0/false/null
-
执行属性值的显示初始化
3(2). 执行构造方法(因此,执行构造之前,对象已经创建完毕->1-2) -
返回对象的地址给相关的变量
-
this可以表示->当前对象
this的本质就是"创建好的对象的地址".优于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表"当前对象".(写实体类时,创建构造方法-> this.a=a;…) -
可以通过this在构造方法中__调用构造方法__(重载构造方法时减少冗余)
public class TestThis{
..........
TestThis(int a){
this.a = a;
}
TestThis(int a,int b){
this(a); //注意:调用构造方法的语句只能放在第一句
this.b = b;
}
}
- this不能用于static方法中
原因:this表示当前对象,而对象的数据信息存放在堆内存中,而static存放在内存中的方法区,获取不到
而且static不能访问非static属性和方法也能体现于内存划分.
static
- 静态方法
- 静态属性–类加载时只执行一次,执行的时机是在类加载过后
注意:一切静态属性/静态方法的初始化时机都是早于普通属性和普通方法
类加载->初始化静态成员(一次)->初始化普通成员(多次,根据调用构造方法) - 静态代码块
- 静态导入 – 导包时,import static com.corejava.util.DateUtil.parseDate;
parseDate()即可直接使用,不需要前缀(效果相当于在本类定义此方法)
在类中,用static声明的成员变量为静态成员变量,也称为类变量.类变量的生命周期和类相同.在整个应用程序执行期间都有效
static修饰的成员变量和方法从属于类,普通变量和方法从属于对象
静态初始化块
构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员
注意:
静态初始化执行顺序
- 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止
- 构造方法执行顺序和上面顺序一样!
语句块
语句块分为四种
参数传值机制
java中,方法中所有参数都是"值传递",也就是"传递的是值的副本",也就是说,我们得到的是"原参数的复印件,而不是原件".因此,复印件改变不会影响原件(引用类型也是传值,但它的值是地址)
package
- 通常是类的第一句非注释性语句
- 包名:域名倒着写即可.再加上模块名,便于内部管理
注意: - 写项目时都要加包,不要使用默认包
- com.buendia和com.buendia.car,这两个包没有包含关系,是两个完全独立的包(只是逻辑上前者包含后者)
import
- java.lang是java核心包,不需要导入直接使用(默认导入其包下的所有类)
- 如果导入两个同名的类,只能用包名+类名来显示调用相关类
extends
- 父类也称作超类,基类,派生类
- java中类只有单继承,但接口有多继承
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)
- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
- eclipse中默认按ctrl+T可以查看类的继承树
instanceof 运算符
二元运算符,左边对象右边类,当对象是右边类所创建对象时(或者对象所属类的父类),返回true,否则false
override
子类通过重写父类的方法,可以用自身的行为替换父类的行为
__注意:__方法重写需要符合下面三个要点
- “==” : 方法名,形参列表相同
- “<=”: 返回值类型和声明异常类型,子类小于等于父类
- “>=”: 访问权限(范围),子类大于等于父类(如父类方法为public,则子类只能是public)
Object类(java.lang)
是所有java类的根基类,也就意味着所有的jav对象都拥有Object类的属性和方法
Object类中定义有public String toString()方法.其返回值是String类型,Object类中toString()源码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
根据如上可知,默认会返回"类名+@+16进制的hashcode",在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法
"==“和"equals()”
"=="代表比较双方是否相同.如果是基本类型,则表示值相等,如果是引用类型则表示地址相等即:是同一个对象
Object类中定义有:(我们经常重写它)
public boolean equals(Object obj)
return (this == obj);
提供定义"对象内容相等"的逻辑 注意,Object中的equals()底层用"=="实现
String(其他很多类也重写了)中重写了equals(),可以很方便的用equals()进行String字符串的值的比较,而非地址
super
super是__直接__父类对象的引用.可以通过super来访问父类中被子类覆盖(重写)的方法或属性
使用super调用普通方法时,语句没有位置限制,可以在子类中随便调用
若是构造方法的第一行代码没有显式调用super(…)或者this(…),那么java默认都会调用super(),含义是调用父类的无参构造方法,这里的super()可以省略
继承树追溯
属性/方法查找顺序(例如查找变量h)
- 查找当前类中有没有属性h
- 一次上溯每个父类,查看每个父类中是否有h,直到Object
- 如果没找到,则编译错误
- 上边1-3,只要找到h,则此过程终止
构造方法调用顺序
构造方法第一句总是:super(…)来调用父类对应的构造方法.所以流程就是先追溯到Object,然后再依次向下执行类的初始化块和构造方法,知道当前子类为止.
__注意:__静态初始化块调用顺序,与构造方法调用顺序一样
封装(高内聚,低耦合)以及访问控制符
java是使用"访问控制符"控制哪些细节需要封装,哪些细节要暴露.
java中4中"访问控制符",分别为private,default,protected,public,他们说明了面向对象的封装性
修饰符 | 同一个类 | 同一包中 | 子类 | 所有类 |
---|---|---|---|---|
private | Y | |||
default | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
一般使用private访问权限
写boolean变量的get方法时is开头
多态
指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同
多态要点
- 多态是方法的多态,不是属性的多态(多态与属性无关)
- 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
- 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
对象转型
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型准换
向上转型后父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法
这时,我们就需要进行类型的强制转换,称之为向下转型.
在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型).否则会出现类型转换异常ClassCastException.
final
作用
- 修饰变量:被它修饰的变量不可改变.一旦赋了初值,就不能被重新赋值
- 修饰方法:该方法不可被子类重写,但是可以被重载
- 修饰类:修饰的类不能被继承.如Math,String等
foreach增强for循环
增强for循环for-each是JDK1.5增加的功能.专门用于读取数组或集合中的所有元素.即对数组进行遍历
final
作用
- 修饰变量:被它修饰的变量不可改变.一旦赋了初值,就不能被重新赋值
- 修饰方法:该方法不可被子类重写,但是可以被重载
- 修饰类:修饰的类不能被继承.如Math,String等
foreach增强for循环
增强for循环for-each是JDK1.5增加的功能.专门用于读取数组或集合中的所有元素.即对数组进行遍历