1.封装
- 封装性是一种信息隐藏技术
-两个含义
- 对面的全部属性和全部方法结合在一起,形成一个不可分割的独立单位
- 尽可能隐藏对象的内部结构
下面我用一段代码来演示一遍
public class cat{
private String name;public String getName(){ retunrn name; } public void setName(String name){ this.name = name; } }
- 以上就是封装的具体变现
- 属性使用private权限
- 方法使用public权限
-单利模式 - public class Singleton {
//私有的静态属性,持有唯一的一个实例
private static Singleton instance = new Singleton();
//私有构造方法,不给别人机会创建实例
private Singleton(){}
//公开的静态方法,唯一的得到实例的方式
public static Singleton big(){
//通过给静态的属性赋值,
return instance;
}
}
- 封装的作用
- 封装性可以把私有数据和公用数据分开,保护保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
2.继承
- 概念:一个类继承另一个类的方法和属性的过程(例如儿子继承父亲财产的关系)
- 下面我用一张图来表示
- 继承的方式
- 【访问权限修饰符】【修饰符】子类名 extends 父类名{子类体}
- public class Shape {
public void draw(){}
}
public class Circle extends Shape{
public double getDiameter(){
return 0.0;
}
- public class Shape {
- 【访问权限修饰符】【修饰符】子类名 extends 父类名{子类体}
- 子类继承父类
- 只能单继承
- 方法自动拥有,可实现代码服用
- 继承与构造器
- 原则:子类在创建对象时有义务先完成父类对面的结构。
- 存在继承关系时,创建子类对象会先调用父类的默认无参构造器再调用子类的构造器,若不存在父类默认无参构造器则会报错。
- 或者通过super关键字显式的调用父类的其他构造器。
- super调用父类构造器时只能在子类构造器的第一行。
- this关键字字==>当前实例
- 当前对象的属性
- 当前对象的方法
- 当前对象的构造方法
- super关键字==>父类实例
- 父类对象的属性
- 父类对象的方法
- 父类对象的构造器
- 权限允许
- 方法覆盖
- 在继承关系中
- 同名
- 同参
- 同返回值
- 不可以缩小访问权限
- 接口interface
- 接口的概念
- 接口 中全是public abstract的方法,不允许其他方法存在
- 接口 的属性都是public static final 的
- 接口 不能被实例化
- 声明接口 interface
- 实现接口 implements
- 实现接口
- 一个接口可以被多个类实现
- 一个类可以实现多个接口
- 又实现接口又继承父类时
class LittleShop extends Shop implements OrderService,DeliveryService
- 接口的继承
- 接口可以继承
- 多继承,一个接口可以继承多个接口
- 但是需要注意的是类只能继承一个类不能多继承
- 抽象类
- 不可被实例化
- 可以定义抽象方法(方法用abstract修饰,不能有实现)
- 子类继承抽象类必须实现其抽象方法
- 含有抽象方法的类,必须是抽象类
- 接口和抽象类的区别
- 方法:接口全抽象并且public,abstract类可以有抽象也可以没有
- 构造器:接口没有构造器,abstract类有构造器
- 属性:接口必须是public static final,abstract类同普通类
- 实例化:都不能被实例化
- 继承:接口可以继承接口,而且是多继承,接口也可以被类实现,接口可以被多个类实现,一个类可以实现多个接口;abstract类可以继承,也可以被继承,单继承
- 声明方式:interface vs abstract class / implements vs extends
- 都表示抽象的概念
- 另外Object是所有类的父类,每个类的父类都继承与它
继承的作用
- 继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
- 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
3.多态
- 概念:是对外变现形式,对内多种变现形式
- 就好比把一个金字塔来做比较,你正面看它是一个三角形,而你重上往下看就是一个正方形,它对外改变了形式,对内部则有很多种形式。
- 多态参数
- 方法的参数为父类或者接口时,可以传入父类及其子类或者接口的实现类
- 扩展性强
- 典型用法:
- Parent p = new Child(); //父类变量指向子类的实现
- Interface i = new Implementation();//接口的变量指向实现类的实现
- 运行期类型和编译期类型
- Parent p = new Child();
- 运行期类型指的是Child
- 编译期类型指的是Parent
- 如果Child有一个a方法,Parent有一个b方法
- 多态环境下的属性的方法的调用(Parent p = new Child();)
- 静态同名方法,运行期调用的是父类的方法
- 成员方法,运行期调用的是子类的方法
- 属性,运行期调用的是父类的
我用代码在表示一下:
- public class Cat extends Animal {
public int age = 5;
public void bark(){
System.out.println(“喵~喵~”);
}public void catchMice(){
System.out.println(“抓老鼠”);
}public static void sf(){
System.out.println(“子类静态方法”);
}
}
public class Animal {
public String age = "3";
public void bark(){
System.out.println("动物叫");
}
public static void sf(){
System.out.println("父类静态方法");
}
}
public class App {
public static void main(String[] args) {
Animal a = new Cat();//对于成员方法调用,因为方法覆盖的问题,导致运行期调用的是子类的方法 a.bark(); //对于同名的静态方法调用,声明为何类型则调用该类型的方法 a.sf(); //对于同名的属性,实际为声明类型的属性 System.out.println(a.age);
}
- 多态体现为两种方式:
- 重写是父子类之间多态的体现,它的好处就是可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
- 重载是本类之间多态的体现,它的好处是可以满足用户在针对同一对象可以调用同一方法的不同功能体现,以最大限度适应用户的不同需求。