Java面向对象的特性
在学习Java的过程是必须要知道的Java三大特性:封装、继承、多态。如果要分为四类的话,加上抽象特性。
封装
1.封装概述
是面向对像三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对像内部的,外界是无法直接操作
2.封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/setXxx()方法
3.封装好处
通过方法来控制成员变星的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
//封装类
public class 类名(){
修饰符 类名 (参数){
}
}
//Main方法
public class Demo {
public static void main(String[] args) {
类名 变量名 = new 类名();
|
封装主要是通过Main方法new个对象从而调用封装起来的方法,默认封装内的方法主体是由一个无参构造,如果写了有参构造会忽略无参构造,建议每次添加无参构造。
构造方法注意事项
1、构造方法创建:
如果没有定义构造方法,系统会默认给出一个无参构造方法
如果定义了构造方法,系统将不提供无参构造方法
2、构造方法重载
如果自定义了带参构造方法,还有使用无参构造方法,需要再写一个无参构造方法
3、推荐使用
无参构造每次必写
this与super
为什么要把this与super放在这里介绍,因为从面向对象开始,通过私有化变量的调用就会发生变化,而对于本类中,如果出现同名变量的情况,添加this与super与不添加有极大的差别。如下
不同颜色框起来的代表所指向的是一样的,红色代表本内私有变量,如果在重名情况下想调用需要添加关键字this,代表向本内上一层去寻找;蓝色表示传入参数。
翻译:将传入的name赋值到本类中的name变量。
setXXX()与getXXX()方法
借着封装再说一下这setXXX()与getXXX()方法,首先对于私有变量是没办法直接在其它类中调用的,需要通过这两个方法进行写入与获取
成员变量与局部变量区别
继承
含义:多个类中存在共同属性,则可以抽取出来形成父类,让多个类去调用父类的变量与方法。
好处:提高代码的复用性
注意事项:
- Java中只支持单继承不支持多继承;
- 一个类可以被多个类继承;
- 多层继承,一个类的父亲可以再去继承另一个父类
- 成员变量继承只能继承非私有化;
方法重写
概述:
子类中出现了和父类一样的方法声明
_
方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类功能,又定义了子类特有的内容。
_
@Override
是一个注解
,可以帮助我们检查重写方法的方法声明的正确性
方法重写注意事项
1、私有方法不能被重写(父类私有成员子类是不能继承的)
2、子类方法访问权限不能更低(public>默认>私有)
父类:
子类
private子类访问public父类被拒。
父类默认,子类是public可以访问。
Java中继承的注意事项
Java中类只能单继承不支持多继承
Java中类支持多层继承
修饰符
权限修饰符
权限修饰符单独来讲比较枯燥,可以换个思路——你的钱与家庭
首先private可比作自己,钱只能自己花,别人花不到!
_
但是private就不一样,以比作家庭,你的钱除了自己,还能给家里媳妇跟孩子花,家里的成员可以花,但是不会给别人花,别人也花不到!
_
protected解释是不同包的子类,相当于是在外面的私生子,这个私生子有时候也得给点钱花花,但是无关的人还是花不到
_
最后是公共类,所有人都可以用。
final修饰局部变量
就是限定:要是变量基本类型,修饰的数据值不能发生改变;要是变量引用类型,对应地址值不能发生改变。但是地址里面的内容可以变化
static静态
可以修饰成员方法与成员变量
static修饰的特点
被类的所有对象共享
这也是我们判断是否使用静态关键字的条件
可以通过类名调用
当前也可以通过对象名调用【推荐使用类名调用】
static访问特点
因为static在编译过程就已经初始化好存在方法区,所以最先出来对应特点:
非静态成员对于成员变量与成员方法不论静态还是非静态都可以访问;
静态成员、方法只能访问静态成员、方法
静态成员内存图
多态
同一对象在不同时刻表现出来的不同形态
前提与体现
1、有继承/实现类关系
2、有方法重写
3、有父类引用指向子类对象
如下图:
1、继承类关系
2、方法重写
父类:
子类:
3、父类引用指向子类
多态的访问特点
其实就是访问父类,或者重写内容,访问成员变量是父类,方法是子类。
记忆口诀:
方法编译看左边,运行看右边
变量都是左边
多态的优缺点
多态的好处:
提高了程序的扩展性
_
多态的弊端:
不能使用子类的特有功能
多态的转型
对于多态的弊端,进行优化,为此有了多态的转型
Test_Fu a = new Test_Zi();
a.speak();
System.out.println(a.age);
//向下转换,指向地址没有问题
Test_Zi c = (Test_Zi)a;
System.out.println(c.age);
//向上转换
a = new Test_Zi2();
a.speak();
//ClassCastException
Test_Zi d = (Test_Zi)a;
System.out.println(d.age);
抽象
在Java中一个没有方法体的方法应该被定义为抽象方法。而类中如果有抽象方法,该类必须定义为抽象类。
抽象类的特点
1、抽象类和抽象方法必须使用abstract关键字修饰
public abstract class 类名(){}
public abstract void eat(){}
2、抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
3、抽象类不能实例化
方法:参照多态形式,通过父类引用指向子类(子类对象实例化),这叫做抽象类多态
4、抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
抽象类成员特点
-成员变量
可以是变量也可以是常量
-构造方法
有构造方法但不能实例化:用于子类访问父类数据的初始化。
~成员方法
可以有抽象方法,限定子类必须完成某些动作
也可以有非抽象方法:提高代码复用性。
接口
接口就是一种公共的规范标准,只要符号规范标准,大家都可以通用
Java中的接口更多体现在对行为的抽象
接口的特点
1、接口用关键字interface修饰
public interface 接口名{}
2、类实现接口用implement表示
public class 类名 implement 接口名{}
3、接口不能实例化
①接口如何实例化:参照多态,通过实例化类对象实例化,这叫接口多态。
②多态形式:具体类多态,抽象类多态,接口类多态
③多态前提:有继承或者实现关系;方法重写;有父(类/接口)引用指向(子/实现)类对象
4、接口实现类
要么重写接口中的所有抽象方法
要么是抽象类
接口成员特点
~成员变量:
是静态且是常量,默认 public static final
~构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在,一个类如果没有父类,默认继承Object类
~成员方法:
只能是抽象方法
默认修饰符:public abstract
总结
类和接口的关系
1、类和类的关系
继承关系,只能是单继承,但是可以多层继承
2、类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
3、接口和接口的关系
继承关系,可以单继承也可以多继承
抽象类与接口的区别
为什么不单独定义某一个
抽象是对事物的抽象,接口是对行为的抽象
—
比如:能报警的门;
如果将报警方法放到抽象中,则代表这是所有门的共性,但是有的门不能报警。
如果将开门关门放在接口门中,且也有报警功能,则代表报警的是都能开关的,报警器就不是,即将共有行为放在抽象,特有行为放在接口,通过对象继承后再实现接口里面的特有。