面向对象:
**********************************************************************************************************
1.对象:万物皆对象,对象因关注而产生。
2. 类:是对象的抽象。
3. 属性:是对象身上的值数据。
4. 行为:是对象的功能。
**********************************************************************************************************
访问修饰符:
修饰符有4个: private ,默认 , protcter , public。
本类 同包子类 同包非子类 非同包子类 非同包非子类
private √
默认(同包) √ √ √
protected √ √ √ √
public √ √ √ √
可选修饰符:可选修饰符现在学了4个:static,abstract,final,default
static:
1.用于:类,属性,方法,初始化模块
2.效果:
static-属性:1.全类共享一个值
2.与对象无关 ------------------可以用类名加点访问,被称为类属性
3.单独存放在数据段的静态区。
4.在类加载期就产生了,划分空间。
static-方法:1.只能调用static的属性或者方法
2.非static方法可以调static方法或者属性
3.与对象无关,和类有关 ---------------类方法
4.在类加载的时候,JVM优先加载static修饰的属性或者方法
static修饰的特点:1.与对象无关,只与类有关 (面向对象分析上)
2.在加载期有特殊动作。
<一般工具类的工具方法可以用static修饰>
实例初始化块:会在产生对象的时候调用,在产生对象之后,但是在构造方法我们
写的代码之前被自动调用,它的执行时机导致他并不常用,完全可以把代码写在构
造方法里面。
静态初始化块: 1.不能操作非static属性和方法。
2.在加载期被自动执行,且只执行一次。
3.预加载资源的动作,就实现在静态初始化块中,项目中比较常见
abstract:
1.用处:类,接口,方法中。
2.意义:
1>这个类不能被实例化(即不能产生对象),而且可能包含未实现的方法。
2>所有接口都是抽象的,声明接口的时候这个是可选修饰符,不写默认。
3>这个方法没有方法块,也就是主体实现部分。主体由子类书写,直接分号结束。
4>所在类也必须是抽象的。
final:
1.用处:类,方法,变量
2.意义:
类:不能创建这个方法的子类。称为:终态类,最终类
方法:不能被重写。
变量:值不能改变的局部变量,方法参数等等。
default:
1.用处:方法
2.意义:
这个接口的方法实现是可选的,接口为不想实现这个方法的类提供一个
默认实现。
**********************************************************************************************************
方法的重载:
定义:是在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表:
指的是参数个数,参数类型,参数顺序的不同。
注意:1.重载必须通过不同的参数列表不同来进行重载。
2.不能通过访问权限,返回类型,抛出异常来进行重载。
3.可以有不同的访问修饰符。
方法的重写:
定义:在继承中,子类继承父类的方法。但是子类需要和父类不同的实现,扩展或者
覆盖父类的方法实现则需要对方法进行重新书写。这种则是方法的重写。重写是发生
在继承类中的。
注意:1.子类的参数列表,方法名必须和父类的参数列表方法名完全一致。
2.返回类型必须一致。
3.方法修饰符必须大于或者等于父类的方法修饰符。
4.子类重写不能抛出比父类被重写方法更多的异常。
**********************************************************************************************************
继承:
定义:是类与类之间的关系,把具有相同的属性和行为进行抽取,设计为父类。子
类通过继承,就可以自动具备父类的属性和行为。
关键字:extends
优点:1.增加代码的重用性。
2.扩展性也增加了。
3.设计程序变得简单。
注意:1.java是单继承。(类层次更清晰,但是缺少了丰富度)
2.Object类是所有类,包括数组的超类。
3.继承的实现是通过内存叠加的方式实现的。(先造父类对象部分,再造子类
对象部分)
4.子类需要重新实现父类中的方法行为时,需要用到方法的重写。
**********************************************************************************************************
多态:
定义:相同的行为,不同的实现。 --------针对的是方法多态。
分类:静态多态,和动态多态。
类型转换:
1.向上转:把子类的对象赋给父类的变量。 (一定成功)
2.向下转:把父类的值(引用值)赋值给子类的变量。(不一定成功)
向下转:需要用到关键字 instanceof
用于判断前面的变量,是否指向后面的类型。
多态的自我理解:
即是在方法中,需要输入一个对象。但是对象具体是谁,并不知道。就需要用到
用父类定义一个 作为形参传入方法中。 如果需要具体判断是哪一个对象,就需
要用到instanceof,来调用这个对象特有的方法。如果是父类中的方法,可以直
接用父类定义的形参对象来调用需要调用的方法。
**********************************************************************************************************
this 与 super
this:
1.this.***或者this.***() 表示每个对象本身的this引用。当前对象,可以看本类中的所有属性和方法,可以看到继承与父类的的访问修饰符允许
看到的
2.this()代表调用同一个类的其他构造器。
注意:this()只能放在构造器的第一句。
super:
1.super()调用父类的指定构造,也只能放在构造器的第一句,和this()
不能同时出现。
2.super()有默认,不会写也有(调用父类无参),this()没有默认。
3.super.****** 当前对象的父类对象,访问不到本类定义的任何属性和方法
也可以看到继承父类的属性和方法,也受访问修饰符限制,和this相同。
综上:super可以看到的,this也可以看到。
this看到的 ,super就不一定看的到,所以this比较好。
**********************************************************************************************************
抽象类:
有抽象方法的类一定是抽象类。(在类的声明部分加上abstract)
特点:
1.不能产生对象。(原因:对象是个具体的,实际存在的,不应该有不确定的。)
2.抽象类存在的意义在于产生子类。
3.抽象类里面也有属性方法等等一个类该有的都有。
4.语法上:抽象类可以没有抽象方法,但是这样就失去设计的意义。
5.抽象类可以继承于抽象类。
6.抽象类中可以重载构造方法。
注意:子类继承抽象类,必须实现抽象类中的所有抽象方法,除非这个类也是抽象类。
abstract只针对类和方法。
用法:一般用在父类中,所有子类共有的,都要重写的,就一般写为抽象方法,自然父
类就是抽象类了。
在代码中: @overriding 可以进行标注提醒。
接口:
特点:1.是一种独立的数据类型。
2.接口关注的是行为的共享(接口不能产生对象)
1> 定义
1.关键字:interface
2.接口在语法上访问修饰符只有public和default(默认)
属性:只能是公共,静态,常量属性(三个都得满足)
就算不写public statc final,默认也算常量。
构造:接口无构造方法。
方法:接口里面定义的方法只能是公共的,抽象的方法。
public abstract 可以省略不写。
没有实例初始化块,也没有静态初始化块。
公共借口的名字必须和他所在的Java文件名保持一致。
注意:在jdk1.8中,接口有了新的功能,也就是能写方法实现部分。用default修饰。
eg: public default void methodA(){
xxxxxxxxxxxxxxxxxxxxx
}
2>实现
1.让类实现接口。
用关键字implements +接口名字
特点:1.实现接口的类必须实现接口的所有方法,除非这个类是抽象类。
2.一个类可以实现多个接口,在implements后面写多个接口的名字,用
逗号隔开。
3.类在实现接口的同时,可以做继承。
3>接口与接口的继承
1.接口的继承依然使用extends 关键字。
子接口自动继承父接口的抽象方法。
2.接口的继承是可以多继承的。
extends 后面书写需要继承的接口名字,用逗号隔开。
3. 接口的引用可以指向实现类的对象。
行为的分类原则(指行为应该写到父类中,还是接口中):
1、对象与生俱来的行为写到抽象类中。
2、附加的行为写到接口中。
接口设计的原则是:
最小接口原则。
尽量小接口, 这样可以自由组合,防止接口污染。