Java面向对象中的注意事项

关于Java面向对象编程,不可能是一开始就全部学完的,他会伴随着你的Java编程的整个过程,在以后的学习或者工作中,你才能够越来越深入的去理解面向对象这个思想.Object Oritended Programming就是面向对象编程的全称.简称OOP,主要有三大特性,封装,继承,多态.

举个例子,洗衣服:

  • 面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾起来办

  • 面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来

封装(Encapsulation)


封装可以理解为一种保护机制,防止该类的代码和变量被随意访问和被更改,如果需要访问必须通过制定的方式,例如Setter和Getter方法.适当的封装可以让代码更容易维护和理解,也增强了代码的安全性.

原则:将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。多数情况下都是利用private关键字,对方法或者属性进行隐藏.然后提供公共方法来调用他们.封装比较简单.其根本目的就是将不允许随便调用,修改的属性或者方法隐藏起来.比如在网络游戏中,每个人物角色的属性都是封装好的,任务姓名,等级,属性,天赋等.如果想要改名字就必须买更名卡,这里的更名卡就相当于一个公共的方法.等级要升级的话也是一样的.

继承(Inheritance)


关于继承我自己的理解是,一个类里需要用到另一个类里的属性或者方法,而这些属性又是重复的,复用性比较高的,继承的特点就是在于提高代码的复用性.比如学生Student和老师Teacher都是人Person,他们都有人类的公共属性,像年龄,姓名,性别,身高,体重.这些东西都是学生和老师共有的属性,如果直接写的话,这些代码需要在这两个类中重复的写两遍,但是我们可以把他抽出来作为一个人类,然后让学生和老师去继承这个类,和这个类中的属性.这样就不用写太多冗余的代码.人类就是老师和学生的父类.

不过,子类继承父类的时候,子类只能使用父类非私有的成员变量.如果是私有的,还是得通过公共方法来调用.子类同样不能重写父类私有的方法.

子类在写构造方法的时候,可以继承父类的构造方法,也可以自己写属于自己本类的构造方法.比如学生私有的属性,.就可以写一个无参的构造方法加上一个有参的构造方法.

如果子类的构造函数第一行没有调用子类的构造(this)或者没有调用父类的构造(super),则默认调用父类无参的构造方法.

如果子类调用了父类的父类的构造,就不会调用父类的无参构造.

如果子类调用了自身的其他构造,就不会调用父类的无参构造.

总结:

在创建对象的过程中,执行顺序是首先调用的是父类的构造方法.

继承优缺点

优点:提高了代码的复用性,重复的代码可以重复利用.

提高了代码的可维护性,如果子类的代码需要修改,在父类中修改后,子类同样会生效,前提是两者共有的属性或者方法,

缺点:

违背了开发的高内聚,低耦合的思想.将很多代码紧紧联系在一起.

高内聚:是指自己独立完成自己功能的模块

低耦合:类与类之间的关系尽量不要太紧密.


多态(Polymorphism)

关于多态,我自己的理解是,在实际应用中,用父类去创建子类对象,比如猫Cat继承动物Animal类.创建对象的时候,用对象去调用比如父类的

Animal a = new Cat();

eat方法,但是调用的不是父类原来的eat,而是子类重写后的eat方法.因为实际上new的还是猫对象.

多态的前提就是继承,方法的重写,父类引用指向子类对象.

但是父类new子类对象时,如果想要调用子类特有的方法,比如说Cat里面的抓老鼠方法,这时候就涉及到对象的转型问题.
    向上转型:子类乔装成其父类的过程(多态的时候)

    向下转型:卸妆的过程;(需要调用子类特有的成员的时候,就需要卸妆)

可以使用instanceof这个关键字来判断,某个对象是否属于某个类或者某个接口.否则可能会发生ClassCastException.

实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。

定义父类:

public abstract class Animal {  
    public abstract void eat();  
}  

定义子类:

class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
}  

class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
}

定义测试类:

public class Test {
    public static void main(String[] args) {
        // 多态形式,创建对象
        Cat c = new Cat();  
        Dog d = new Dog(); 

        // 调用showCatEat 
        showCatEat(c);
        // 调用showDogEat 
        showDogEat(d); 

        /*
        以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代
        而执行效果一致
        */
        showAnimalEat(c);
        showAnimalEat(d); 
    }

    public static void showCatEat (Cat c){
        c.eat(); 
    }

    public static void showDogEat (Dog d){
        d.eat();
    }

    public static void showAnimalEat (Animal a){
        a.eat();
    }
}

狗类和猫类中都有eat方法,而且特闷都继承与动物类,所以定义一个使用动物eat的方法,传入动物对象,会自动根据传入的对象类型来实现具体调用子类重写的具体方法.这种方式在接口中使用的也比较多.在以后的练习中,多态的思想也会体现的更加明显.

猜你喜欢

转载自blog.csdn.net/weixin_42401258/article/details/81784426