JavaSE(面向对象)

Posted earnest-jie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE(面向对象)相关的知识,希望对你有一定的参考价值。

Java面向对象(Object-Oriented Promgramming)


学习面向对象内容的三条主线

  1. Java类及类的成员
  2. 面向对象三大特征
  3. 其他关键字

面向对象

概念

Java是面向对象的编程语言,与面向过程(procedure-oriented programming)相对,对象是面向对象编程的核心.对象其实就是真实世界中的实体,对象与实体是一一对应的,换言之,真实世界中的每一个实体就是一个对象,它是一种具体的概念.

特点

  1. 对象有属性和行为.(就像现实世界的实体都有状态和动作)
  2. 对象具有变化的状态.(现实世界的实体也并非一成不变的)
  3. 对象是唯一的
  4. Everything is object.
  5. 对象是某个类的具体实例.

思想概述

  1. 程序员从执行者转化成了指挥者

  2. 完成需求时:

    • 先去找具有所需功能的对象来用。
    • 如果该对象不存在,那么创建一个具有所需功能的对象。
    • 这样简化开发并提高复用。
  3. 类(class)和对象(object)是面向对象的核心概念。

    • 类是对现实世界事物的描述,是抽象的、概念上的定义
    • 对象是实际存在的该类事物的一个个体,因而也称实例(instance)。

对象组成(类和类成员)

  • 属 性:对应类中的成员变量(描述事物的特征)
  • 行 为:对应类中的成员方法(描述事物的行为)
class Person{
    String name;
    int age;
    boolean isMarried;
    //↑属性,或成员变量
    //↓方法,或函数
    public void walk(){
        System.out.println("人走路...");
    }
    public String display(){
        return "name : " + name + ", age : " + age + ", Married : " + isMarried;
    }
}

面向对象的三大特征


封装 (Encapsulation)

使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。

public class Animal { //应该将legs属性保护起来,防止乱用。保护的方式:信息隐藏

	 public int legs;	    
	 public void  eat(){
		System.out.println(“Eating.”);
	 }
	 public void move(){
		System.out.println(“Moving.”);
    }
 }

public class Zoo{
	  public static void main(String args[]){
		 Animal xb=new Animal();
		 xb.legs=4;
		 System.out.println(xb.legs);
	           xb.eat();xb.move();
     } 
}

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

  • 隐藏一个类中不需要对外提供的实现细节;

  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

  • 便于修改,增强代码的可维护性;

继承 (Inheritance)

为什么要有继承?

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

  • 此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”

  • 类继承语法规则:

    class Subclass extendsSuperclass{}

特点

Java只支持单继承,不允许多重继承

  • 一个子类只能有一个直接父类
  • 一个父类可以派生出多个子类
class SubDemo extends Demo{ }  //ok

class SubDemo extends Demo1,Demo2...//error

override(方法覆盖)

  • 定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重写、重置。在程序执行时,子类的方法将覆盖父类的方法。

  • 要求

    1. 覆盖方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
    2. 覆盖方法不能使用比被重写方法更严格的访问权限。
    3. 覆盖和被覆盖的方法必须同时为非static的。
    4. 子类方法抛出的异常不能大于父类被重写方法的异

super

  • 在Java类中使用super来调用父类中的指定操作:

    1. super可用于访问父类中定义的属性
    2. super可用于调用父类中定义的成员方法
    3. super可用于在子类构造方法中调用父类的构造器
  • 注意:

    1. 尤其当子父类出现同名成员时,可以用super进行区分
    2. super的追溯不仅限于直接父类
    3. super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识

多态 (Polymorphism)

多态性

是面向对象中最重要的概念,在java中有两种体现:

  1. 对象的多态性
  2. 引用变量的多态性
  • Java引用变量有两个类型:编译时类型运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
  • 若编译时类型和运行时类型不一致,就出现多态(Polymorphism)

对象的多态

子类对象的多种父类形态, 换言之就是把子类对象作为父类对象来使用.

引用变量的多态性

  • 一个基本型变量只能有一种确定的数据类型
  • 一个引用类型变量可能指向(引用)多种不同类型的对象
Person p = new Student();

Object o = new Person();

//Object类型的变量o,指向Person类型的对象

o = new Student(); 

//Object类型的变量o,指向Student类型的对象

多态副作用

  • 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法(多态副作用)
 Student m = new Student();

 m.school = “pku”;  //合法,Student类有school成员变量

 Person e = new Student(); 

 e.school = “pku”; //非法,Person类没有school成员变量

属性和方法是在编译时确定的,编译时引用变量e为Person类型,Person类型中并没有school成员变量,因而编译错误, 方法的使用也是一样

虚拟方法调用(Virtual Method Invocation)

 // 正常的方法调用
   	Person e = new Person();
  	e.getInfo();
  	Student e = new Student();
   	e.getInfo();
 // 虚拟方法调用(多态情况下)
  	Person e = new Student();
    	e.getInfo();	//调用Student类的getInfo()方法

编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。——动态绑定

以上是关于JavaSE(面向对象)的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段9——JS中的面向对象编程

javaSE面向对象初级01

JavaSE| 面向对象的三大特征

JavaSE知识-08(面向对象_继承&方法&final)

JavaSE入门学习21:Java面向对象之接口(interface)

JavaSE基础知识—面向对象(5.4面向对象三大特征:封装继承多态)