JAVA面向对象三大特征(1)
- 封装
- 继承
- 多态
封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
这样的话看起来比较生涩难懂,所以得具体的看下例子
Demo1.java:
public class Demo1 {
private String name;
public void setName(String n){
if(n.length()>4 || n.length()<2 ){
System.out.print("Error:can not set name.");
return;
}
this.name = n;
}
public void getName(){
System.out.print(this.name);
}
}
Test.java:
public class Test {
public static void main(String args[]){
Demo1 d = new Demo1();
d.setName("这是测试的名字");
}
}
我们运行一下,是如下效果:
输出了can not set name.
然而,我们将Demo1.java的代码中的name属性的访问控制符改为public之后,也就是如下:
public class Demo1 {
public String name;
public void setName(String n){
if(n.length()>4 || n.length()<2 ){
System.out.print("Error:can not set name.");
return;
}
this.name = n;
}
public void getName(){
System.out.print(this.name);
}
}
我们再将Test.java改成如下这样:
public class Test {
public static void main(String args[]){
Demo1 d = new Demo1();
d.name = "这是测试的名字";
d.getName();
}
}
我们来看输出:
可以看到,我们成功的绕过了setName方法中对于name属性的值的限制,长度在2到4之间。
这就是封装的一种体现,我们不用提供细节,只为外部的提供一个接口。
继承
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
简单举个例子,Student类应该是Person类的扩展,比如Person类应该有name、age等属性,也应该有walk等方法,但是Student就没有name、age等属性了吗?就不能walk了吗?
这肯定是不对的,Student和Person一样,都可以walk,但是Student应该比Person多一个方法Study(这里的意思不是说人没有学习的能力,这是打个比方),但是我们同时也需要name、age等属性,walk等方法,所以为了提高代码效率,避免代码重写,我们就很自然的用到了继承。
看如下例:
Person.java:
public class Person {
private String name;
private int age;
public void walk(){
System.out.print("我在走路...\n");
}
}
Student.java:
public class Student extends Person{
public void study(){
System.out.print("我在学习...\n");
}
}
Test.java:
public class Test {
public static void main(String args[]){
Student s = new Student();
s.walk();
}
}
看输出: