面向对象三大核心特征

一.什么是面向对象?

面向对象编程也称为OOP(object oriented programming)也就是程序员将一类相同属性和行为的事物抽象描述出来叫做类。类是构造面向对象程序的基本单位。类是对象的抽象,对象是类的具体。

二.面向对象的三大特性

1.封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

1.1优点:
1). 良好的封装能够减少耦合。
2). 类内部的结构可以自由修改。
3). 可以对成员变量进行更精确的控制。
4). 隐藏信息,实现细节。
5).只能通过规定的方法访问数据。
6).隐藏类的实例细节,方便修改和实现。

1.2实现:
1)变量名私有,修改属性的可见性来限制对属性的访问,一般设为 private。

2)对外开放用getter和setter方法,为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。

3)在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。

4)采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

举例子:

public class Student {
    private String stuNo;//学号
    private String name;//姓名
    private char gender;//性别
    private double score;//分数

    //若类中已定义任何构造方法,则系统不再提供无参构造,如需使用,请显示声明。
    public Student() {
    }

    //有参构造器
    public Student(String stuNo, String name, char gender, double score) {
        this.stuNo = stuNo;
        this.name = name;
        this.gender = gender;
        this.score = score;
    }

    //学生考试
    public  void  test(){
        System.out.println(name+"考了"+score+"分");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        // 对分数进行限制
        if (score < 0 || score > 100) {
            System.out.println("分数必须在0到100之间!");
        } else {
            this.score = score;
        }
        this.score = score;
    }

    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    //查看
    @Override
    public String toString() {
        return "Student{" +
                "stuNo='" + stuNo + '\'' +
                ", name='" + name + '\'' +
                ", gender=" + gender +
                ", score=" + score +
                '}';
    }
}

2.继承
继承和多态是面向对象开发语言中非常重要的一个环节,如果在程序中使用继承和多态得当,整个程序的架构将变得非常有弹性,同时可以减少代码的冗余性。

2.1优点:
实现代码共享,减少创建类的工作量,使子类可以拥有父类的方法和属性。

提高代码维护性和可重用性。

提高代码的可扩展性,更好的实现父类的方法。

2.2继承的特点
(1)Java 的继承是单继承(每个孩子只能有一个爸爸)

(2)继承是一种高级封装

(3)子类可以用自己的方式实现父类的方法。

(4)不能继承父类的
*成员变量和方法
*构造方法
(显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。)
*非同包父类受保护类型 protected
*通过访问修饰符和包进行访问权限控制

                     类内    同包     不同包子类   其他
     private          √                   
     default          √       √
     protected        √       √       √
     public           √       √       √         √

(5)如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。

2.3继承中用到的关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,这边先讲 extends ,一般implements 用来实现接口。

public class Animal { 
    private String name;   
    private int id; 
    public Animal(String myName, String myid) { 
        //初始化属性值
    } 
    public void eat() {  //吃东西方法的具体实现  } 
    public void sleep() { //睡觉方法的具体实现  } 
} 
 
public class Penguin  extends  Animal{ 
}

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}
 
class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法
  }
}
 
public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}

更多super关键字讲解,可以看看这篇文章
super讲解

3.多态
所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。

3.1优点:

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性

3.2多态存在的三个必要条件:
继承
重写
父类引用指向子类对象

3.3多态的实现方式
方式一:重写
方式二:接口
方式三:抽象类和抽象方法

3.4多态涉及的知识点:
转型(有继承关系的对象类型的转化 )

转型分为向上转型,和向下转型
1.自动类型转换(向上转型) :父类引用指向子类的对象

2.强制类型转换向下转型):不是将父类的对象转为子类对象(向下转型)通过instance of 运算符判定父类引用转向子类对象的实际类型 。不然会报java.lang.ClassCastException 类型转换异常

举例子:

public class Test {
    public static void main(String[] args) {
        Animal a = new Cat();  // 向上转型
        a.eat();               // 调用的是 Cat 的 eat
        if (a instanceof Cat) {
            Cat c = (Cat) a;     // 向下转型
        } else if (a instanceof Dog) {
            Dog c = (Dog) a;      // 向下转型
        }
    }
}

abstract class Animal {
    abstract void eat();
}

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

    public void work() {
        System.out.println("抓老鼠");
    }
}

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

    public void work() {
        System.out.println("看家");
    }
}

推荐一个讲解多态详细的地址
Java中的多态有哪些具体表现形式


版权声明:本文为weixin_44695793原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。