面向对象
类
对某一类事物的共性进行抽象,形成的叫类
面向对象与面向过程?
-
面向过程是以方法为单位进行组织
-
面向对象是以类为单位进行组织
合适的方法应该出现在合适的类中
面向对象特征
封装、继承、多态
基本概念
类
什么叫类?
对同类个体(对象)的共性进行抽象,形成的叫做类.
###类的特点
共性:
-
属性(成员变量)
-
行为(动作、方法)
一个文件中可以有多个类,但是只允许有一个类是public的,并且public这个类的名字要和文件名一致。
推荐做法: 一个文件一个类
类的定义
使用关键字class来进行定义
>calss{
}
对象
以类为模板创建出来的具体的某一个东西 叫做对象。
以为类模板创建对象的这个过程我们称为对象的实例化。
使用new来创建对象
-
属性的使用
设置属性的值 :对象名.属性名 = 值;
获取属性的值 :对象名.属性名
-
方法的使用
调用方法 : 对象名.方法名();
构造方法
-
与类同名,没有返回类型(连void都没有)
-
构造方法在创建对象的时候进行调用
-
只要写好一个类(class)之后,这个class中自动会有一个没有参数的构造方法存在
如果这个类中自己手动加了有参数的构造方法,那么这个没有参数的构造方法就消失了。
如果非要调用没有参数的构造方法,需要在类中手动声明。
public class A { A(){//手动声明的没有参数的构造方法 } A(int a){//构造方法 System.out.println("A的构造方法。。。。"); } void A(){//不是构造方法 System.out.println("普通方法。。。。"); } public static void main(String[] args){ A a = new A(); } }
class A { A(){//手动声明的没有参数的构造方法 } A(int a){//构造方法 System.out.println("A的构造方法。。。。"); } void A(){//不是构造方法 System.out.println("普通方法。。。。"); } public static void main(String[] args){ A a = new A(); } }
方法重载
overload
-
针对体是针对的方法
-
什么样的方法构成重载,满足以下特点:
1、方法名相同
2、参数不同(参数的类型或者参数的个数不同)
3、与返回类型无关
站在调用者的角度,你调用方法的时候能正确区分调用的是哪个方法,那么这两个方法就构成重载
构造方法同样支持重载
this
-
this只能出现在方法(非static的普通方法和构造方法)中
-
this就指的当前对象(谁调用 this就是谁)
-
使用this调用构造方法
-
直接使用this调用而不要使用this.
-
必须方法构造方法的第一行
-
static
-
可以修饰属性、方法、修饰内部类
-
static修饰属性的时候,这个属性的值是公用的,所有对象用的这个变量都是同一个值(对于这种static的属性我们可以使用类名.属性的方式进行访问)
-
如果一个方法是static方法,那么这个方法可以使用对象.方法名调用,也可以使用类名.方法名调用
如果这个方法是static方法,那么他直接调用(不是使用对象.方法名 这种方式调用)的其他方法应该是static方法
非static的属性或者方法,只能使用对象去访问
非static方法中,可以直接访问static或者非static的属性
static方法中,只能直接访问static的属性或者static方法。
-
-
什么时候使用static?
-
如果这个属性 要公有的时候就需要声明static
-
工具类中的方法一般都是static
-
-
static块、匿名块、构造方法
-
执行顺序: static块----匿名块----构造方法
-
执行次数: static块只执行一次
匿名块和构造方法 产生一个对象就执行一次。
-
继承
-
为什么要有继承
-
代码层面怎么实现继承(extends)
-
类与类之间是什么样的关系才能构成继承关系( is a)
-
注意点
在创建子类对象的时候,调用子类的构造方法,在调用子类构造方法的过程中,默认先调用父类的无参构造方法,如果父类没有无参的构造方法,那么会报错。
解决办法:
1、在父类加无参构造方法
2、使用super调用父类有参数的构造方法(只能放在第一行)
重写
override overwrite
-
针对的是方法(方法的重写)
-
要有继承
-
特点:
-
重写方法与被重写方法具有相同的方法名,相同的参数,返回类型一致或者兼容 (可以是子类)
-
重写方法不 能使用比被重写方法更严格的方法控制权限
-
未讲
-
-
如何来检验是否是构成重写 : @Override
Object
-
toString()
将一个对象用字符串的形式表示出来,默认的实现是:包名+类名 @ 十六进制hash码
更多的时候这个默认实现对我们来说毫无意义,所以我们需要重写 toString方法
在输出这个对象的时候默认会调用这个对象的toString方法。
-
equals()
用于判断两个对象是否相等
默认的实现 == (比较的引用地址)
重写
public boolean equals(Object obj){ //用于自己定义两个 狗对象 怎么才算相等的标准 if(this == obj) return true; if(obj instanceof Dog){//判断 obj是狗的类型 Dog d = (Dog)obj; // if((this.id == d.id) && this.name.equals(d.name)){ // return true; // } return (this.id == id) && (this.name.equals(d.name)); } return false; }
public boolean equals(Object obj){ //用于自己定义两个 狗对象 怎么才算相等的标准 if(this == obj) return true; if(obj instanceof Dog){//判断 obj是狗的类型 Dog d = (Dog)obj; // if((this.id == d.id) && this.name.equals(d.name)){ // return true; // } return (this.id == id) && (this.name.equals(d.name)); } return false; } -
hashcode()
返回这个对象的hashcode的值(可以认为是这个对象的身份证号)
-
wait()
-
notify()
-
clone(): 自学
-
finalize()
包
包是类的容器,分隔类名空间;
##为什么使用包?
1、类重名问题
2、具有相同功能,一类 我们应该归到一起
包的使用
使用package来声明包,包里面建类
import
import a.b.c.D;(精确导入) 推荐
import a.b.c.*(模糊导入)
有一个包下的类是不需要import的,这个包就是java.lang包
包命名
公司的域名 倒着写
所有的包名都是小写的
访问控制符
private、default(不写,并不是使用default关键字来修饰)、protected、public
-
都能修饰类(private\protected 修饰的是内部类)、都能修饰属性、都能修饰方法
-
private修饰的属性或者方法 只能在当前类能访问
-
default修饰的属性或者方法 只能同包的类中能访问(当前类能访问)
-
protected修饰的属性或者方法 只要在子类中都能访问(可以不同包 ,当前类能访问)
-
public 都能访问
使用的时候遵循的原则: 能用最小就不用最大的。
javabean的规范
遵循javabean规范的 我们一般才称为javabean(狭义javabean)
规范:
1、属性私有化
2、提供对应的getter 和setter方法
3、需要提供无参的构造方法
抽象类
-
抽象类的来历
反正子类都要重写父类的方法,那么父类这个方法的实现就毫无意义,我们只需要方法的签名就可以了,在java中只有方法的签名没有方法的实现,这个方法只能是abstract或者native修饰,在这里指的是abstract的,一个类中只要有一个方法是abstract的,那么这个类一定是abstract的。
-
注意点
所以抽象类天生就是用来被继承的。
抽象方法就是用来被重写的。
1、有抽象方法的类一定是抽象类
2、抽象类中一定有抽象方法吗?(不一定)
3、抽象类有构造方法
4、抽象类不能实例化
final
-
能修饰类、属性、方法
-
final修饰的类 是不 能被继承的
-
final修饰的属性 或者变量都是常量
-
final修饰的方法 不能被重写的
接口
为什么引入接口?
接口 解决java中类的单继承问题
接口强调的能力
接口具有什么样的特点?
接口中的方法全是抽象方法,默认是public abstract的(jdk8之前是正确的),jdk8之后里面允许有default方法
接口中的变量 一定是常量,默认是public static final的
接口中是没有构造方法的
-
接口和类之间的关系
类与类 只能继承关系 一个类只能继承一个类
类与接口 是实现关系 一个类可以实现多个接口
接口与接口是继承关系,并且可以是多继承
接口与抽象类
区别:
1、抽象类中的方法不一定是抽象方法,接口中的方法绝大多数都是抽象(除了default)
2、接口中的变量一定是常量,抽象类中的变量不一定是常量
3、抽象中有构造方法 ,接口没有构造方法
接口和抽象类、普通类的选择?
1、满足is-a关系 继承关系 has-a的关系应该是实现关系
2、根据 是否是常量来进行选择
3、为了满足多继承,可以设计为接口
多态
-
如何来认识多态
1、有继承或者实现 2、要有重写 3、父类引用指向子类对象
-
带来的好处
扩展性
面向对象的原则
-
OCP原则
-
职责单一
-
依赖倒置