面向对象的三大特性
继承:
作为面向对象三大特性之一的继承特点,就好像是我们现实生活中父与子的关系,使用关键字extends来标识两个类之间的关系。
public class Son extends Father{}
简单来说一下,JAVA是一门单根继承的语言,所有的类追踪下去都会寻找到一个最终的父类——Object。
要注意子类只能继承一个父类,但是一个父类可以有多个子类。
当子类继承了父类之后,子类就具有了父类的特性 ,可以在使用自身属性和方法的同时,也能够使用到父类的属性和方法。
public class Father {
String method;
public void fatherMethod01() {
System.out.println("父类的方法一");
}
public void fatherMethod02() {
System.out.println("父类的方法二");
}
}
public class Son extends Father{
String son;
public void sonMethod01() {
System.out.println("子类的方法一");
}
public void fatherMethod02() {
System.out.println("重写父类的方法二");
}
}
public class Test {
public static void main(String[] args) {
Son son = new Son();
son.method = "abc";
son.fatherMethod01();
son.fatherMethod02();
son.sonMethod01();
}
}
封装:
封装是将数据和方法隐藏起来,防止外部成员对该类的代码进行任意的访问或修改。
封装的优点是可以减少代码的耦合性,实现自己可以对该类的代码进行访问。修改,但是其他人不能够对该类的代码进行访问、修改。可以很好的将实现功能的细节隐藏起来,提高代码的安全性。
封装的实现主要是使用访问修饰符来实现。
public class Person {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
多态:
也可以称作是动态绑定、后期绑定或运行时绑定,它是根据运行时数据的类型来判断主体。
使用多态可以帮助我们消除多个类型之间的耦合关系,并且使程序有了可扩展性,我们可以从过使用通用的父类继承出新的数据类型,而不需要改变对应的接收参数的方法。
但是多态也是有缺点的,就是父类的引用不能调取子类的属性和方法。
修改之前继承代码的Test类,使用多态实现向上转型:
public class Test {
public static void main(String[] args) {
//子类向上转型
Father f = new Son();
// f.sonMethod01();//报错,提示要将方法sonMethod01修改为Father类型
f.fatherMethod01();
f.fatherMethod02();
}
}
通过上述的代码,我们可以清楚的认识到。当子类向上转型后,只能调用父类中的属性或者方法,或是被子类重写的父类中的方法,子类自己的方法和属性并不能被访问到。
在向下转型的时候需要注意,在进行类型转换的时候一定要使用instanceof判断是否可以进行类型转换,否则会出ClassCastException 类型转换异常。
public class Test {
public static void main(String[] args) {
//向上转型
Animal an = new Dog();
//向下转型
if(an instanceof Dog) {
Dog dog = (Dog) an;
System.out.println("狗");
}else if(an instanceof Cat) {//这里因为对象an是由Dog类型向上转型的,所以不能够再向下转型为Cat类型
Cat cat = (Cat) an;
System.out.println("猫");
}else {
System.out.println("都不是");
}
}
}