面向对象
01什么是面向对象
面向过程:线性思维,按步骤做,适合处理简单的问题
面向对象:物以类聚,适合处理复杂的问题,分类的思想
宏观面向对象,微观面向过程
面向对象编程oop本质:以类的方式组织代码,以对象的方式封装数据
三大特征:封装,继承,多态(同一个对象有多个状态)
类是抽象的概念,对象是具体的
02回顾方法的定义
访问权限
Public公共的
Default包访问权限,在自己的包可以随意访问
Private私有的
03回顾方法的调用
静态方法static :通过类名.方法就能调用
非静态方法:new一个对象,用该对象名.方法
非静态方法不能直接调用静态方法。静态优先于类产生。
在静态里面不能用this,因为this是调用类的,静态优先于类产生,在静态方法里可以直接调用静态的东西,也可以使用类名去访问静态方法
04类与对象的创建
类:是一种抽象的数据类型。(属性+方法)
对象:对抽象概念的具体实例。
使用new关键字创建对象,除了分配内存空间外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。
成员变量初始值
Java中所有的变量都是先声明再赋值才能使用
Java中的成员变量,在创建对象的时候都会执行一次初始化赋值操作
Int 0
Byte 0
Short 0
Long 0
Float 0.0
Double 0.0
Char 空 其实给的也是0
Boolean f 其实也是0
String null(空,等于什么都没有)(string是Java提供的一个类)
Xxx null(自己写的类)
05构造器详解
1.和类的名字相同
2.没有返回类型
06创建对象内存分析
方法区也是堆!!!!
07简单小结类与对象
1.类与对象
2.方法:定义和调用
3.对应的引用:
引用类型:基本类型之外的类型,对象是通过引用来操作的,指向对象的地址
4.属性(成员变量):默认初始化
char默认值:u0000
5.对象的创建和使用
必须使用new关键字和构造器创建。
对象的属性和方法都用.调用
6.类:
静态的属性和动态的行为
08封装
封装:属性私有,get and set
高内聚低耦合!!!!
高内聚就算类的内部数据操作细节自己完成
低耦合仅暴露少量的方法给外部使用
Private私有的
成员变量一般用private保护成员变量不被胡乱赋值
Getter:从成员变量中获取数据
Setter:给成员变量赋值且给一些保护工作
快速生成:空白位置-右键-generate-getter and setter-全选-ok
封装的好处:
1.提高了程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护性增加了
09继承extands
继承(什么是什么可以写成继承,类与类之间的关系
java只有单继承!!!!
父子关系:子类可以拥有父类中除了私有内容的其他所有内容
子类是父类的扩展
当出现x是一种y的时候,x就可以继承y
Public class 类extend父类{
}
简化代码的开发
子类对父类进行了扩展
Object
万事万物皆为对象
在java中所有的类都默认继承object
Object是一个类,所有类的根
我们写的类即使不写继承,也会默认继承object
10Super
super:表示父类中的内容
可以调用父类的构造方法,必须写在子类构造方法的第一行
super必须只能出现在子类的方法或构造方法中
super和this不能同时调用构造方法(因为都要写在第一行)
this();本类的构造
super();父类的构造
如果父类的构造是无参数的可以不写,有参数的要写
用super和this来区分父类和子类中重名的内容
创建子类要先创建父类
在子类构造方法的第一行会默认调用父类的构造方法
变量查找顺序,先找自己类,再找父类
11方法重写
非静态的方法可以进行重写,只能是public
重写:子类对父类中提供的方法进行重新定义
语法:子类和父类中的方法的声明完全一致,但方法体不同
方法名必须相同,参数列表必须相同,修饰符范围可以扩大,但是不能缩小,抛出的异常可以被缩小,不能被扩大
public>protected>default>private
本质:方法的覆盖
为什么需要重写:父类的功能,子类不一定需要,或不一定满足
不能被重写的方法:static,final,private
12多态
动态编译:可扩展性
同一个对象拥有多种形态(方法的多态)
把子类的对象赋值给父类的引用变量称之为向上转型
会屏蔽掉子类特有的方法,不能调用子类特有的方法
只能使用父类和子类都有的子类方法。
把父类的变量转化回子类的变量称之为向下转型、
向下转型有风险,Java要求必须写强制类型转换(就可以使用子类特有的方法了)
(子类类型)变量
ClassCastException 类型转换异常
多态的作用把不同的数据类型进行统一,让程序具有超强的可拓展性
父类的引用可以指向子类
静态方法的调用只和左边定义的数据类型有关。
非静态方法和右边有关
13Instanceof关键字
判断对象是什么类型的
判断a是否是b if(a instanceof b)
ab存在父子关系返回T
14static关键字
静态属性最好用类名调用!
一般是多个对象共同使用的。
{
//匿名代码块
}
static{
//静态代码块
}
执行顺序,先执行静态代码块,后进行匿名代码块,最后执行构造方法
静态代码块只执行一次
静态导包 import static +包名
Final最后的
被final修饰的变量不可以被改变
又被称之为常量
被final修饰的方法不可以被重写
被final修饰的类不可以被继承
15抽象
现实中不存在的东西java只声明不实现
Abstract修饰方法,这个方法就是个抽象方法,抽象方法没有方法体,直接;结束 (是一种约束,子类必须实现它的方法,除非子类是抽象类)
特点
抽象类不可以创建对象(不能new,只能用子类实现)
抽象类的子类必须重写父类中的抽象方法,否则子类也是抽象类
通过抽象类可以强制要求子类中必须有哪些方法
抽象类中可以用正常的方法
类中如果有抽象方法,类必须是一个抽象类
16接口
接口中只有抽象方法,本质是契约!!(只有方法的定义,需要实现/重写)
接口中定义的属性都是静态常量(一般不用)
也具有多态性 可以把很多不相关的东西进行整合
接口实际上是一种特殊的抽象类
接口中所有的方法都是抽象方法,可以省略abstract
接口里所有的内容都是公开的,可以省略public
能继承接口的只能是接口
接口和类只能是实现关系implements ,必须要实现/重写抽象方法
接口一样具有多态性
接口使用interface来声明
类只能单继承,接口支持多实现
类可以继承一个类,实现多个接口
接口的实现类命名规则:接口名+Impl
接口的特点:
接口中所有的方法都是公开的抽象方法
接口中所有的变量都是全局静态常量 public static final
17N种内部类
什么是内部类?
定义在类内部的类。
外部类正常使用内部类,内部类可以使用外部类的所有方法和属性(包括抽象方法
一个Java类中可以有多个class类但是只能有一个public class
1.成员内部类(非静态的内部类)
通过外部类来实例化内部类
Outer outer=new Outer();
Outer.Inner=outer.new Inner();
2.静态内部类
编译完成后没有指向外部类的引用
创建不需要以来外部类
只能使用外部类静态的方法和属性
3.局部内部类(方法中的内部类)
只能在定义该局部类的方法中使用
定义在实例方法中的局部类可以使用外部类全部
定义在静态方法中的局部类只能使用外部类的静态方法和变量
局部类也能使用方法中的参数和局部变量(只能是final形式!!)
4.匿名内部类
可以使用外部类的所有,一般用于回调函数和监听
equals and ==
Equals object提供的方法,判断两个对象是否相等,也是判断内存地址
C1.equals(c2)
判断左右两端数据是否相等,默认判断两个对象的内存地址是否一致,一般用在基本数据类型上
可以自己重写equals
String a=“”
String b=“”
字符串相等就会返回true,因为相同字符串并没有单独占用内存空间 都是t
String x=new string(“”)
String重写了equals方法,判断内容是否一致 t
String里面的判断的是地址 f
字符串的判断必须用equals
Tostring
直接打印对象默认执行对象的tostring ()方法
返回包名+类名+@+内存地址
对一个对象的字符串的表示形式