JAVA编程基础(四)开启Java语言编程之旅

2023-05-04 20:17:48 浏览数 (1)

上一节单元测试的答案: 1. b 2. d 3. e 4. a 5. e 6. c 7. b 8. f 9. b

了解java对象的结构

本节学习目标

  • 认识Java语言中的关键字和保留字
  • 理解一个Java类和一个Java对象的关系
  • 了解一个Java类中所有组成的语法和功能

本节主要讲述两个主题内容:java语言如何处理对象;java的关键字和java类的组成

java中的关键字

和其他语言一样,java语言也指定了某些单词在编译的时候会专门处理。因此,你不能使用它们作为你程序中的变量命名。相对而言,java的关键字是比较少的:

代码语言:javascript复制
abstract
assert
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
enum
extends
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while

除了以上关键字之外,也不允许使用truefalsenull来命名java中的某个变量。 在IDE(集成开发环境)中编写代码的好处是它对关键字使用了语法颜色表示,你将在后面的内容看到。

一个java类的结构

一个类是包含属性和行为的离散实体(对象)。定义了对象的基本结构,在运行时,应用程序(JVM)会创建对象的一个实例。一个对象有一个定义良好的边界和状态,正确的调用它去做一些事情。任何一门面向对象的语言都有自己的规则怎样去定义一个类。 java语言中,类的定义如下:

代码语言:javascript复制
package 包的名称;
import 引入的类名称(包名.子包名.类名); 
访问控制修饰符(public、private等) class 类名{
  访问控制修饰符(public、private等) 数据类型 变量名[= 初始值];
  //构造器
  访问控制修饰符(public、private等) 类名([参数列表]) {
    构造器里的代码
  }
  访问控制修饰符(public、private等) 返回类型 方法名([参数列表]) {
    方法中的代码
  }
  // 单行注释
  /* 多行注释 */
}

//示例
package org.byron4j.javaBasic;
/**
* 这是一个"人"类
*/
public class Person{

    private String name;
    private int age = 0;

    //构造器
    public Person{
        System.out.println("初始化一个对象。");
    }

    /*
    * 这是一个向某个人问好的方法
    */
    public void sayHello(String name){
        System.out.println("Hello, "   name);
    }
}

包装类

java语言中,你可以命名你创建的类,但是有时候你可能汇创建一样名字的类,这会引发明明冲突,所以也就应运而生了。

一个java包是一个提供命名空间机制 —— 包下的类的名字应该是唯一的,包外面的可以不管。要确定一个唯一的结构,你必须指明它的名称,包括它的命名空间。如上述的Person,全名为org.byron4j.javaBasic.Person。

包也提供了一个很好的方式来建立更复杂的应用程序与离散单元的功能。

包的关键字是package,包的定义:

代码语言:javascript复制
package  orgType.orgName.appName.compName;

包定义规范的说明:

  • orgType 机构类型,例如 com, org, or net
  • orgName 机构名称,例如 makotojava, oracle, or ibm.
  • appName 应用的名称,例如俄罗斯方块Tetris
  • compName 组件名,通常是当前模块名称

import语句

import告诉java编译器到那里找到这个类引用的外部类。

代码语言:javascript复制
import ClassNameToImport;

引入某个包下所有的类可以使用*匹配:

代码语言:javascript复制
import com.makotojava.*;

类的定义

在java语言中,定义一个对象,你必须定义一个类。可以认为类是对象的模板。

代码语言:javascript复制
package org.byron4j.javaBasic;
/**
* 这是一个"人"类
*/
public class Person{

    private String name;
    private int age = 0;

    //构造器
    public Person{
        System.out.println("初始化一个对象。");
    }

    /*
    * 这是一个向某个人问好的方法
    */
    public void sayHello(String name){
        System.out.println("Hello, "   name);
    }
}

你可以使用任何你喜欢的名字作为类名,但是建议使用驼峰命名法:开始以一个大写字母,把每个单词的第一个字母大写的,所有其他字母小写,类似 WhitePerson。类名应该只包含英文字符和数字。坚持这些准则确保您的代码更容易使那些遵循相同约定的其他开发人员能看懂。

变量和方法

类有两种类型的成员 —— 变量和方法

变量

一个类的变量区分该类的每一个实例,并定义它的状态,这些变量被称为成员变量(实例变量),一个变量包含组成部分:

  • 访问控制修饰符
  • 数据类型
  • 变量名
  • 初始值可选

访问控制修饰符可能是:

  • public: 任何对象都可以访问这个变量。
  • protected: 同一个包下的对象、或者任意包下的该类的子类据可访问该变量。
  • 不指定: 同一个包下的类才能访问
  • private: 只有该类自己可以访问

数据类型可以使原始数据类型(int、long等)或者引用类型(后面会讲解到)。 变量名首字母小写,之后每一个单词首字母大写。 初始值,不指定的话系统给定默认的(如int类型给0,引用类型默认为null)。

Person类的定义

代码语言:javascript复制
package com.makotojava.intro;

public class Person {
   private String name;
   private int age;
   private int height;
   private int weight;
   private String eyeColor;
   private String gender;
}

方法

类的方法定义了对象的行为。 方法分成两种类型:构造器、其他方法。仅使用构造函数方法来创建一个类的实例。其他类型的方法可以用于几乎任何应用程序行为。方法的组成部分:

  • 访问控制修饰符
  • 返回类型
  • 方法名称
  • 参数列表
构造器(构造方法)

构造方法的名称必须是和类名一样。 带构造器的类的声明(不显式声明的话,默认含有一个空构造器——没有参数的构造器):

代码语言:javascript复制
package com.makotojava.intro;
public class Person {
  private String name;
  private int age;
  private int height;
  private int  weight;
  private String eyeColor;

  private String gender;
  public Person() {
    // Nothing to do...
  }

  public Person(String name, int age, int height, int weight String eyeColor, String gender) {
    this.name = name;
    this.age = age;//参数age的值赋值给当前对象的age属性
    this.height = height;
    this.weight = weight;
    this.eyeColor = eyeColor;
    this.gender = gender;
  }
}

注意this关键字在上面例子中的使用。this指的是”this object”当前对象。我们看到age既是对象的属性名也是方法的参数名,则对象的属性必须用this指定。

Person对象变得越来越有趣,它可能需要更多行为。因此,你需要更多方法。

其他方法(非构造器)

构造函数是一种特殊的函数的。同样,许多其他类型的方法执行java程序中的特定功能。本节开始讲述关于方法的概念,这也将贯穿整个教程。

从上面的例子中,可以看到方法的定义形式:

代码语言:javascript复制
accessSpecifier returnType methodName ([argumentList]) {
  methodStatement(s)
}

与构造器类似,但是这些方法和够在其的区别:一是可以任意命名(当然,最好遵循命名规范)。推荐以下几个规范:

  • 首字母小写
  • 避免出现数字数字,除非他们是绝对必要的。可以使用4代替for,例如loan4Student可以理解为loanForStudent
  • 仅适用字母字符 二是有返回类型。
添加定义Person的其他方法

这里不展示构造器了,以使代码简介:

代码语言:javascript复制
package com.makotojava.intro;

public class Person {
   private String name;
   private int age;
   private int height;
   private int  weight;
   private String eyeColor;
   private String gender;

   public String getName() { return name; }
   public void setName(String value) { name = value; }
   // Other getter/setter combinations...
}

看到Getter、Setter方法了吗,在java中你以后会经常使用到它们的。现在,你需要知道的事,getter方法是获得指定属性的值,而setter是设置对应属性的值。

如果方法没有返回值,你应该在方法签名中指定方法的返回类型为void

静态和实例方法

通常,两种类型的方法会经常用到(非构造器方法):实例方法和静态方法。实例方法取决于它们的行为的特定对象实例的状态。静态方法也叫类方法,因为他们不依赖某个实例对象的状态。静态方法的行为发生在类的层级上。

静态方法主要用于公用。你可以把它们看作是全局的方法。

举个例子,接下来的教程中,你将会使用JDK中的Logger类在控制台输出信息。创建一个Logger的类实例,你不需要初始化Logger类,而是调用它的静态方法getLogger()。

调用静态方法和调用对象的方法是不同的:你应该使用类名.方法名(参数列表)调用:

代码语言:javascript复制
Logger l = Logger.getLogger("NewLogger");

在这个例子中,Logger是类名,getLogger(…)是方法。正是这样,静态方法的调用只需要使用类名,而不需要去创建一个对象实例。

测试你学到的知识

代码语言:javascript复制
1. import语句用来干什么的?
    a.没什么明确目的,只是提醒其他程序,在你的类里的引用。
    b.使用在web软件中,连接网络并下载代码
    c.告诉编译器你的类引用了哪些类
    d.都不是

2.如果你想某个变量只对当前这个类才可见,应该使用哪个访问控制修饰符?
    a.public
    b.private
    c.都不是,因为这是编译器的默认访问控制行为
    d.protected

3.java语言中的关键字是什么?
    a.某些单词作为java运行时的特定使用, 所以编译器在编译你的代码之前将它们提示出来
    b.你不能使用他们作为你在应用程序的变量或方法的命名, 它们在java语言中有特殊的含义
    c.java语言中没有关键字一说
    d.编译的时候会忽略,跟注释一样

4.包作为命名空间保证里面的类名是唯一的,包外面的可以不管
    a.这要视编译上下文而定
    b.不是
    c.java语言中没有包这一说法
    d.是
    e.上面的都不是

5.编程题:给Person类添加其他的getter、setter方法

6.在前面的示例中,定义了有参数的构造器和无参数的构造器,为什么要定义无参的构造器呢,因为它里面什么都没有做。
    a.如果不定义一个无参构造器,会发生编译错误
    b.提供一个无参构造器可以为你使用它创建一个属性值为默认值的对象实例
    c.前面的示例代码有错,因为一个类中不可能有两个构造器
    d.根本没有构造器一说
    e.上面的都不是
7.静态方法和实例方法有什么不同?
    a.其实没什么不同
    b.静态方法可以在任何语言中调用,而实例方法只能是一个实例对象使用
    c.调用实例方法需要引用实例对象, 但是调用静态方法则不需要
    d.一个静态方法"黏死"了定义它的对象, 但是实例方法可以在各个对象之间调用

答案见下一节。

0 人点赞