封装: 把相关的数据封装成一个“类”组件
继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
多态: 增强软件的灵活性和重用性
Java语言最基本单位就是类,类似于类型。
类是一类事物的抽象。
可以理解为模板或者设计图纸。
每个对象具有三个特点:对象的状态,对象的行为和对象的标识。
对象的状态用来描述对象的基本特征。
对象的行为用来描述对象的功能。
对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来。
类是一类事物的抽象,对象是具体的实现。
计算机语言来怎么描述现实世界中的事物的? 属性 + 行为
那怎么通过java语言来描述呢?
我们可以通过类来描述一类事物,用成员变量描述事物的属性,用方法描述事物的行为.
类中提供的 get/set 设置和获取值
创建类:
类-一类事物的抽象-模板
1.创建类
2.创建类的属性(成员变量)
3.封装类的属性(成员变量)
4.提供get与set方法
5.提供一些本类的功能
创建对象:
创建对象
通过对象调用方法
1)可以调用set方法设置私有属性的值
2)可以调用get方法获取私有属性的值
3)可以调用普通的方法执行对应的功能
当一个类中有两个同名的变量,一个成员变量,一个局部变量
想使用本类的成员变量时,可以用this指定一下
this代表的是"本类",由于成员变量属于类资源,所以可以被指定.
我们可以理解成:类名 this = new 类名
但注意仅仅是理解,不能这么写!!!!!
规定:一定注意this关键字必须在构造方法中第一行
this.name = name;
this代表本类对象的一个引用对象
this还可以在构造方法间相互调用
但请一定注意:是单向的,不是双向来回调用,会死循环
为了外部想用我本类的属性的时候按照我的方法来去访问这才是封装的意义.
如何封装?封装后的资源如何访问?
我们可以使用private关键字来封装成员变量与方法
如何访问私有资源?
关于成员变量:
setXxx – 对外提供公共的设置值方式
getXxx – 对外提供公共的获取值方式
关于成员方法:
把私有方法放在公共方法里供外界调用即可
方法名加参数列表
创建对象时先看父类构造方法
Java只支持单继承,关键字:extends
继承可以传递(一脉相传)
父类的私有资源,子类不可见(不可用)
是一种is a的强耦合一个子类只能有一个父类,但是一个父类可以有多个子类
2.2)特点:
- 使用extends关键字来表示继承关系
- 相当于子类把父类的功能复制了一份
- Java只支持单继承
- 继承可以传递(爷爷/儿子/孙子这样的关系)
- 不能继承父类的私有成员
- 继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
- 像是is a的关系
概念:可以通过这个关键字使用父类的内容:
Super代表的是父类的一个引用对象
注意:在构造方法里,出现的调用位置必须是第一行
在子类中使用父类的xxx资源,需要使用super.进行指定, super是表示父类的一个对象引用 可以理解成 父类 super = new 父类();
继承是面向对象最显著的一个特征
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并扩展新的能力.
Java继承是会用已存在的类的定义作为基础建立新类的技术
新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)
这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用.
创建一个抽象父类的构造方法,在创建子类无参构造,(无参构造默认存在),隐藏着super(),先访问父类的构造方法,再执行自己的, 如果父类的处传参,默认的无参构造会被覆盖,子类super()就报错了,在main方法中,子类 p = new 子类 输出的是父类在是子类,因为super先去调用父类无参构造在执行自己的无参构造,在多态中也是一样的.
一切都是为了孩子.(子类)
多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准
注意:
静态资源属于类资源,不存在重写的现象,只是两个类中有同样声明的方法而已,不属于重写
特点:
多态的前提1:是继承
多态的前提2:要有方法的重写
父类引用指向子类对象,如:Animal a = new Cat();
多态中,编译看左边,运行看右边
演示:
Animal a = new Cat();
new Cat();
创建了一个子类对象用父类引用类型变量来接,
Animal a = new Cat();
父类型的引用类型变量 a 保存着子类对象Cat()地址值
多态的出现是为了统一调用标准,向父类看齐, 父类提供的功能才能用,子类特有的功能用不了
口诀:
1.父类引用 指向子类对象
2.编译(保存)看左边, 运行(测试)看右边
好处:
- 多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法
- 提高了程序的可扩展性和可维护性
使用:
- 成员变量: 使用的是父类的
- 成员方法: 由于存在重写现象,所以使用的是子类的
- 静态成员: 随着类的加载而加载,谁调用就返回谁的
多态总结:
多态是什么?
同一种事物多种表现形式,可以把多种子类都当做父类来看,统一标准
2.实现多态的前提是?
继承+重写
3.多态的特点?
1) 父类引用指向子类对象
2) 编译看左边,运行看右边
4.多态的使用?
1) 成员变量 : 父类
2) 成员方法 : 父类的声明 & 子类的实现
3) 静态方法 : 如果父子类有同名静态方法,使用的是父类的
静态资源可以继承,属于类资源,静态不可以重写
异常类型 异常信息 报错行号
继承结构
异常的处理方式
捕获--自己解决try-catch
抛出--让别人去解决throws
,谁调用抛出异常的方法,谁就需要解决这个问题(捕获处理/继续向上抛出)
不要把异常抛给main(),因为没人解决了
在JAVA中,继承是一个重要的特征,通过extends关键字,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
在应用中就存在着两种转型方式,分别是:向上转型和向下转型。
比如:父类Parent,子类Child
向上转型:父类的引用指向子类对象Parent p=new Child();
说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类的方法就根据这个引用指向调用子类重写方法。
向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。
Parent p = new Child();//向上转型,此时,p是Parent类型
Child c = (Child)p;//此时,把Parent类型的p转成小类型Child
//其实,相当于创建了一个子类对象一样,可以用父类的,也可以用自己的
说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。
构造方法 概念:
与类同名,且没有返回值类型,可以含参也可以不含参
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法
构造方法的主要功能就是完成对象创建或者初始化
当类创建对象(实例化)时,就会自动调用构造方法
构造方法与普通方法一样也可以重载.
构造方法可以被继承吗?--不可以!!!!
语法结构的要求:构造方法的方法名需要与本类类名一致,不然就不符合要求.
默认无参构造和普通方法和构造方法的区分:
1.默认存在无参构造,当new Person()会自动触发此无参构造.
2.普通方法的定义:修饰符 返回值类型 方法名 (参数列表){ 方法体 }.
3.构造方法的定义:修饰符 方法名 (参数列表){ 方法体 } --方法名与类名一致
3.1)构造方法也存在重载的现象:方法的重载:在同一个类中,方法名相同且参数列表不同的现象
4.当只提供了含参构造,默认提供的无参构造会被覆盖,所以在创建重载的构造方法时,一定注意要手动添加无参构造
构造函数怎么记忆:
特点:方法名与类名相同,且没有返回值类型
执行时机:创建对象时立即执行
默认会创建无参构造,但是,如果自定义了含参构造,默认的无参构造会被覆盖,注意要手动添加哦
生成无参构造快捷键与生成全参构造快捷键:
无参:ALT+INSERT 选择Constructor -> Select None ->OK
全参:ALT+INSERT 选择Constructor -> Select CTRL+a全选 - > OK
private关键字:
是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问.
继承以后,子类就拥有了父类的功能
在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象
格式要求:方法的返回值 方法名 参数列表 要完全一致,就方法体是重写的
注意: 父类的私有方法不能被重写,子类在重写父类方法时,修饰符
子类重写父类方法时,子类修饰符要大于等于父类修饰符的权限
OPC原则:
OCP原则:面向修改关闭,面向拓展开放--只允许功能拓展,不允许修改原来的代码
这个功能的修改被称作方法的重写
1.重写:和父类的方法签名[返回值类型&方法名&参数列表]保持一致
修改的是子类的功能,父类的功能并没有发生任何的改变.
2.重写时,子类必须有权限去重写父类的功能,父类的私有方法无法被重写
子类的方法修饰符权限>=父类被重写方法的修饰符的权限
总结:
1.方法重写的意义:是在不修改源代码的前提下,完成业务的修改
2.重写的要求:子类的方法声明(返回值类型 方法名(参数列表) )和父类的一模一样
3.重写并没有改变父类原有的业务,只是子类的业务进行了修改
如何判断他是否是重写:
@Override//注解,标记这个方法是实现父类接口中未实现的抽象方法父类中的xxx方法上的一个小标签
如果他是一个重写的方法,他就让你写,如果不是他就不让你写
重载: 是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同
重写: 是指发生了继承关系以后(两个类),子类去修改父类原有的功能
语法规则:子类的方法签名(返回值类型 方法名(参数列表) )与父类一致
重写方法的修饰符: 子类权限 >= 父类的权限
重载的意义: 是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性
重写的意义:是在不修改源码的前提下,进行功能的修改和拓展
(OCP原则:面向修改关闭,面向拓展开放
This代表本类对象的引用
class Cat{ this.XXX } 可以理解成: Cat this = new Cat();
super代表父类对象的引用
class Father{ }
class Son extends Father{ super.XXX }
可以理解成: Father super = new Father();
this可以在两个变量名相同时,用于区分成员变量和局部变量
this 可以在本类的构造方法之间调用,位置必须是第一条语句,注意,不能相互调用,会死循环
super是发生了继承关系以后,子类如果想用父类的功能,可以通过super调用
如果发生了重写,还想用父类的功能,需要使用super来调用
Super在调用父类构造方法时,必须出现在子类构造方法的第一条语句,而且如果父类中没有提供无参构造,子类可以通过super来调用父类其他的含参构造
static是java中的一个关键字
用于修饰成员(成员变量和成员方法)
特点:
可以修饰成员变量与成员方法
随着类的加载而加载,优先于对象加载
只加载一次,就会一直存在,不再开辟新空间, 直到类消失才一起消失
静态资源也叫做类资源,全局唯一,被全局所有对象共享
可以直接被类名调用
静态只能调用静态,非静态可以随意调用
static不能和this或者super共用,因为有static时可能还没有对象