什么是封装
封装:把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口Api
封装的优点:
- 隐藏实现细节
- 安全
关于安全的解释:如你在程序中私有化了age属性,并提供了对外的get,set方法,当外界使用set方法设置属性值时,你可以在set方法中做一个逻辑判断,让他属于0-80之间,并且要求是整数,那样他就不可以随便赋值了。
- 增加代码复用性
比如在工具中封装的各种方法,可以任意调用,而不用去在意实现的细节.
- 模块化
封装分为封装属性,方法,类等等。有利于代码调式和相互配合
例子如下:
public class User implements Serializable {
private String name;
private String age;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
对外,只提供set,get方法来设置这个User类的属性,而不能直接通过构造方法初始化值或者通过 “.” 调用属性赋值
什么是多态
多态就是统一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。如果按照这个概念进行定义,多态应该是一种运行时的状态。
多态的必要条件
为了实现多态,需要满足三个条件:
- 有类继承或者接口实现
- 子类要重写父类的方法
- 分类的引用指向子类的对象
简单通过代码来解释一下
public class Parent{
public void call(){
sout("im Parent");
}
}
public class Son extends Parent{ //1、有类继承或者接口实现
public void call(){ //2、子类重写了父类的call方法,方法名,出入参都相同
sout("im Son");
}
}
public class Daughter extends Parent{
public void call(){
sout("im Daughter");
}
}
public class Test{
public static void main(String[] args){
Parent p = new Son(); //父类的引用指向子类的对象
Parent p2 = new Daughter();
}
}
方法重写与重载
方法重载与重写是java中比较重要的概念。但是对于新手来说也比较容易混淆。本文通过下面的两个例子说明他们之间的区别。
定义
重载
函数或者方法有着同样的名称,但是参数列表不相同,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
如下
public class MethodTest{
/*
方法或者函数有着相同的返回值,和函数名。但是参数列表不相同,称之为重载
*/
public void method01(){
...
}
public void method01(Object obj){
...
}
}
重写
重写是指在java子类与父类中存在两个名称、参数列表都相同方法的情况,由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。上述的多态例子就是一个很好的重写例子。最为常用的还有在springboot项目中的service层与service实现类之间的例子。
//UserService接口
public implements UserService{
//检查用户是否存在的方法
public User CheckUser(String username,String password);
}
//UserService接口的实现类 实现了Service接口
public class UserServiceImpl implements UserService{
//重写UserService接口中的CheckUser方法,要求方法名,返回值,参数列表均一致
public User CheckUser(String username,String password){
...
}
}
重载VS重写
关于二者的区别,如下:
- 重载是一个编译期的概念,重写是一个运行期概念
- 重载准许所谓的”编译期绑定“,即在编译的时候根据参数变量的类型判断应该调用哪个方法
- 重写遵循”运行期绑定“,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法
- 因为在编译器已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态关系不大,与面向对象无关系
通过一个例子来更好的理解什么是运行期绑定
class Dog{
public void bark(){
sout("woof");
}
}
public class Hound extends Dog{
public void bark(){
sout("bowl");
}
}
public class test{
public static void main(String[] args){
Dog dog = new Hound()
dog.bark();
}
}
上面这段代码中,虽然dog变量是Dog类型的实例对象,但是由于它是通过Hound类的构造方法实例出来的,所以实际上它使用的是Hound中的方法。所以此处输出的应该是
bowl
重写的条件
- 返回类型,函数名,参数列表必须完全与被重写方法的相同
- 访问级别的限制性一定不能比被重写方法的强
- 重写方法一定不能抛出新的检查异常或比被重写方法声明的检查异常更广泛的检查异常
- 不能重写被标示为final的方法
- 重写的方法可以比被重写的方法抛出更少或更有限的异常
- 如果不能继承一个方法,就不可以重写这个方法
重载的条件
- 参数列表必须不同
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或者更广的检查异常
- 方法可以在同一个类或者同一个子类中被重载
java的继承与实现
继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类。从字面意思理解,继承就像是我们人类的姓氏传承一样,我们的姓名里的姓氏是由我们的父类传承给我们的,反过来说我们继承了我们父类的姓氏。因此继承有一个特性,即一个类只能有一个父类,但可以有多个子类
实现:如果多个类处理的目标是一样的,但是处理的方法不同,那么就可以定义一个接口,也就是一个标准,让他们实现这个接口,各自实现自己具体的处理方法来完成一致的目标。如各类汽车制造商等,我们对汽车制造商的要求就是能造出一台质量好,可以舒适驾驶的汽车,但是怎么去制造,我们不管。各类的汽车制造商通过他们自己的方法来实现这个目标。实现不同继承,一个类可以实现多个接口。但是在接口中只能定义全局变量和无实现的方法(Java8后可以有default方法)。而在继承中可以定义属性方法,变量,常量等。