什么是面向对象?
1.面向过程思想
答:线性过程 第一步做什么 第二步做什么
2.面向对象思想
答:物以类聚有,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行全面过程的思索
面向对象编程(oop)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织数据
三大特性
1.封装
2.继承
3.多态
类和对象的关系
类:类是一种抽象的数据类型,它是对某一类事务的整体描述/定义,但并不能代表某一个具体的事物,比如:手机,动物,植物 等等.....
对象:对象是抽象概念的具体实例,例如:狗就是属于动物类中的一个具体实例
创建与初始化对象
使用new关键字创建对象
先有对象才有类 先定义一个总的类 例如 人类 在人类中可以分为name与age 然后再到对象中取实现这个,因为有很多人每个人不同名字不同年龄 所有不能在类中写死 于是有了对象 对象可以定义不同的类 例如在对象中:xiaoming 20 xiaohong 19;
类:这里定义了name 与age 但是要在对象中给他们赋值
对象:对象在方法中实现 这个分别给name与age赋了 xiaoming 与 xiaohong 以及给他们分别赋了 20与19并且在方法中输出了赋予值的属性
构造器详解
什么是构造器?
构造器也叫构造方法作用是构造一个类的实例,确保对象能够初始化
根据有无参数,构造器可分为无参构造和有参构造
构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象实例进行默认的初始化
构造器的特性
1.与一般方法名不同的是,构造方法名必须和类名保持一致,并且没有返回值,甚至连void都没有。
2.Java编译器会自动创建无参构造函数,因此在类中,无参构造即使没有,我们也可省略不写。实例化对象时无需赋值
3.倘若类中已存在有参构造函数,则编译器不再提供默认无参构造。实例化对象时需赋值,不然报错。
4.当类实例化一个对象时会自动调用构造方法。
5.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承
6.每个类可以有零个或多个构造方法.
简单小结类与对象
1.类与对象
类是一个模块,抽象的。对象是一个具体的实例
2.方法
定义,调用
3.对象的引用
引用类型:基本类型(8)
对象是通过引用来操作的:栈-》堆
4.属性:字段Field 成员变量
默认初始化:
数字:0 0.00
char: u0000
boolean:false
引用:null
修饰符 属性类型 属性名 = 属性值
5.对象的创建与使用
-必须要new创建对象,构造器 Person kuangsheng = new Person();
-对象的属性 kuangshen.name
-对象的方法 kuangshen.sleep()
6.类:
静态的属性 属性
动态的行为 方法
封装
高类聚,低耦合
封装是将对象封起来 如何封起来呢 就要用到private private:私有的
在创建对象时要使用private 例如:private String name; 这里将name给私有化了
私有化之后在类中就获取不到呢怎么办呢,这时就要在对象下面加上get和set方法
get:获取这个数据 例如sout(student.getName),这样就能输出name的值了
虽然能获取数据 但是怎样给数据赋值呢。这时就要用到set方法
set:给这个数据设置值 例如 student.setname("李旺") 这样就能给通过set方法给name进行赋值
小结:封装就是把属性私有化了,让外部不能随意更改值和获取值 只能通过get和set方法获取
继承
继承顾名思义,可以理解为儿继承父亲 儿子可以继承父亲里面所有东西
如何来继承呢? 继承需要用到一个单词就是"extends" 单词后面加上继承的父类名字
例如:LiWang extends WangMy 这个意思就是李旺类继承了王明阳类
继承的作用继承中子类可以用到夫类的使用东西 对象,方法等等
但是前提是父类中需要使用public公共的 但是private私有的也没关系通过getset请求就好了
super关键字
1.super调用父类的构造方法,必须在构造方法第一个
2.super必须只能出现在子类的方法或者构造方法中
3.super和this 不能同时调用构造方法
super 和 this 区别
1.代表对象不同 this:代表调用者这个对象 super:代表父类对象的应用
2.前提 this:没有继承也能使用 super:只能在继承调条件下才能使用
3.构造方法区别 this:this()本类的构造 super();父类的构造
重写
假设子类继承了父类所有的属性 但是子类要写个方法和父类名字一样的方法 这时就用到了重写@Override 这样既不改变方法名又可以使用到子类中与父类名字一样的方法
需要继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大但是不能缩小
4.抛出的异常:范围可以被缩小,但不能扩大
重写子类的方法和父类必须一致:方法体不同!
为什么需要重写:
1.父类的功能子类不一定需要,或者不一定满足
多态
多态前提条件:必须有父子关系
多态的定义格式 :父类类型 变量名 =new 子类类型();
在使用多态后的父类引用变量调用方法时,会调用子类重写的方法
多态的注意事项
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系 类型转换异常
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象
关键字 instanceof
instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false
注意看 标红的object不是Person的上级那个Object 这个object对象是属于Student类中的
Objecct > Person >Student
所以 student中的 object是属于 Student,Person,Object中的,所以为True
为什么到与Teacher比较为Flast呢 因为Student与Teacher同一个级别 Teacher不属于Student的上级
当Student的下级进行比较 结果也为Fales
类型转换
当一个父类想调用子类方法 是不能直接进行调用的 得强制转换 被称为高转低
高转低后才能用到子类中的方法
子类想要父类直接调用
抽象类
1.不能new这个抽象类 只能子类去实现他:约束!
2.抽象类中可以写普通方法
3.抽象方法必须在抽象类中
接口定义与实现
接口定义需要用到关键字 interface 在接口类里面写方法 也只能写方法 不能写实现方法过程
实现类 实现类实现接口类中的接口 在里面写方法
实现类用到一个关键字 implements 后面接上接口类名字 然后会自动让你重写方法里面的方法体
一个实现类可以实现多个接口