Java面向对象三大特征:继承,多态,封装。
1.继承:在父类和子类中,子类继承父类的属性和行为(方法),叫做继承。![](https://i-blog.csdnimg.cn/blog_migrate/c3d1df06bb3cb700ee9a5fb437fb790a.jpeg)
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
继承用关键字extends来表示。
类的继承格式(单一继承)
class 父类 {
// 属性和行为
}
class 子类 extends 父类 {
// 重写父类的属性和行为
}
2.多态:多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是接口,不同的实例表示不同的功能。
现实中,比如我们按下 F1 键这个动作:
-
如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
-
如果当前在 Word 下弹出的就是 Word 帮助;
-
在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果(也就是做出不同的功能)。
多态存在的三个必要条件(关键掌握):
-
继承
-
重写
-
父类引用指向子类对象
多态的实现方式:
1.重写
2.接口
3.抽象类和抽象方法
如下代码:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
//输出的结果:吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
3.封装:是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法,
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
实现Java封装的步骤:
1. 修改属性的可见性来限制对属性的访问(一般限制为private),
只有本类才能访问,其他的都访问不了。
例如:
public class Person {
//封装姓名
private String name;
// 封装年龄
private int age;
}
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,
例如:
public class Person{
//封装姓名
private String name;
// 封装年龄
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
上述代码中采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
下面来看一个实例:
封装属性设为私有:
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
主方法:
public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}
运行后的结果:
Name : James Age : 20