首页 > 编程知识 正文

面向对象编程的优点,如何理解面向对象的三大特征

时间:2023-05-03 22:23:34 阅读:32072 作者:311

封装、多态、继承是面向对象编程的三大特性。

封装(Encapsulation )封装的目的是确保变量的安全,用户不需要在意具体实现的细节,只是可以通过外部接口访问类成员

如果不封装,可以直接查看和修改类中的实例变量,这可能会对整个代码产生负面影响

因此,创建类时通常要私有化成员变量,外部类必须与getter和setter方法一起显示和设置变量

继承(Inherit )继承实际上也是因为提高代码的复用性和可扩展性,在定义不同的类时存在一些相同的属性,为了方便起见,将这些公共属性抽象为一个父类,在定义其他子类时子类可以使用父类3358www.Sina.com

继承的格式如下:

class子类非私有父类{ }

可以用以下示例表示:

public class Fu { public void show () { System.out.println (调用父类的show方法); } public void method () { System.out.println ) (调用父类的method方法); } publicclassydysextendsfu { @ overridepublicvoidmethod () { System.out.println子类的method方法被调用); } public class demo { publicstaticvoidmain (字符串[ ] args ) /创建对象,方法Fu f=new Fu ); f.show (; //父类的show方法是yydys z=new yydys (); z.method (; //子类的show方法调用z.show (; //调用父类的show方法}在上述代码中,yydys从Fu继承,yydys类重写Fu类的method方法,yydys类在执行method方法时被重写这将导致extends

其他,如果子类对父类中方法进行了重写,子类在调用该方法时执行的是重写后的方法。

使用继承关系时,不仅是单层继承,通常还会形成层次关系明显的继承树,为了定义狼,其父类可以有狗和动物类。 下图以有点复杂的例子说明了他们的关系。 在Java API中,大多数继承关系不会超过三层

继承需要注意:

父类可以知道有哪个子类,但子类必须明确有哪个父类

子类重写父类时,如果希望向父类的功能添加新功能,可以在super中实现,如下所示:

public void roam ()//父类的方法super.roam ); //新添加的行为new stuff; }不能是继承的子类:

访问控制使用final修饰符,以防止重写父类的方法。 通常,要添加final修饰符,只有private构造函数方法子类的参数数量和类型与父类完全匹配,返回类型必须兼容

对子类中方法的访问权限必须低于对父类中方法的访问权限

多态性(Polymorphism )。

多态性是指同一对象表现出多种形态,一般指子类中还可以定义新的变量和方法

下面的代码示例可以直观地表示

公共类动画{公共intage=40; public void eat () ({ System.out.println ) ),动物吃东西); } publicclasscatextendsanimal { public intage=20; 公共输入权重=10; @ overridepublicvoideat ((system.out.println ) )猫吃鱼); } public void playGame () ({ System.out.println ) )猫游戏); } publicclassanimaldemo { publicstaticvoidmain (字符串[ ] args ) /父类引用指向子类中的对象,Animal a=new Cat ); Cat c=new Cat (; System.out。

println(a.age); // 40 a.eat; // 猫吃鱼 // 向下转型 Cat t = (Cat) a;System.out.println(t.age); // 20 System.out.println(t.weight); // 10 System.out.println(c.age); // 20 System.out.println(a.weight); // 10 }}

以上代码还涉及到了多态中的向上转型和向下转型问题,Animal a = new Cat();是一种向上转型,相当于定义了一个Animal类型的引用变量a指向一个Cat类的对象,Cat t = (Cat) a是向下转型,将Animal类型的引用比那里a传给了Cat类型的引用变量t,两者在成员变量和成员方法上的调用有所区别:

成员变量的调用 a调用的成员变量都是Animal中的成员变量t调用的成员变量都是Cat中的成员变量 成员方法的调用 a在调用成员方法时只能调用Animal中的声明过的成员方法,如果a对Animal中声明的方法进行重写,那调用的是重写后的方法,如果没有,调用的是Animal中的方法t在调用成员方法时调用的都是Cat中的成员方法

在接口和抽象类中的Object介绍中也给出了向上转型和向下转型的图释,编译器根据引用类型来判断哪些方法可以调用

此外,多态还可以应用到参数和返回类型中,如下代码

class Vet{ public void giveShot(Animal a){ a.makeNoise(); }}class PetOwner{ public void start(){ Vet v = new Ver(); Dog d = new Dog(); Hippo h = new Hippo(); v.getShot(d); //调用Dog类中的makeNoise方法 v.getShot(h); //调用Hippo类中的makeNoise方法 }} 方法重写(override)和重载(overload)的区别

方法重载:方法重载指的是同一个类中定义多个同名方法,这些同名方法的参数个数和类型不同,返回类型和存取权限可以不同

方法重写:方法重写指的是有继承关系的子类继承父类中的方法并定义不同的方法体,子类和父类中的方法名和参数个数类型要完全一样,是一种覆盖。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。