Java封装、继承、多态、抽象、接口基础知识
封装
面向对象三大特性:封装、继承、多态(四大特性则多一个抽象)
-
定义
把对象的属性和方法结合为一个独立的整体,并尽可能隐藏对象的内部实现细节 。
封装的核心思想就是尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。
-
static关键词
static表示静态或者全局,可以用来修饰成员变量和成员方法以及代码块。
常规的访问都是先创建对象再利用该对象去访问成员变量或方法,而使用了static修饰的成员变量和成员方法访问时不依赖于该类的对象,而是直接通过类去访问。可以理解为被该类的所有实例对象所共用,所以说是全局的。
继承
-
定义
继承是用来描述类之间的关系,即一个类继承(拥有)另一个类中的属性和方法,被继承的类叫做的父亲,继承的类叫子类。
-
特点
Java不允许多继承,只允许单继承。只能有一个直接父类,但可能有间接父类,比如父类自己也有父类,此时即间接父类。
-
使用
public class 类名 extends 父类名{
}
-
子类访问父类
1、创建对象
-
不论在子类的构造函数中是否有写super()方法,创建子类对象时候,都会默认创建一个父类对象。(JVM会先创建父类再创建子类)因为在子类中可能会调用父类对象的属性或方法,如果不先创建,那么会出错。
-
可以通过super(关键字)来调用父类对应的构造函数。
-
当没有用super(关键字)来调用父类对应的构造函数时,会默认调用其无参构造函数来创建父类对象。
2、super关键字
-
通过super关键字来让子类访问父类的构造方法、普通方法、成员变量。
构造方法:super(关键字)
普通方法:super.方法名(参数)
成员变量:super.成员变量 -
在子类的构造方法中,可以通过super访问父类的构造方法和普通方法。
-
在子类的普通方法中,只能通过super访问父类的普通方法。
-
-
子类的访问权限
访问权限修饰符
不包含父子类关系:
在同一个类中 同一个包中不同类 不同包中不同类 public 允许访问 允许访问 允许访问 proteced 允许访问 允许访问 不允许访问 默认修饰符 允许访问 允许访问 不允许访问 private 允许访问 不允许访问 不允许访问 包含父子类关系:
同一个包中的子类 不同包中子类 public 允许访问 允许访问 proteced 允许访问 允许访问 默认修饰符 允许访问 不允许访问 private 不允许访问 不允许访问 由上可知:不论父子关系,在同包中的类权限一样的。
-
子类重写父类方法
1、 使用
子类在继承父类方法的基础上,对父类方法重新定义并覆盖的操作叫做方法重写。是覆盖,并不是说先执行完父类的方法,再去执行子类重写的部分。
父类中的方法
class person{ void show(){ System.out.println("这是一个人"); } }
子类重写了父类中的方法
class student extends person{ void{ System.out.println("这是一个学生"); } }
此时调用子类中的方法,输出的是"这是一个学生",而不是”这是一个人\n这是一个学生“。
2、特点
-
子类并不是一定要像接口那样必须实现父类的方法,子类可以不重写父类的方法,而是利用super关键字来调用父类的方法。
-
父类的构造方法不能被重新。
-
父子类的方法名、方法参数列表相同。
-
子类方法的返回值与父类方法返回值类型相同或者是其子类。
-
子类方法的访问权限不能小于父类。即子类方法的访问权限>=父类,如下例子
pulic = public public、protected >= proteced
第五点要注意:当子类或父类修饰到private时候,就不叫重写了,因为此时这个方法已经不具备继承关系了,只不过刚好父子间有一个方法名、参数列表相同的方法。
3、方法重写与方法重载的区别
- 位置:方法重写在子类中对父类方法进行重写,方法重载是在同一个类中。
- 方法名:方法重写相同,方法重载相同。
- 参数列表:方法重写相同,方法重载不同。
- 返回值:方法重写相同或是其子类,方法重载没有要求。
- 访问权限:方法重写不能小于父类,方法重载没有要求。
-
多态
-
定义
一个事物具有多种表现形态,在Java程序中,定义一个方法,在具体的生成环境中根据不同的需求呈现不同的业务逻辑,多态的前提是继承,父类提供一个方法,而子类在根据具体需求去重写方法。
-
特点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
-
使用
1、定义方法时形参类型为父类,实际调用方法时传入子类类型的参数。
2、定义方法时返回值类型为父类,实际调用方法时返回子类对象。
以上两种形式的基本原理都是父类引用可以指向子类对象。
子类引用不可以指向父类对象:Child child = new Parent() 这样是不行的,但可以强转
Child child = (Child)new Parent();
-
多态存在的三个必要条件
1、类的继承
2、方法的重写
3、父类引用指向子类对象:Parent p = new Child();
抽象方法和抽象类
-
定义
如果一个方法只有方法的声明而没有具体的方法实现,这个方法就叫做抽象方法,Java中的抽象方法需要使用abstract关键字来修饰。
一旦类中定义了抽象方法,则该类也必须声明为抽象类,需要在类定义处添加abstract关键字。
-
特点
- 与普通类相比抽象类不能被实例化
- 与普通方法相比抽象方法没有实体化
- 抽象类中可以没有抽象方法,但是包含了抽象方法的类必须定义为抽象类。即我们在抽象类中定义普通方法,但普通类中不能定义抽象方法。
-
使用
public abstract class 类名{ public abstract 返回值 方法名(参数); }
-
继承与抽象的联系
由于多态需要类的继承和方法的重写,子类需要重写父类的方法,所以父类干脆不需要具体实现方法而是提供一个抽象的概念或者说是模板,再由子类具体去实现该方法。具体开发中则是由抽象类(即父类)的子类提供的方法来完成要求。
一旦父类有了抽象方法,子类就必须去重写这个方法,否则报错。
但如果子类也是抽象类,则可以不去重写父类的抽象方法。
接口
-
定义
接口是由抽象类衍生出来的概念,并由此产生了一种编程思想:面向接口编程。
面向接口编程就是将程序中的业务模块进行分离,以接口的形式去对接不同的业务模块。
-
特点
- 能够最大程度实现解耦合,降低程序耦合性
- 使程序易于扩展
- 有利于程序的后期维护
-
使用
public interface 接口名{ public 参数值 参数名; public 返回值 方法名(参数); }
由此可看出,接口其实就是个抽象类,只不过是极度抽象的抽象类:在抽象类中允许有非抽象的方法,但接口不允许有非抽象的方法存在,接口中必须全都是抽象方法(所以abstract关键词就可以省略了)。
接口中允许定义成员变量,但有如下要求:
1、只能定义public和默认访问修饰权限的成员变量。
2、接口中的成员变量在定义时候必须初始化。
3、接口中的成员变量都是静态变量,即可以通过接口直接访问,同时值不能够被改变(所以也省略了static关键词)。
使用接口时,不能直接实例化接口对象,而必须实例化其实现对象。
-
接口和继承的区别
Java只允许单继承,但可以实现多个接口。
-
细节
当由普通类来实现接口时,必须将接口中的所有抽象方法重写。
当由抽象类来实现接口时,则不必重写接口的方法。可以全部不重写或只重写一部分方法。
如
public interface MyInter{ function abstract void A(); function abstract voidB(); }
实现类中,必须全部重写A和B方法
public class MyClass implements MyInter{ public void A(){} public void B(){} }
实现类要是一个抽象类,可以不全部重写A、B方法。
public abstract class MyClass implements MyInter{ public void A(){} }
规范
-
包名由小写字母组成,不能以.开头或结尾,可以包含数字,但不能以数字开头,使用.来分层。
包的命名方式一般采用网络域名的反向输出,如com.company.test/或com.company.entity。(反向是与正常的company.com相比的)