初识Java(Java类和对象-类)

一、类

    类是封装对象的属性和行为的载体,而在 Java 语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。    

    1.1  成员变量

    在 Java 中对象的属性也称为成员变量。

    eg :定义一个图书类,成员变量对应于类对象的属性,在 Book 类中设置 3 个成员变量,分别为 id 、name 和 category ,分别对应于图书编号、图书名称和图书类别 3 个图书属性。

public class Book{
    private String name;                       //定义一个 String 型的成员变量
    public String getName(){                   //定义一个 getName() 方法
        int id = 0 ;                           //局部变量
        setName("Java");                       //调用类中其他方法
        return id + this.name;                 //设置方法返回值
    }
    private void setName(String name){         //定义一个 setName() 方法
        this.name = name;                      //将参数赋予类中的成员变量
    }
    public Book getBook(){
        return this;                           //返回 Book 类引用
    }
}

    在 Java 中使用 class 关键字来定义类,Book 是类的名称。同时在 Book 类中定义了 3 个成员变量,成员变量的类型可以设置为 Java 中合法的数据类型,其实成员变量就是普通的变量,可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。

    1.2  成员方法

    在 Java 语言中使用成员方法对应于类对象的行为。以 Book 类为例,它包含了 getName() 和 setName() 两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法。

    语法 : 权限修饰符  返回值类型  方法名 ( 参数类型 参数名 ) {    ...   //方法体     return 返回值 ;   }

    一个成员方法可以有参数,这个参数可以是对象也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值可以在方法体重使用 return 关键字,使用这个关键字后,方法的执行将被终止。无返回值可以使用 void 关键字来表示。

    成员方法的返回值可以是计算结果也可以是其他想要的数值和对象,返回值类型要与方法返回的值类型一致。

    在成员方法中可以调用其他成员方法和类成员变量。同时在成员方法中可以定义一个变量,这个变量就是局部变量。

    如果一个方法中含有与成员变量同名的局部变量,则方法中对这个变量的访问以局部变量进行。例如,变量 id 在 getName() 方法中值为 0 ,而不是成员变量中 id 的值。

    类成员变量和成员方法也可以统称为类成员。

    1.3  权限修饰符

    Java 中的权限修饰符主要包括 private 、 public 和 protected ,这些修饰符控制着对类和类的成员变量以及成员方法的访问。

    如果一个类的成员变量或成员方法被修饰为 private ,则该成员变量只能在本类中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。如果将类的成员变量和成员方法的访问权限设置为 public ,那么除了可以在本类使用这些数据之外,还可以在子类和其他包的类中使用。如果一个类的访问权限被设置为 private ,这个类将隐藏其内的所有数据,以免用户直接访问它。如果需要使类中的数据被子类或其他包中的类使用,可以将这个类设置为 public 访问权限。如果一个类使用 protected 修饰符,那么只有本包内的该类的子类或其他类可以访问此类中的成员变量和成员方法。

    这么看来,public 和 protected 修饰的类可由子类访问,如果子类和父类不在同一保证包中,那么只有修饰符为 public 的类可以被子类进行访问。如果父类不允许通过集成产生的子类访问它的成员变量,那么必须使用 private 声明父类的这个成员变量。

Java 语言中的修饰符权限
访问包位置 private protected punlic
本类 可见 可见 可见
同包其他类或子类 不可见 可见 可见
其他包的类或子类 不可见 不可见 可见

    当申明类时不适用 public 、protected 和 private 修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类的成员变量或成员方法。

    eg :在项目中的 com.ljs 包下创建 AnyClass 类,该类使用默认的访问权限。

package com.ljs;                               //包
class AnyClass{                                //使用默认的访问权限
    public void doString(){                    //使用 public 修饰符
        ....//方法体
    }
}

    由于类的修饰符为默认修饰符,即只有一个包内的其他类和子类可以对该类进行访问,而 AnyClass 类中的 doString() 方法却又设置为 public 访问权限,即使这样, doString() 方法的访问权限依然与 AnyClass 类的访问权限相同,因为 Java 语言规定,类的权限设定会约束类成员的权限设定。

    还可以写成这样 :

package com.ljs;                              //包
class AnyClass{                               //使用默认的访问权限
    void doString(){                          //使用 public 修饰符
        ....//方法体
    }
}

    1.4  局部变量

    如果在成员方法内定义一个变量,那么这个变量被称为成员变量。

    例如在 Book 类中 ,getName() 方法的 id 变量即为局部变量。实际上方法中的形参也可作为一个局部变量,如在定义 setName(String name) 方法时,String name 这个形参就被看做是一个局部变量。

    局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。

public String getName(){                       //定义一个 getName() 方法
        int id = 0 ;                           //局部变量  如果这个 id 的初始值去掉,编译器将出现错误
        setName("Java");                       //调用类中其他方法
        return id + this.name;                 //设置方法返回值
    }

    1.5  局部变量的有效范围

    可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。

public void doString(String name){
    int id = 0;                                              //局部变量 id 的作用范围开始
    for(int i = 0 ; i < 10 ; i++){                           //局部变量 i 的作用范围开始
        System.out.println(name + String.valueOf(i));        //局部变量 i 的作用范围结束
    }
}                                                            //局部变量 id 的作用范围结束

    在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量。

public void doString(String name){
    int id = 0;                                              //局部变量 id 的作用范围开始
    for(int i = 0 ; i < 10 ; i++){                           //局部变量 i 的作用范围开始
        System.out.println(name + String.valueOf(i));        //局部变量 i 的作用范围结束
    }
     for(int i = 0 ; i < 3 ; i++){                           //局部变量 i 的作用范围开始
        System.out.println(i);                               //局部变量 i 的作用范围结束
    }
}                                                            //局部变量 id 的作用范围结束

    但是在相互嵌套的区域中不可以这样声明,如果将局部变量 id 在方法体的 for 循环中再次定义,编译器将会报错。

public void doString(String name){
    int id = 0;                                              //局部变量 id 的作用范围开始
    for(int i = 0 ; i < 10 ; i++){                           //局部变量 i 的作用范围开始
        System.out.println(name + String.valueOf(i));        //局部变量 i 的作用范围结束
    }
     for(int i = 0 ; i < 3 ; i++){                           //局部变量 i 的作用范围开始
        System.out.println(i);                               //局部变量 i 的作用范围结束
        int id = 7 ;                                         //重复定义局部变量 id ,会报错
    }
}                                                            //局部变量 id 的作用范围结束

    在作用范围外使用局部变量是一个常见的错误,因为在作用范围外没有声明局部变量的代码。

    1.6  this 关键字

    eg : 创建一个类文件,该类中定义了 setName() ,并将方法的参数值赋予类中的成员变量。

private void setName(String name){        //定义了一个 setNamw() 方法
    this,name = name ;                    //将参数值赋予类中的成员变量
}

    成员变量与 setName() 方法中的形式参数的名称相同,都为 name ,那么该如何在类中区分使用的是哪一个变量呢?在 Java 语言中规定使用 this 关键字来代表本类对象的引用, this 关键字被隐式地用于引用对象的成员变量和方法, this.name 指的是 Book 类的 name 成员变量,而 this.name = name 语句中的第二个 name 则指的是形参 name 。实质上 setName() 方法实现的功能就是将形参 name 的值赋予成员变量 name 。

    this 可以调用成员变量和成员方法,但 Java 语言中最常规的调用方式是使用 “ 对象.成员变量 ”或“ 对象.成员方法 ”进行调用。

    this 引用的就是本类的一个对象。在局部变量或方法参数覆盖了成员变量时,就要添加 this 关键字明确引用的是类成员还是局部变量或方法参数。

    如果省略 this 关键字直接写成 name = name ,那只是把参数 name 赋值给参数变量本身而已,成员变量 name 的值没有改变,因为参数 name 在方法的作用域中覆盖了成员变量 name 。

    this 除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。

    eg :创建一个类文件,在类中定义 Book 类型的方法,并通过 this 关键字进行返回。

public Book getBook(){
    return this;                //返回 Book 类引用
}

    在 getBook() 方法中,方法的返回值为 Book 类,所以方法体中使用 return this 这种形式将 Book 类的对象进行返回。



猜你喜欢

转载自blog.csdn.net/js940814/article/details/79952646