面向对象编程有三大特性:封装性、继承性、多态性。
1,所谓的面向对象就是将我们的程序模块化、对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。
实例代码如下:
class Person{
private String name; //声明姓名属性
private int age; //声明年龄属性
public void tell(){
System.out.println("姓名"+getName()+",年龄:"+getAge());
}
public String getName() { //取得姓名
return name;
}
public void setName(String name) { //设置姓名
this.name = name;
}
public int getAge() { //取得年龄
return age;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
}
public class Test002 {
public static void main(String[] args) {
Person person = new Person(); //声明并实例化对象
person.setName("王二"); //调用setter设置姓名
person.setAge(20); //调用setter设置年龄
person.tell(); //输出信息
}
}
程序运行结果:
姓名王二,年龄:20
2,继承有点类似于我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲和母亲的一些性格,或者相貌等。
面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现了问题。比如,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。
实例代码如下:
class Person{ //定义Person类
private String name; //定义name属性
private int age; //定义age属性
public String getName() { //取得name属性
return name;
}
public void setName(String name) { //设置name属性
this.name = name;
}
public int getAge() { //取得age属性
return age;
}
public void setAge(int age) { //设置age属性
this.age = age;
}
}
class Student extends Person{ //Student是Person的子类
//该处任何代码都不编写
}
public class Test003 {
public static void main(String[] args) {
Student student = new Student();
student.setName("王二"); //调用setter设置姓名
student.setAge(30); //调用setter设置年龄
System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge());
}
}
程序运行结果:
姓名:王二,年龄:30
3,这个时候我们就需要用到面向对象的另一个特性:多态性。我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。
实例代码如下:
class Person{
public void fun1(){
System.out.println("---fun1()我是来自父类的Person");
}
public void fun2(){
System.out.println("---fun2()我是来自父类的Person");
}
}
//Student类扩展自Person类,也就继承了Person类中的fun1()、fun2()方法
class Student extends Person{
//在这里覆盖了Person类中的fun1()方法
public void fun1(){
System.out.println("---fun1()我是来自子类的Student");
}
public void fun3(){
System.out.println("---fun3()我是来自子类的Student");
}
}
public class Poly {
public static void main(String[] args) {
//此处父类对象由子类实例化
Person p = new Student();
//调用fun1()方法,观察此处调用时哪个类里的fun1()方法
p.fun1();
p.fun2();
}
}
程序运行结果:
---fun1()我是来自子类的Student
---fun2()我是来自父类的Person