一:Java之面向对象基本概念

1、面向对象

面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm)。其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统。而且在系统构造中尽可能运用人类的自然思维方式。

什么是OOP?

OOP,即是面象对象的编程,是与结构化编程相对的编程方式。不了解结构化编程也无碍。简单地看下周遭的世界,你就能找到点OOP的特质。

比如:一辆汽车,有轮子、发动机等基本设备,能够行驶的基本功能。作为使用者。我们无需知道汽车的详细构造细节,仅仅要知道怎样操作方向盘,让汽车行驶就能够了。

也即是,要达到目标,我们仅仅要获得某一物体,知道怎样使用他就能够,无须关注详细的实现细节。

再比方,要组装一辆汽车。须要非常多非常多的零件,而这些零件呢,都具有一定的规格。能完毕某一详细的功能。

比方发动机产生动力,刹车片用来制动等等。各个零件相互组合来完毕更大的目标,这些零件就是要研究的详细的单元。

上面的样例中,汽车是我们要达到旅行目的所须要使用的单元,发动机、刹车片等是我们要组装一辆汽车须要的单元。在使用过程中,我们仅仅关注单元的规格、单元的能力,而不关心单元详细的运作细节。这些单元。在编程世界里,就能够抽象为类,即有一定属性、一定行为的类。

2、对象

  对象是系统中用来描写叙述客观事物的一个实体,它是构成系统的一个基本单位。

一个对象由一组属性和对这组属性进行操作的一组服务组成。

  类的实例化可生成对象。一个对象的生命周期包含三个阶段:生成、使用、消除。

  当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自己主动扫描对象的动态内存区。把没有引用的对象作为垃圾收集起来并释放。

当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步执行。

3、类

  类是具有同样属性和方法的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描写叙述,其内部包含属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包含属性和方法两个主要部分。

 Java中的类实现包含两个部分:类声明和类体。

  类声明

  <span style="font-size:18px;">  [public][abstract|final]class className [extends superclassName] [implements interfaceNameList]{……}
  当中。修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。

  类体 classclassName{ [public | protected | private ] [static][final] [transient] [volatile] type variableName;//成员变量 [public | protected | private ] [static][final | abstract] [native] [synchronized] returnType methodName([paramList])[throws exceptionList]{ statements }//成员方法 }</span>


  成员变量限定词的含义:

static:静态变量(类变量)

final:常量。transient:临时性变量,用于对象存档,用于对象的串行化

volatile:贡献变量,用于并发线程的共享

方法的实现也包含两部分内容:方法声明和方法体。

方法声明

  方法声明中的限定词的含义:

static:类方法,可通过类名直接调用

abstract:抽象方法,没有方法体

final:方法不能被重写

native:集成其他语言的代码

synchronized:控制多个并发线程的訪问

  方法声明包含方法名、返回类型和外部參数。

当中參数的类型能够是简单数据类型,也能够是复合数据类型(又称引用数据类型)。

  对于简单数据类型来说,java实现的是值传递。方法接收參数的值,但不能改变这些參数的值。假设要改变參数的值,则用引用数据类型,由于引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作能够改变数据的值。

  方法体

  方法体是对方法的实现,它包含局部变量的声明以及全部合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。若局部变量与类的成员变量同名,则类的成员变量被隐藏。

  为了差别參数和类的成员变量,我们必须使用this。

this用在一个方法中引用当前对象。它的值是调用该方法的对象。

返回值须与返回类型一致,或者全然同样,或是其子类。当返回类型是接口时,返回值必须实现该接口。

  构造方法

构造方法是一个特殊的方法。

Java 中的每一个类都有构造方法,用来初始化该类的一个对象。

构造方法具有和类名同样的名称,并且不返回不论什么数据类型。

重载经经常使用于构造方法。

构造方法仅仅能由new运算符调用

4、面向对象的基本特性

封装

  封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,仅仅保留有限的接口和方法与外界进行交互。

封装的原则是使对象以外的部分不能任意的訪问和操作对象的内部属性。从而避免了外界对对象内部属性的破坏。

  能够通过对类的成员设置一定的訪问权限,实现类中成员的信息隐藏

private:类中限定为private的成员,仅仅能被这个类本身訪问。

假设一个类的构造方法声明为private,则其他类不能生成该类的一个实例。

default:类中不加不论什么訪问权限限定的成员属于缺省的(default)訪问状态,能够被这个类本身和同一个包中的类所訪问。

protected:类中限定为protected的成员。能够被这个类本身、它的子类(包含同一个包中以及不同包中的子类)和同一个包中的全部其它的类訪问。

public:类中限定为public的成员,能够被全部的类訪问。

继承

  子类的对象拥有父类的所有属性与方法。称作子类对父类的继承。

Java中父类能够拥有多个子类,可是子类仅仅能继承一个父类。称为单继承。继承实现了代码的复用。

Java中全部的类都是通过直接或间接地继承java.lang.Object类得到的。

子类不能继承父类中訪问权限为private的成员变量和方法。

子类能够重写父类的方法。即命名与父类同名的成员变量。

  Java中通过super来实现对父类成员的訪问。super用来引用当前对象的父类。super 的使用有三种情况:

訪问父类被隐藏的成员变量,如:super.variable;

调用父类中被重写的方法,如:super.Method([paramlist]),super()调用父类构造方法;

调用父类的构造函数,如:super([paramlist]);

多态

    对象的多态性是指在父类中定义的属性或方法被子类继承之后,能够具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。比如:"几何图形"的"画图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"画图"方法功能不同。

  Java的多态性体如今两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(执行时多态)。

编译时多态:在编译阶段,详细调用哪个被重载的方法,编译器会依据參数的不同来静态确定调用对应的方法。

执行时多态:因为子类继承了父类全部的属性(私有的除外),所以子类对象能够作为父类对象使用。程序中凡是使用父类对象的地方,都能够用子类对象来取代。一个对象能够通过引用子类的实例来调用子类的方法。

  重载(Overloading)

方法重载是让类以统一的方式处理不同数据类型的手段。

一个类中能够创建多个方法,它们具有同样的名字,但具有不同的參数和不同的定义。调用方法时通过传递给它们的不同參数个数和參数类型来决定详细使用哪个方法。

返回值类型能够同样也能够不同样。无法以返回型别作为重载函数的区分标准。

  重写(Overriding)

子类对父类的方法进行又一次编写。假设在子类中的方法与其父类有同样的的方法名、返回类型和參数表,我们说该方法被重写 (Overriding)。

如需父类中原有的方法,可使用superkeyword,该keyword引用了当前类的父类。

子类函数的訪问修饰权限不能低于父类的。

 

publicclass Human{ // Human即是类的名字 
     String name;// 这是定义属性 
 
     // 这是定义行为 
     public void speack(String words){ 
          System.out.println(words); 
      } 
 
} 

<span style="font-size:18px;">HumanzhangSan = new Human(); </span>

 这样就创建了 zhangSan这个人了。

HumanzhangSan 的写法类似 int i 。着重解说后面new Human()


类与构造方法


在由类实例化一个详细的对象的时候,构造方法就会运行。

比方Human这个类,定义了2个构造方法。一个无參数,一个有參数。看清构造方法的形式---无返回值。

<span style="font-size:18px;">publicclass Human{ 
 
Stringid; // 这是标识对象唯一性的属性 
Stringname; 
 
// 这是new Human()时调用的构造方法 
Human(){ 
} 
 
// 这是 newHuman("111111111")时调用的构造方法 
Human(StringshenFenZheng){ 
   id= shenFenZheng; 
} 
 
} </span>


newHuman() 即调用无參数的构造方法创建一个 Human实例对象。

类的方法

方法是一个类行为的支撑,类全部的方法定义了这个类的能力范围,详细的实现过程则写在方法的内容中。方法的定义遵循一定的格式,即:

修饰符   返回值类型   方法名称(參数类型     參数名)

<span style="font-size:18px;">publicvoid speack(String words) </span>

这个样例中:

修饰符:public (这个繁琐以后讲)

返回值:void (空,即不返回值)

方法名称:speak

參数类型:String ( 字符串类型 )

參数名称: words(这是在 方法内部该变量的名称)

类的属性与存取方法

 

作为OOP原则之中的一个:数据隐藏(或称为封装)。对象的属性不能直接被外部对象訪问,而应该通过对象自身提供的get(取)、set(存)方法来完毕。

<span style="font-size:18px;">publicString getName() { 
    return name; 
} 
 
publicvoid setName(String aName) { 
    name = aName;  // 这里的name是类中的属性,该类的全部方法都能够直接訪问、赋值 
} </span>
 

一个较为合理的类

至此,一个类的片段我们都有了,以下拼接起来吧:

<span style="font-size:18px;">publicclass Human { 
    String id;  // 类的属性变量 
    String name; // 类的属性变量 
    // 这是new Human()时调用的构造方法 
    Human() { 
    } 
 
    // 这是 new Human("111111111")时调用的构造方法 
    Human(String shenFenZheng) { 
        id = shenFenZheng; 
    } 
 
    public String getId() { 
        return id; 
    } 
 
    public void setId(String shenFenZheng){ 
        id = shenFenZheng; 
    } 
 
    // 取name内容的方法 
    public String getName() { 
        return name; 
    } 
 
    // 改动name内容的方法 
    public void setName(String aName) { 
       name = aName; 
    } 
 
    // 类的行为 
    public void speak(String words) { 
        System.out.println(words); 
    } 
} 
 
 
使用实例:
publicclass Meeting { 
 
    public static void main(String[] args){ 
 
        // 一个小娃出生了 
        Human zhangSan = new Human(); 
        // 报了户口,身份证号是 
       zhangSan.setId("1234567890123"); 
        // 家长给起了个名字 
        zhangSan.setName("张三"); 
 
        // 又一个小娃出生了 
        Human xiaoMing = new Human(); 
        xiaoMing.setId("3210987654321"); 
        xiaoMing.setName("小明"); 
         
        // 两人见面了,张三先打招呼 
        zhangSan.speak("你好!我是"+zhangSan.getName()); 
        // 出于礼貌,小明回了句 
        xiaoMing.speak("你好!

我是"+xiaoMing.getName()+",非常高兴认识你"); } } </span>



原文地址:https://www.cnblogs.com/clnchanpin/p/7053761.html