Java中的抽象与封装
封装形式
封装是四个基本的OOP概念之一。其他三个是继承,多态和抽象。
Java中的封装是一种将数据(变量)和作用于数据(方法)的代码包装为一个单元的机制。在封装中,一个类的变量将对其他类隐藏,并且只能通过其当前类的方法进行访问。因此,这也称为数据隐藏。
在Java中实现封装-
-
将一个类的变量声明为私有。
-
提供公共的setter和getter方法来修改和查看变量值。
抽象化
抽象是处理思想而不是事件的质量。例如,当您考虑使用电子邮件时,复杂的细节(例如,发送电子邮件后会发生什么),电子邮件服务器使用的协议对用户都是隐藏的。因此,要发送电子邮件,您只需键入内容,提及收件人的地址,然后单击发送。
同样,在面向对象的程序设计中,抽象是向用户隐藏实现细节的过程,只有功能会提供给用户。换句话说,用户将获得有关对象做什么而不是对象如何工作的信息。
在Java中,使用Abstract类和接口来实现抽象。
1.抽象:
在类的设计层次:将某些事务的共同属性提取出来集合到一个类;类与对象之间的关系:类时抽象的,对象是具体的,类是对象的模板,对象的创建时以类未模板的,同一个类创造出来的对象具有共同的属性,但属性值不同。
2.封装:
利用抽象数据类型将数据和基于数据的操作封装在一起(事物的属性和方法),数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。
私有变量 ( 关键字:private )、私有方法
3.继承:
继承是在父类、子类之间共享属性、方法的机制,提高代码的复用性。继承后子类拥有父类的部分属性和方法(私有属性不能继承,构造函数不能继承),子类可另外扩展属于自己的属性和方法,实现功能扩展。
4.多态:
以封装和继承未基础,在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为去执行。)相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。常见多态形式:重写和重载。
5.多态的示例代码:
猫,狗等都是宠物,他们都有共同的属性和方法:昵称(name),年龄(age),玩耍( play() )
pet类是所有宠物共同属性的集合:
public class Pet { public String name; public int age; public Pet() { } public Pet(String name, int age) { //有参构造方法 this.name = name; this.age = age; } public void play() { System.out.println(this.name + "正在玩"); } }
Dog类,继承Pet类
继承了Pet类的public属性,重写了play()方法,重载了play方法。
public class Dog extends Pet { public Dog(String name, int age) { super(); this.name = name; this.age = age; } @Override public void play() { System.out.println(this.name + "狗狗正在玩皮球"); } public void play(String action) { System.out.println(this.name + "在" + action); } }
Cat类:继承Pet类,重写play()方法。
public class Cat extends Pet { public Cat(String name, int age) { super(); this.name = name; this.age = age; } @Override public void play() { System.out.println(this.name + "小猫正在玩线团"); } }
main类:
public class Test { public static void main(String args[]) { Pet pet = new Dog("大黄", 3);//实例化一个pet对象 pet.play(); Dog dog = (Dog) pet; //向下转型 dog.play(); dog.play("摇尾巴");//扩展功能,重载play,只关心结果,不关心怎么处理 Cat cat = new Cat("粉红", 2); cat.play(); } }
输出结果: