面向对象:
摈弃基于逻辑的思维,从用户的角度出发进行编程
类和对象
类是一类事物的描述,抽象出来的概念上的定义,而对象是实际存在的个体。
比如猫是一个类,布偶猫是猫的一个子类,那么我家的那只就是一个对象。(会有的!)
类的语法格式:emm不用写了
类的主要内容:
-
成员变量
对象状态,比如猫的毛色,猫有几条腿。
-
成员函数
对象行为,比如猫的喵喵喵叫,猫的抓老鼠行为。
-
静态变量
全局唯一,只有一份,可以看成类的性质,他没法使用this,没法引用成员变量和成员方法。比如猫的尾巴只有一条,这种类共有的属性
-
静态函数
类似静态变量,静态函数就是这一类所共有的方法。
-
构造函数
创建对象,给对象进行初始化。
没有返回值类型,不能被static final synchronized abstract native 修饰
封装
隐藏一个类中不需要对外提供的实现细节。
尽量使用private和public!
继承
is-a
子类增加或者修改基类的(成员变量或者函数)
使用super访问父类!
没有办法进行多重继承,因此引入了接口。
接口和抽象类很相似!为什么还是有存在必要的?
抽象类可以有成员变量
抽象类可以有部分实现
抽象类不可以有多重继承,而接口可以
多态
多态是面向对象中最重要的概念,提高了代码的通用性,常称作接口重用:在Java中
对象的多态性:父类引用指向子类对象(可以直接应用在抽象类和接口中)
Java的变量有两个类型:编译时类型和运行时类型
编译时类型由声明该变量的类型决定,而运行时的类型由赋予该变量的对象决定,实际上就是变量指向的对象类型。若编译时类型和运行时类型不一致,那么就出现了对象的多态性。
理解:子类可以看成是特殊的父类,所以父类的引用可以指向子类对象
注意:
如果说,引用类型变量如果声明为父类的类型,实际上是子类对象,那么变量就不能再访问子类中添加的属性和方法。
编译在左运行在右
重载和重写
-
重载:
同一类中同名不同参。
与返回值类型无关。只看参数列表。那么为什么与返回值类型无关?
举一个简单的例子,假设他们相关了,那么如果在调用的时候,不接收返回值,那么他该调用哪个函数?
public void fun(){ //todo } public int fun(){ return 1; } //在使用的时候,比如调用了 fun(); //如果按照返回值类型重载的话,调用哪一个?
-
重写:
覆盖掉父类的方法。
注意:
必须要和父类有相同的方法名称参数列表,返回值类型不能大于父类的返回值类型
访问权限不能小于父类的访问权限。
抛出的异常不能大于父类抛出的异常
从编译运行的角度来看:
重载的调用地址再编译期就已经绑定了。称为(早绑定或静态绑定)
对于多态,是等方法调用的那一刻,根据指向对象的类型,调用具体的方法。(晚绑定或动态绑定)
super与this
关于super:
用来调用父类中的指定操作:
子父类出现同名函数,super表调用父类的。
子类的所有构造器都会默认访问父类中的空参构造器。
关于this:
在方法内部使用时,戴白哦这个方法所属的对象的引用。
在构造器内部使用时,代表该构造器正在初始化的对象。
构造器可以重载,但是不能通过this来调用构造器本身。
例如:是不行的
public Cat(String color){ this(color); }
不可变性
final实现,类:不可以被继承
函数:不可以再派生类中重写
变量申明: 变量不可以指向其他对象。但是内容真的不可变吗?
如果是一个列表,那么可不可以对里面进行add,内容可变!
使用Collection。unmodifiablelist可以
static final 用于常量,名称一般大写。
final关键字无法保证不可变性。
所以从接口的定义和类的实现上保证不可变性。
从构造函数中传入。