Java面向对象(一)_面向对象及构造方法

备注:如有错误请给予联系。

1. 面向对象设计思想

  面向对象程序设计语言必须有描述对象及其相互之间关系的语言成分。

   这些程序设计语言可以归纳为以下几类:

   系统中一切事物皆为对象;

   对象是属性及其操作的封装体;

   对象可按其性质划分为类,对象成为类的实例;

   实例关系和继承关系是对象之间的静态关系;

   消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;

   方法是消息的序列。

2. 面向对象的分析与设计

  面向对象的分析和设计是现代软件企业广为采用的一项有效技术。

     OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体。

  面向对象能够更好的去理解你要做的东西应该如何去做。

3. Java与面向对象

Java作为一种面向对象语言。支持以下基本概念:

  •  多态
  •  继承
  • 封装
  • 抽象
  • 对象
  • 实例
  • 方法
  • 重载

 

  对象

           对象是类的一个实例,有状态和行为。

           例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

 

      类是一个模板,它描述一类对象的行为和状态。

 

      下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

       

 

Java中的对象

  拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

  对比现实对象和软件对象,它们之间十分相似。

  软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

  在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

Java中的类

  类可以看成是创建Java对象的模板。

  通过下面一个简单的类来理解下Java中类的定义:

1 public class Dog{ 
2 String breed; 
3 int age; 
4 String color; 
5 void barking(){ } 
6 void hungry(){ } 
7 void sleeping(){ } 
8 }

 一个类可以包含以下类型变量:

 

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。

 

   一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。

创建对象

 对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字new来创建一个对象。
  • 初始化:使用new创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

public class Puppy{ 
public Puppy(String name){
 //这个构造器仅有一个参数:name
 System.out.println("小狗的名字是 : " + name ); 
} 
public static void main(String[] args){
 // 下面的语句将创建一个Puppy对象 
Puppy myPuppy = new Puppy( "tommy" ); 
} 
}

 

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

 

/* 实例化对象 */ 
Object referenceVariable = new Constructor(); 
/* 访问类中的变量 */ 
referenceVariable.variableName; 
/* 访问类中的方法 */ 
referenceVariable.methodName();

 

实例

下面的例子展示如何访问实例变量和调用成员方法:

 

 1 public class Puppy{ 
 2 int puppyAge; 
 3 public Puppy(String name){ 
 4 // 这个构造器仅有一个参数:name
 5  System.out.println("小狗的名字是 : " + name ); 
 6 } 
 7 public void setAge( int age ){
 8  puppyAge = age; 
 9 } 
10 public int getAge( ){ 
11 System.out.println("小狗的年龄为 : " + puppyAge ); 
12 return puppyAge; 
13 } 
14 public static void main(String[] args){ 
15 /* 创建对象 */ 
16 Puppy myPuppy = new Puppy( "tommy" ); 
17 /* 通过方法来设定age */ 
18 myPuppy.setAge( 2 );
19  /* 调用另一个方法获取age */ 
20 myPuppy.getAge( ); 
21 /*你也可以像下面这样访问成员变量 */ 
22 System.out.println("变量值 : " + myPuppy.puppyAge ); 
23    }
24  }

 

 

 

源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个public类
  • 一个源文件可以有多个非public类
  • 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
  • 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
  • import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。

除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类

Java包

包主要用来对类和接口进行分类。

当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。

Import语句

Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。

Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类

import java.io.*;

 

4. 构造方法的定义和调用

  构造方法是一种特殊的方法,它是一个与类同名的方法。

  对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。

  当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。

构造方法的特殊性:

  构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:

  1.构造方法作用:(1.构造出来一个类的实例 (2.对构造出来个一个类的实例(对象)初始化。

  2.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。

  3.主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。

  4.类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。

  5.不能被staticfinalsynchronizedabstractnative修饰。

  6.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,

           java编译系统会自动按 照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。

  7.构造方法分为两种:无参构造方法 有参构造方法构造方法可以被重载

    没有参数的构造方法称为默认构造方法,与一般的方法一样,

    构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。

  8.构造代码块:
    (1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
    (2)构造代码块和构造函数的区别:
  构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化

  9.子类继承父类中,
    ***子类的实例化过程
    ***构造方法不能被子类继承
    ***子类创建对象时,会先去创建父类的对象。
    默认是去调用父类的无参构造方法。
    ***子类构造方法中,第一行默认是super()
    ***为什么子类中第一行会默认有super()
    因为他继承父类的成员使用,使用前这些成员必须初始化,
    而他们是父类的成员,所以,必须通过父类进行初始化。
    所以,会先创建一个父类的对象。
    **当父类没有无参构造方法时

  必须使用this或者super调用其他的构造方法。

  10.自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。

    如果写了一个有参的构造方法,就一定要写无参构造方法。
  如果想使用无参的构造方法,就必须手动给出无参构造方法。
  建议:一般情况下,我们自定义的类都要手动给出无参构造方法。

具体使用:分别计算长、宽为201063的两个长方形的面积。

 1 class RectConstructor{
 2 double length;
 3 double width;  4 double area(){
 5 return length*width;
 6 }
 7 RectConstructor(double width,double length){//带参数的构造方法
 8 this.length=length;
 9 this.width=width;
10 }
11 }
12 public class RectDemo{
13 public static void main(String args[]) {
14 RectConstructor rect1=new RectConstructor(10,20);
15 RectConstructor rect2=new RectConstructor(3,6);
16 double ar;
17 ar=rect1.area();
18 System.out.println("第一个长方形的面积是"+ar);
19 ar=rect2.area();
20 System.out.println("第二个长方形的面积是"+ar);
21 }
22 }

控制台输出结果为:

第一个长方形的面积是200

第二个长方形的面积是18

 

 

 

 

 

参考网址:

面向对象;https://www.runoob.com/java/java-object-classes.html

构造方法:https://baike.baidu.com/item/%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95/10455265?fr=aladdin

 

posted @ 2019-08-23 09:22  缥缈咘咘  阅读(322)  评论(0编辑  收藏  举报