Java面向对象编程思想

1、面向对象编程是什么

   面向对象编程(Object Oriented Programming,故常称OOP)并非Java独有,而是一种编程的思想,Java、C++、Python均有对其实现。其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的,任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

2、OOP的优缺点

优点:易于维护与扩展,代码复用性高。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活多变。
缺点:CPU开销大、占据资源多

3、三大特性

封装:隐藏对象的属性和实现细节,仅保留一些对外接口;
继承:子类可以继承父类的属性和方法;
多态:同一个行为具有多个不同表现形式或形态的能力。

3.1、封装

   使用访问权限修饰符来实现对属性和方法的控制,包括private:仅限本类可以访问;default(默认权限):仅限本包可以访问;protected:仅限包内和继承的子类可以访问;public:均可访问。
  我们在定义一个对象类时,通常对属性进行隐藏,提供公共的set、get方法进行访问。

/**
 * @author RuiMing Lin
 * @date 2020-03-05 16:01
 */
public class Person {

    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.2、继承

   继承可以使子类获得父类的所有非私有属性和方法,减少了代码的复用。继承可以使对象层次化,类型比较明确。

/**
 * @author RuiMing Lin
 * @date 2020-03-05 18:18
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son("小明",23);
        s.eat();        //从父类继承的方法
        s.sleep();      //重新父类的方法
        s.study();      //子类自己定义的方法
    }
}

class Father{
    String name;
    int age;

    public Father(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("吃饭");
    }

    public void sleep(){
        System.out.println("父亲睡觉");
    }
}

class Son extends Father{
    public Son(String name, int age) {
        super(name, age);
    }

    @Override
    public void sleep(){
        System.out.println("儿子睡觉");
    }

    public void study(){
        System.out.println("儿子学习");
    }
}

3.3、多态

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(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(); 
    } 
}

   由于多态特性的支持,showAnimalEat方法的Animal类型,是Cat和Dog的父类类型,父类类型接收子类对象,可以把Cat对象和Dog对象传递给方法。当eat方法执行时,多态规定,执行的是子类重写的方法,那么效果自然与showCatEat、showDogEat方法一致, 所以showAnimalEat完全可以替代以上两方法。不仅仅是替代,在扩展性方面,无论之后再多的子类出现,我们都不需要编写showXxxEat方法了,直接使用 showAnimalEat都可以完成。 所以,多态的好处,体现在可以使程序编写的更简单,并有良好的扩展。

3.3.1、多态运行规则

  编译期若是父类(父接口)拥有该方法或类,则使用的IDE不会报错;运行期则看具体的类型,若是该类该方法或类,则使用的IDE不会报错。

  1. 成员变量:编译期看左边,运行期看左边;
  2. 静态方法:编译期看左边,运行期看左边;
  3. 非静态方法:编译期看左边,运行期看右边。

4、总结

  面向对象编程思想不同于面向过程编程,它的使用更加的严格与规范。Java的面向对象编程更是有许多规范,需要对Java学习的更加深入才会对它更好的理解。

  

有错误的地方敬请指出,欢迎大家评论区或者私信交流!每日持续更新Java、Python、大数据技术,请大家多多关注!

猜你喜欢

转载自blog.51cto.com/14065757/2482335