Java 面向对象三大特性:封装 继承 多态
封装
封装指的是属性私有化,根据需要提供setter和getter方法来访问属性。即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。
封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员。
继承
继承是指将多个相同的属性和方法提取出来,新建一个父类。
Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。 子类可以重写父类中的方法,命名与父类中同名的属性。
继承目的:代码复用。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态又分为 编译时多态和运行时多态。
编译时多态:比如重载
运行时多态:比如重写
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
如下面的猫狗案例:
package com.cc.demo1;
public class Animal {
public void eat() {
System.out.println("吃饭");
}
}
package com.cc.demo1;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
public void lookDoor() {
System.out.println("狗看门");
}
}
package com.cc.demo1;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫玩捉迷藏");
}
}
package com.cc.demo1;
public class Test1 {
public static void main(String args[]) {
//定义为狗
Animal a = new Dog();
a.eat(); //狗吃肉
//a.lookDoor();报错,此时看父Animal,Animal中没有lookDoor()
System.out.println("---------");
//还原为狗
Dog d = (Dog) a;
d.eat(); //狗吃肉
d.lookDoor();//狗看门
System.out.println("---------");
//变成猫
a = new Cat();
a.eat(); //猫吃鱼
//a.playGame();报错,a还是Animal,没有playGame()
System.out.println("---------");
//还原成猫
Cat c = (Cat)a;
c.eat(); //猫吃鱼
c.playGame(); //猫玩捉迷藏
System.out.println("---------");
}
}
实现多态可以用继承,当然也可以使用接口。
如下面的例子:
package com.cc.demo1;
public interface Animal {
public void eat();
}
package com.cc.demo1;
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
package com.cc.demo1;
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.cc.demo1;
public class Test2 {
public static void main(String args[]) {
Animal animal1 = new Dog();
animal1.eat(); //狗吃肉
System.out.println();
//Animal animal2 = new Cat();
animal1 = new Cat();
animal1.eat(); //猫吃鱼
}
}