面向对象4大特性:抽象,封装,继承,多态。
抽象:在类的设计层次:将某些事务的共同属性提取出来集合到一个类;类与对象之间的关系:类时抽象的,对象是具体的,类是对象的模板,对象的创建时以类未模板的,同一个类创造出来的对象具有共同的属性,但属性值不同。
封装:利用抽象数据类型将数据和基于数据的操作封装在一起(事物的属性和方法),数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。
继承:继承是在父类、子类之间共享属性、方法的机制,提高代码的复用性。继承后子类拥有父类的部分属性和方法(私有属性不能继承,构造函数不能继承),子类可另外扩展属于自己的属性和方法,实现功能扩展。
多态:以封装和继承未基础,在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为去执行。)相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。常见多态形式:重写和重载。
代码示例
猫,狗等都是宠物,他们都有共同的属性和方法:昵称(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(); // pet.play("sss"); // 错误,pet没有play(String action)方法 Dog dog = (Dog) pet; //向下转型 dog.play(); dog.play("摇尾巴");//扩展功能,重载play,只关心结果,不关心怎么处理 Cat cat = new Cat("粉红", 2); cat.play(); } }
输出结果
附:权限修饰符作用范围
本类 | 同包(子类或无关类) | 不同包(子类) | 不同包(非子类) | |
private | Y | |||
默认 | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |