面向对象

Java是一门面向对象语言, 一个Java程序就是一系列对象(Object)的集合, 对象通过方法调用来彼此协作完成特定的功能。

  • 类: 类是一个模板, 描述一类对象的行为和状态.
  • 对象: 对象是类的一个实例

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

    // 成员方法
    void startup() {
        System.out.println("启动!");
    }

    // 成员方法
    void run(int speed) {
        System.out.println("我的速度是" + speed);
    }
}
public class Post {
    String title; // 成员变量
    String content; // 成员变量

    // 成员方法
    void print() {
        System.out.println(title);
        System.out.println(content);
    }
}

构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法, Java编译器将会为该类提供一个默认构造方法。 在创建一个对象的时候, 至少要调用一个构造方法。构造方法的名称必须与类同名, 一个类可以有多个构造方法。 下面是一个构造方法示例:

public class Puppy{
    public Puppy(){
    }

    public Puppy(String name){
        // 这个构造器仅有一个参数:name
    }
}

创建对象

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

  1. 声明:声明一个对象, 包括对象名称和对象类型。
  2. 实例化:使用关键字new来创建一个对象。
  3. 初始化:使用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" );
   }
}

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法

/* 实例化对象 */
ObjectReference = new Constructor();
/* 访问类中的变量 */
ObjectReference.variableName;
/* 访问类中的方法 */
ObjectReference.MethodName();
实例
public class Puppy{
   int puppyAge;
   public Puppy(String name){
      // 这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name );
   }

   public void setAge( int age ){
       puppyAge = age;
   }

   public int getAge( ){
       System.out.println("小狗的年龄为 : " + puppyAge );
       return puppyAge;
   }

   public static void main(String []args){
      /* 创建对象 */
      Puppy myPuppy = new Puppy( "tommy" );
      /* 通过方法来设定age */
      myPuppy.setAge( 2 );
      /* 调用另一个方法获取age */
      myPuppy.getAge( );
      /*你也可以像下面这样访问成员变量 */
      System.out.println("变量值 : " + myPuppy.puppyAge );
   }
}

源文件声明规则

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

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

Java还有一些特殊的类, 如: 内部类, 匿名类

Java包

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

import语句

在Java中, 如果给出一个完整的限定名, 包括包名, 类名, 那么Java编译器就可以很容易地定位到源代码或者类. import语句就是用来提供一个合理的路径, 使得编辑器可以找到某个类.

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

import java.io.*

实例

创建两个类Employee, EmployeeTest

Employee类由四个成员变量: name, age, designation, salary. 该类显式声明了一个构造方法, 该方法只有一个参数

import java.io.*;

public class Employee {
    String name;
    int age;
    String designation;
    double salary;
    // Employee 类的构造器
    public Employee(String name){
        this.name = name;
    }
    // 设置age的值
    public void empAge(int empAge){
        age = empAge;
    }
    // 设置designation的值
    public void empDesignation(String empDesig){
        designation = empDesig;
    }
    // 设置salary的值
    public void empSalary(double empSalary){
        salary = empSalary;
    }
    // 打印信息
    public void printEmployee(){
        System.out.println("名字:" + name);
        System.out.println("年龄:" + age);
        System.out.println("职位" + designation);
        System.out.println("薪水" + salary);
    }
}

EmployeeTest.java

程序都是从main方法开始执行. 所以必须包含main方法, 并且创建一个实例对象.

EmployeeTest类, 实例化两个Employee类的实例, 并调用方法设置变量的值.

import java.io.*;

public class EmployeeTest {
    public static void main(String args[]){
        // 使用构造器创建两个对象
        Employee empOne = new Employee("RUN00B1");
        Employee empTwo = new Employee("RUN00B2");
        // 调用这两个对象的成员方法
        empOne.empAge(26);
        empOne.empDesignation("高级程序员");
        empOne.empSalary(1000);
        empOne.printEmployee();

        empTwo.empAge(21);
        empTwo.empDesignation("菜鸟");
        empTwo.empSalary(500);
        empTwo.printEmployee();
    }
}

run EmployeeTest.java结果

名字:RUN00B1
年龄:26
职位高级程序员
薪水1000.0
名字:RUN00B2
年龄:21
职位菜鸟
薪水500.0