5.2. 类

5.2.1. 1.类

类是Java中的一种重要的引用数据类型,是组成Java程序的基本要素。它封装了一类对象的数据和操作。

1.1 类声明

Java语言中一个类的实现包括:类声明和类体。类声明语法格式如下:

[public][abstract|final] class className [extends superclassName] [implements interfaceNameList] {
//类体
}

其中,class是声明类的关键字,className是自定义的类名;class前面的修饰符public、abstract、final用来声明类,它们可以省略,它们的具体用法后面章节会详细介绍;superclassName为父类名,可以省 略,如果省略则该类继承Object类,Object类所有类的根类,所有类都直接或间接继承Object; interfaceNameList是该类实现的接口列表,可以省略,接口列表中的多个接口之间用逗号分隔。

声明动物(Animal)类代码如下:

// Animal.java
public class Animal extends Object {
//类体
}

上述代码声明了动物(Animal)类,它继承了Object类。继承Object类extends Object代码可以省略

1.2 成员变量

声明类体中成员变量语法格式如下:

class className {
[public | protected | private ] [static] [final] type variableName; //成员变量
}

其中type是成员变量数据类型,variableName是成员变量名。type前的关键字都是成员变量修饰符,它们说明如下:

1. public、protected和private修饰符用于封装成员变量。
2. static修饰符用于声明静态变量,所以静态变量也称为“类变量”。
3. final修饰符用于声明变量,该变量不能被修改。

下面看一个声明成员变量示例:

package com.company3;

public class Animal extends Object {
    int age = 18;
    public boolean sex = false;
    private double weight = 0.0;

}

1.3 成员方法

声明类体中成员方法语法格式如下:

class className {
[public | protected | private ] [static] [final | abstract] [native] [synchronized]
type methodName([paramList]) [throws exceptionList] {
//方法体
}
}

其中type是方法返回值数据类型,methodName是方法名。type前的关键字都是方法修饰符,它们说明如下:

01. public、protected和private修饰符用于封装方法。
02. static修饰符用于声明静态方法,所以静态方法也称为“类方法”。
03. final | abstract不能同时修饰方法,final修饰的方法不能在子类中被覆盖;abstract用来修饰抽象方法,抽象方法必须在子类中被实现。
04. native修饰的方法,称为“本地方法”,本地方法调用平台本地代码(如:C或C++编写的代码),不能实现跨平台。
05. synchronized修饰的方法是同步的,当多线程方式同步方法时,只能串行地执行,保证是线程安全的

   方法声明中还有([paramList])部分,它是方法的参数列表。throws exceptionList是声明抛出异常列表。

声明方法示例:

package aom;

public class Animal {
    int age = 1;            //年龄
    public boolean sex = false; //性别
    private double weight = 0.0;   //体重

    public String eat() {
        String food = "我吃大米";
        return food;
    }

    int run() {
        return 10;
    }

    protected int getMaxNumber(int num1, int num2) {
        if (num1 > num2) {
            return num1;
        }
        return num2;
    }

    public static void main(String[] args) {
        Animal hu1 = new Animal();
        System.out.println("动物的年龄是:" + hu1.age);
        if (hu1.sex == false) {
            System.out.println("动物是磁性");
        } else {
            System.out.println("动物是雄性");
        }
        System.out.println("动物的体重是:" + hu1.weight);
        System.out.println(hu1.run());
        System.out.println(hu1.eat());
        System.out.println(hu1.getMaxNumber(4, 5));
    }
}
class Dog {
    String name;
    String color;
    int age;

    //无返回值的方法
    void barking() {
        System.out.println("汪汪汪汪....");
    }

    //无返回值的方法
    void sleep() {
        System.out.println("呼呼呼..........");
    }
}

class SmallMath {
    int balance;

    // 有返回值的方法
    int add(int x, int y) {
        return x + y;
    }

    // 有返回值的方法
    int sub(int x, int y) {
        if (x > y) {
            return x - y;
        } else {
            return 0;
        }
    }

    SmallMath() {
        balance = 0;
    }

    int x, y;

    SmallMath(int a, int b) {
        x = a;
        y = b;
    }

    void printsumt() {
        System.out.printf("x + y = %d", (x + y));
    }
}

class variableArgs {
    // 可变参数
    int add(int x, int... y) {
        int total = x;
        for (int num : y)
            total += num;
        return total;
    }
}

public class ch8_3 {
    public static void main(String[] args) {
        System.out.println("------------------------------------------------------");
        Dog my_dog = new Dog();
        Dog tom_dog = new Dog();
        my_dog.name = "元宝";
        System.out.printf("my dog name is %s\n", my_dog.name);
        my_dog.sleep();

        tom_dog.name = "旺财";
        System.out.printf("tom dog nmae is %s\n", tom_dog.name);
        tom_dog.sleep();


        System.out.println("------------------------------------------------------");
        SmallMath s = new SmallMath();  //实例化类
        int a1, a2;
        a1 = s.add(10, 20);
        System.out.println(a1);     //30

        a2 = s.sub(2, 30);
        System.out.println(a2);     //0

        System.out.println("------------------------------------------------------");
        variableArgs v = new variableArgs();
        int intArray[] = {11, 22, 33, 44, 55, 66};
        System.out.println(v.add(1, 2, 3, 4));
        System.out.println(v.add(1, intArray));

        System.out.println("--------------------------------------------------------");
        SmallMath s1 = new SmallMath(10,20);
        System.out.println(s1.balance);
        s1.printsumt();
    }