面向对象的三大特性:封装,继承,多态
封装:强调的是保护与易用
什么是封装:对外屏蔽掉类内部的一些实现细节,类外部只能通过类提供的一些方法来操作类
如何实现封装:通过类结构以及访问修饰符来实现封装性
访问修饰符控制属性和方法只对那些类可见
四大访问修饰符可见性从小到大依次为:
privet(私有权限,仅类内部可见)<default(包访问权限,仅包内可见)<protected(继承权限)<public(公开所有对象可见)
privet访问修饰符:
- privet修饰属性,称之为私有属性,这些属性只能在当前类内部可见
使用privet对属性进行封装操作
当属性被privet封装后,类中需要提供getter和setter方法来控制私有属性被外部的访问,类的外部通过getter和setter方法来使用私有属性
getter->取得私有属性
setter->修改私有属性
使用privet修饰属性就可以限制属性在类外部的使用,必须按照类提供的getter和setter方法,按照一定的规则去操作属性
privet不能直接修饰外部类,可以修饰内部类(私有内部类,这个类仅供外部类使用)
default包访问权限:
这个关键字不需要写,不加任何权限修饰符就是包权限
包内部可见,当前包(同级目录)的所有类之间可见,子包都不行
包就是文件夹
同一个文件夹中不能出现同名文件(文件名及文件类型相同的文件)
包的命名全小写不同单词之间用”_”分割
Java中使用package声明一个包(文件夹)解决类重名问题
定义一个类属于哪个包使用package关键字
导入一个类,导入类的全名称(包名.类名)使用import关键字(import只能导入类不能导入包)
继承:代码复用,提升整个程序的拓展性
(继承就是在进行共性提取,实现代码复用)
不是所有东西为了共用都使用继承,要想使用继承就得满足子类(派生类)is a父类(基类,超类)原则
继承语法:用extends表示继承父类
访问修饰符class子类名称extends父类名称{
}
子类和父类的成员关系
- 子类和父类不存在同名的方法和属性
- 子类和父类中存在同名属性(不管类型)则是编译器的就近匹配原则,若在子类中访问的变量在子类中存在则该变量就是子类中定义的变量,若子类中不存在父类中存在则是父类中定义的变量,若子类和父类都没有定义该变量则会直接编译报错
当父类中存在private(私有域),子类在继承父类时,子类无法直接使用私有域,这种继承称之为隐式继承
- 父类和子类之间的方法调用
1.如果父类和子类中存在同名同参方法则是就近原则调用子类中的方法
2.若子类中不存在要调用的方法则会从父类中寻找该方法,存在则调用,不存在则编译出错.要注意隐式继承问题
当产生子类对象时,默认先调用父类的构造方法产生父类对象然后再调用子类的构造方法产生子类对象
super:表示直接从父类中寻找成员变量和成员方法
- super修饰属性表示直接寻找父类中的同名属性(private属性无法被调用)
- super修饰方法
2.1super修饰普通成员方法,表示在父类中寻找同名方法
2.2super修饰构造方法,表示在子类中显示调用父类的构造方法
当父类中存在无参构造则子类构造方法的首行可以不写super();
如果父类中没有无参构造则在子类构造方法的首行必须显示调用super(参数)来调用父类的有参构造.
当存在父类继承时,一般在子类中不出现this()的构造方法
2022.10.28
(权限修饰符指的是那些类内部可见,与具体对象无关)
关于继承访问权限protected关键字:
在不同包中具有继承关系的类之间可见
继承权限对于同一个包中的(无继承关系的)不同类之间是可见的
(因为protected严格>default)
继承关系:
java中的单继承局限:一个类只能用extends直接继承一个父类,不允许多重继承,但允许多层继承(一个儿子只能有一个爹可以有爷爷有祖宗,一个爹可以有多个儿子)
final:
- final修饰属性,称之为常量,变量被final修饰后就变为常量,一旦初始化后数值不能改.
(final修饰引用数据类型:该引用的地址不能该,但该引用指向的对象可以改其成员属性)
- final修饰方法:
被final修饰的方法无法被重写/覆写
- final修饰类
被final修饰的类不能有子类(JDK中的String类就是final类)
类和类之间的关系:
继承与组合
继承: is a关系
组合:has a 关系
多态:
什么是多态:
同样的方法,经过不同的对象,表现出不同的行为,这样的现象就称为多态
实现多态需要以下三个条件缺一不可:
- 多态的实现必须依赖继承,在继承的体系下才能实现多态.只有在继承关系的类之间才有多态可言
- 子类必须覆写父类中的方法
- 通过父类引用调用子类覆写的方法
方法重写(override):在有继承关系的类之间,子类定义了和父类除权限外其他(方法名称,返回值类型(向上转型除外),参数列表)完全相同的方法,称为子类重写了父类的方法,子类重写方法的权限>=父类方法的权限(方法重写不包含私有方法的重写,因为子类对父类私有方法不可见)
static方法也不能重写,重写为多态服务,多态需要有多个对象,而static与对象无关
构造方法坚决不可能被重写
方法重载(overload):在同一个类中,一组方法名相同,参数列表不同与返回值无关的方法,称为重载方法
向上转型:天然发生向上转型,也是以后产生对象主要使用的方法
语法:
父类名称 父类引用 = new 子类实例();
- 通过这个父类引用能调哪些属性和方法,看父类中有哪些属性和方法,父类引用决定了能调什么东西
- 调用的这个方法表现出什么行为,看new的是哪个子类对象,这个子类有没有覆写该方法
向上转型带来的程序上的优势就是实现了参数的统一化.
向下转型:需要强制类型转换,要发生向下转型必须先发生向上转型,否则会报错.属于大类型强转为小类型(将一个父类引用还原为子类引用)
语法:
子类名称 子类引用 = (子类名称) 父类引用;
可以通过 Java 的Instanceof关键字来判断一个父类引用是否指向一个子类实例
语法: 引用名称 Instanceof 类,返回一个布尔类型的值