江西专业的网站建设制作/惠州seo推广优化
Java面向对象的三大特征为:封装、继承和多态,本文说说我对三大特性的理解。
1.封装
Java中的封装是指一个类把自己内部的实现细节进行隐藏,只暴露对外的接口(setter和getter方法)。封装又分为属性的封装和方法的封装。把属性定义为私有的,它们通过setter和getter方法来对属性的值进行设定和获取。下面我举一个简单的封装例子
public class Person {private int id;private String name;private Person person;
public int getId() {return id;}
public String getName() {return name;}
public Person getPerson() {return person;}
public void setId(int id) {this.id = id;}
public void setName(String name) {this.name = name;}
public void setPerson(Person person) {this.person = person;}}
在Person类中,定义了三个成员变量,分别为id name person,它们的访问修饰都是private私有的,通过setter和getter方法对这些变量进行设值以及取值。那么这么做有什么好处呢?封装的意义就是增强类的信息隐藏与模块化,提高安全性。封装的主要作用也是对外部隐藏具体的实现细节,增加程序的安全性。
2.继承
Java中的继承是指在一个现有类(父类)的基础上在构建一个新类(子类),子类可以拥有父类的成员变量以及成员方法(但是不一定能访问或调用,例如父类中private私有的成员变量以及方法不能访问和调用)。继承的作用就是能提高代码的复用性。子类拥有父类中的一切(拥有不一定能使用),它可以访问和使用父类中的非私有成员变量,以及重写父类中的非私有成员方法。
父类:
package cn.csu.ksh;
public class Person {private int a=1;//父类私有成员变量private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}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;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}
public void say() {System.out.println("person say..");}
public void run() {System.out.println("person run....");}
//父类的私有方法private void show() {System.out.println("person show...");}
}
子类:
package cn.csu.ksh;
public class Student extends Person {
@Overridepublic void say() {super.say();}@Overridepublic void run() {super.run();}public static void main(String[] args) {Student stu = new Student();//stu.a=1;//子类对象对父类的私有成员变量使用报错!//stu.show();//子类对象调用父类的私有方法,同样报错!stu.say();stu.run();
}}
继承的好处是实现代码的复用以及扩展,子类通过对父类代码的复用,可以不用再定义父类中已经定义的成员变量,方法上直接对父类的方法进行重写实现了扩展。
多态
多态就是指多种状态,就是说当一个操作在不同的对象时,会产生不同的结果。
在Java中,实现多态的方式有两种,一种是编译时的多态,另外一种是运行时多态,编译时的多态是通过方法的重载实现的,而运行时多态是通过方法的重写实现的。
方法的重载是指在同一个类中,有多个方法名相同的方法,但是这些方法有着不同的参数列表,在编译期我们就可以确定到底调用哪个方法。
方法的重写,子类重写父类中的方法(包括接口的实现),父类的引用不仅可以指向父类的对象,而且还可以指向子类的对象。当父类的引用指向子类的引用时,只有在运行时才能确定调用哪个方法。
其实在运行时的多态的实现,需要满足三个条件:1.继承(包括接口的实现)2.方法的重写 3.父类的引用指向子类对象
并且,我们说的多态都是类中方法的多态,属性是没有多态性的。方法的重载我这里就不举例说明了,我说一下运行时的多态。
接口
-
package cn.csu.ksh; public interface Animal {void shout();}
实现类
package cn.csu.ksh;public class Dog implements Animal{
@Overridepublic void shout() {System.out.println("wangwang...");}
}
实现类
package cn.csu.ksh;
public class Cat implements Animal {
@Overridepublic void shout() {System.out.println("miaomiao...");}
}
测试:
package cn.csu.ksh;
public class AnimalTest {public static void main(String[] args) {//父类的引用指向子类对象Animal d = new Dog();animalShout(d);
//父类的引用指向子类对象Animal c= new Cat();animalShout(c);
}
public static void animalShout(Animal animal) {animal.shout();}}