失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java面向对象三大特性(封装丶继承丶多态) 以及重写和重载的理解

java面向对象三大特性(封装丶继承丶多态) 以及重写和重载的理解

时间:2020-03-31 10:13:53

相关推荐

java面向对象三大特性(封装丶继承丶多态) 以及重写和重载的理解

一. 封装

(1)什么是封装?

封装就是将类中的属性私有化,提供公有的方法(get和set方法)访问私有属性,使得外部类通过get和set的方法来获取和设置私有属性的值。

代码实现:

public class Person{//将类的属性私有化private String name;private int age;//提供get和set的方法来调用私有的属性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;}}

扩展:this关键字

this关键字:根据其中文意思可以简单理解为“这个类”中的东西(包括属性和方法)。this关键字的使用主要是为了区分同名但不同内涵的属性。

如上面代码中:

(2)为什么要封装?

定义:通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强。

我是这么简单理解的,通俗的讲就是将他们一个个封装成一个类(相当于生物学中的物种),而这些类中有很多相同的属性(如name,age等)和方法但又有自己特有的方法,所以可以继续细分开来。如果统一指定成一个Person类的话,修改或者出现错误时将会造成很大的维护量。所以将他们细分开来,封装成一个个类,即使出错或者需要维护,只要找到相应的类直接进行修改就好了,大大增强了程序的维护性。

(3)怎么实现封装?

还是上面那个例子

创建一个PersonText的类,在PersonText类中对Person类中的方法进行赋值和获取:

public class PersonText {public static void main(String[] args) {Person person = new Person();//实例化Person类,让其可以调用Person类的方法person.setName("Bofu");//调用setName方法,重置其姓名person.setAge(21);//调用setAge方法,重置其年龄System.out.println("姓名是:"+person.getName()+"\n年龄是:"+person.getAge());//获取get中的内容}}

输出结果为:

总结:先实例化要调用的类,然后再对其进行调用和赋值。这就是封装性的实现。

二. 继承

(1)什么是继承?

继承,可以理解为人类社会中父子的继承。有一个父类,其子类可以继承他的所有属性和方法(包括私有权限的属性,但由于封装性的原因,只能间接使用),并且可以在其基础上增加新的方法和重写父类中的方法。

其对应的关系为:

子类能实现的功能大于父类。

(2)为什么要继承?

①减少了代码的使用量,提高了代码的复制性

②便于功能的扩展

③为后面的多态性提供了基础

(3)怎么实现继承?

需要在类后面用到 extends

继承的格式:

class B{}class A extends B{}

其中

A:子类,subclass

B:父类,超类,superclass

例子:(还是借用上面的Person类为父类)

创建一个Student类,继承父类Person。即使Student类中没有定义任何的属性和方法,但由于它继承了父类Person,所以可以直接拿父类的方法来用。

//Student继承了Person类public class Student extends Person {public static void main(String[] args) {Student student = new Student();//实例化Studentstudent.setName("Bofu");//直接调用父类Person中的get和set方法student.setAge(21);System.out.println("我是一名学生!\n我叫"+student.getName()+"\n今年"+student.getAge()+"岁了!");}}

输出结果为:

总结:

①一旦子类A继承了父类B以后,子类A中可以获取父类B中的所有属性和方法。特别的,父类中声明的private的属性,子类继承之后仍然可以获取父类中的私有结构,由于封装性的影响,子类不能直接调用父类中的私有结构。只能间接的通过get和set方法。

②子类继承了父类的属性和方法之后,还可以声明自己的方法和重写父类的方法。

三. 多态

(1)什么是多态?

多态是同一个行为具有多个不同表现形式或形态的能力,就是同一个接口,使用不同的实例而执行不同的操作。

(2)为什么要多态?

可以使程序有良好的扩展,并对所有类的对象进行通用处理。如上图,我们创建一个Person类之后,只要输入Student或者Teacher的实例就可以输出它们对应的功能。

(3)怎么实现多态?

多态性的三个必要条件

继承重写父类引用子类对象 (或者子类的对象赋给父类)

多态的格式:(虚方法的使用)

Person person = new Student();

有了对象的多态性以后,我们在编译期只能调用父类中声明的方法,而实际执行的是子类中重写父类的方法。总结:编译看左边,运行看右边。

注意:对象的多态性只适用于方法,对于属性来说,编译运行都看左边。

例子:(还是以Person类为例) 父类Person 和子类Studnet、Teacher 都有相同的方法method(在子类中是重写了父类方法)。而Student和Teacher都有他们共同的方法duty 和work 。通过下面的例子用来测试多态是如何调用他们共有的和不共有的方法。

//测试类,用于测试结果public class PersonText {public static void main(String[] args) {//多态方法使用一:PersonText text = new PersonText();text.show(new Student());//以Student对象调用show方法,输出的结果是Student类中的功能text.show(new Teacher());//以Teacher对象调用show方法,输出的结果是Teacher类中的功能//多态方法使用二:(虚方法)//调用共有时,向上转型后直接调用。调用不共有方法时,需要向下转型才可以调用其特有方法。Person per = new Student();//向上转型per.method(); //调用的是Student的method();Student stu = (Student)per;//向下转型stu.duty();//调用的是Student的duty()}//show方法,相当于一个接口,可以根据不同实例而输出不同的操作public void show(Person person){person.method();//父子共有的方法//类型判断if(person instanceof Student){Student student = (Student)person;student.duty();}else if(person instanceof Teacher){Teacher teacher = (Teacher)person;teacher.work();}}}//父类public class Person {public void method(){System.out.println("人可以骑车");}}//Student继承了Person类class Student extends Person {//method()是和父类都有的方法public void method(){System.out.println("学生会骑自行车");}//work是学生特有的方法public void duty(){System.out.println("学生主要任务是负责听课学习。");}}//Teacher继承了Person类class Teacher extends Person{//method是和父类都有的方法public void method(){System.out.println("老师会开轿车");}//work是教师特有的方法public void work(){System.out.println("老师主要任务是负责教学。");}}

输出结果:

扩展:instanceof

instanceof:

形式:a instanceof A类

用来判断a是否是A的实例。当A类继承其父类B时,a instanceof B类仍然成立。

四. 重载和重写

(1)什么是重载和重写?

重载:是指允许存在多个同名的方法,而这些方法的参数(类型丶数量等)不同 。java的重载是可以包括父类和子类的,子类可以对父类中的方法进行重载。但是重载不具有多态性。

重写:子类继承父类之后,可以对其同名同参数的方法内容进行改写。重写以后,当子类创建对象时,通过子类调用父类中的方法时,实现执行的是子类重写父类的方法。

(2)为什么要重写?

子类继承父类之后,扩展和修改父类中被重写方法的内容和功能。

(3)怎么实现重写?

方法的声明: 权限修饰符 返回类型 方法名 (形参){

//方法体

}

重写的规定:

①子类重写父类的方法时方法名和形参要和父类一样。

②子类重写父类的权限修饰符不能小于父类

③子类不能重写父类中权限为private的方法

④返回值不能比父类小

⑤…

总之,在开发运用中,我们可以直接复制父类中的方法(这样子类的权限和返回值就不比父类小了,比较省事),然后粘贴在子类中进行重写。

重写的格式:

class B{public void method(){方法1}}class A extends B{//复制父类B的方法过来,然后重写public void method(){方法2}}

例子:

还是上面那个Person的例子,只不过现在给他多加一个exercise()的方法,然后在子类中重写并调用,输出的结果是子类中重写的结果而不是父类。

public class Person {public void exercise(){System.out.println("人可以走路。");}}//Student继承了Person类public class Student extends Person {//直接复制父类Person,并且进行改写public void exercise(){//改写后输出的语句:System.out.println("学生会玩滑板,跑步等很多运动!");}public static void main(String[] args){//输出结果Student student = new Student();student.exercise();}}

输出结果:

扩展:在开发中,如果即重写了父类的方法,又想用原来父类的方法,可以用super关键字来获取父类被重写的方法。

(以上只是个人的狭隘见解,后续会根据学习的深入和理解对这篇文章进行修改,也希望每个看过的人有不同意见的可以提出来,我会虚心向学和改进的,谢谢各位)

如果觉得《java面向对象三大特性(封装丶继承丶多态) 以及重写和重载的理解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。