初识Java:面向对象程序设计基础入门(1)类class

初识Java:面向对象程序设计基础入门(1)类class

导引

对多数编程学习者来说,Java是第一门面向对象的高级程序设计语言,其特征,优势和难点都绕不开面向对象程序设计原理。很多编程学习者在学习Java之前往往会先学习C语言或Visual Basic等面向过程的程序设计语言,在学习了一段时间的Java后,大家会发现很容易掌握Java的结构化设计——Java的基本语法和其他经典语言极其相似,几乎无需另花时间研究。
然而Java 和经典设计语言的差别体现在,当大家接触到面向对象这一部分的知识,课本开始变得深奥,网课开始讲述得模糊,对于面向对象的基本原理和核心知识失去了把控。
在学习Java面向对象内容之前,首先需要记住几个问题,带着这些问题投入学习:
类有哪些组成部分?
什么是类?
类的构造方法是构造什么的?
什么又是实例对象?

正文

Java中,用一个类class来刻画一个对象。

如果你学习过C语言下的数据结构,你可以参考这个例子:在C语言数据结构知识体系当中,我们学习的任何一个数据结构,如果要想具体实现任何一个数据结构,我们都必须:
1.定义数据结构的逻辑结构
比如一个顺序表或许定义为:

typedef struct{
int length;
int listsize;
elem record[];
}sqlist;

2.定义对应这项数据结构的一系列操作
比如在C语言数据结构里,我们定义了一系列函数来实现顺序表的新建,删除记录,插入记录,等等操作
上面所写的定义代码和操作函数代码共同构成了一个顺序表的定义。但是在C语言中,我们仅仅把这些代码“放在一起”,而没有一个概念将他们真正结合在一起,他们归根结底还是并不相关的两部分代码。
后面会提到,这是由于C语言是面向过程的语言,不具备封装性

上述的数据结构描述就是一种刻画实际对象的方法。实际对象可能比顺序表,栈,队列之类的数据结构复杂的多,面向对象的Java语言采用类来刻画一个实际对象。
初识Java:面向对象程序设计基础入门(1)类class_第1张图片

1.类的修饰词

类修饰词用于体现类的属性:
public:包含public表明了类拥有宽泛的访问权限,不仅本软件包,任何package均可以在调用本类后直接引用这个类当中的一切方法。
比如我们知道用于输出的语句:

System.out.println("I love Java!");

在这个正确的语句当中,System是一个系统已经定义好的public类。任何时候都可以在另一个Java程序当中直接调用System当中的各个方法。
abstract:表示这个类是抽象类
final:表明这个类不可以用作类的父类
strictfp:缩写自strict float point,严格的浮点数表示运算规则。这表明类当中的上述规则均严格遵循754算数国际标准
其中最常用的还是public修饰词。
注意:一个Java源文件.java当中可以包括多个类,但是至多包括一个public类

2.类名称

System是一个系统定义的类,这就是一个类名称。类名称的要求是:
1.不得与系统类重名
2.不得是非法的的标识符
3.若是public类,类名与源文件前缀名必须相同(这一点在新建.java源代码时,IDE就会自动生成同名的public class了,只要不修改public类名即可)
再次强调:
一个Java源文件.java当中可以包括多个类,但是至多包括一个public类

3.父类,父类名

如果不填写父类名,那么系统指认java.lang.Object作为新定义的这个类的父类(事实上,此类是除自身外所有类的直接或者间接父类),因此在父类名列表当中加入extends java.lang.Object与空置此项是无差的。
父类主要是一个用于实现继承的概念,在后面的继承性版块当中会详细介绍。

4.接口名称

多个接口之间采用逗号分隔,本阶段内接口暂时无需介绍

类的声明包括上述的四个部分。定义格式为:

【类修饰词列表】 class 【类名】 【extends 父类名】【implements 接口名称列表】
{
	类体
}

比如一个类

public class java_quiz_1 {
	public static void main(String[] args)
	{
		System.out.println("如何编程实现1^1+2^2+3^3+4^4+...+20^20\n\n");
	}
}

这个类没有声明父类,也没有接口,但依然是一个合法定义的类。按照上面所说的规则,这个类的定义等价于:

public class java_quiz_1 extends java.lang.Object{}

编译结果无差

5.类体

类的内容就是类体。如思维导图所示,类体当中可以定义类的构造方法和类的两类成员要素

1.成员要素-成员域field
成员域又简称域,通常用来表示和存储所属类中需要的数据。定义格式为:

【域修饰词列表】类型 变量名或带有初始化等等变量名列表;

域修饰词包括:
public,protected,private:声明当前定义的成员域的访问控制权限,或者说应用范围。
static:表明当前定义的成员域是静态的。一般地,要采用带有初始化的变量名直接把static成员域填写完毕。
final:表明成员域一经初次赋值,就不可能再修改成员域。
(暂不介绍)transient:表明成员域是片面的,在保存时不必保存此成员域
(暂不介绍)volatile:表明访问此成员域采用同步机制,多来解决多线程问题。
类型包括数据类型(int,char等)或者引用数据类型(包括类名)
譬如:

package java_quiz_1;

public class java_quiz_1 extends java.lang.Object {
	public int m_radius=0;
	public static void main(String[] args)
	{
		System.out.println("如何编程实现1^1+2^2+3^3+4^4+...+20^20\n\n");
	}
}

定义了成员域,而后定义了一个成员方法。
2.成员要素-成员方法method
简称方法,用于实现各种功能。
再回到刚刚的代码例子上:

public class java_quiz_1 {
	public static void main(String[] args)
	{
		System.out.println("如何编程实现1^1+2^2+3^3+4^4+...+20^20\n\n");
	}
}

其中,第二行语句就是成员要素当中的成员方法,
**public static void main(String[] args)**就是一个方法。public,static都是方法修饰词,方法修饰词在方法声明里并不是必须的;返回类型与C语言的函数返回值意义相同。main是方法名,且main是一个特殊的方法名,它表示java程序开始的接口。括号里应包括参数列表,每个参数要包含参数类型和参数变量名。String[] 是参数类型,args是有特殊含义的变量名。

3.构造方法(constructor)
构造方法的内容稍微比较深奥一些。
·构造方法构造什么?
构造方法的意义在于完成实例对象的初始化。构造构造,归根结底构造的是实例对象
一个类就是用于描述一种事物,一个对象。比如Integer是整数类,这个类描述整数这个整体,而随时都可以新建一个实例对象,比如11.
类并不对等于面向过程语言当中的源代码本身;相反,我认为类更接近面向过程语言当中的结构体
回到我们之前所举的例子,面向过程语言,比如C语言使用一段结构定义,一些操作函数共同组成了对顺序表Sqlist的定义,归根结底这里定义的Sqlist还是一个结构体
而在Java当中,若要定义顺序表,顺序表一定被定义成一个类。
一个类的类体可以包括构造方法,成员域和成员方法。成员域和面向过程语言中的变量声明接近;成员方法和面向过程语言中的函数声明接近。
类的构造方法用于创建类的实例对象
在Java软件包当中包括类Integer(整数类型的包装类)。类Integer含有构造方法:

public Integer(int value)

因此,可以通过

new Integer(11)

创建类Integer实例对象,这个实例对象对应整数11。Integer这个类可以作为引用数据类型,

Integer a=new Integer(11);

这表示定义了一个类型为Integer类的新变量a,它指向实例对象11的值(类似C语言的指针概念)
意料之中的是:

package java_quiz_1;
public class java_quiz_1 extends java.lang.Object {
	public static void main(String[] args)
	{
		Integer a=new Integer(11);
		System.out.println(a);
	}
}

这段代码也能输出11,因为在java中用变量指向一些实例对象,不需要用指针类型来区分此变量与寻常变量。
·如何定义构造方法?
格式:
【构造方法修饰词列表】 类名(方法的参数列表)
{
方法体
}
这里修饰词只包括:public,protected,private。
要求:

  1. 构造方法必须与类名相同
  2. 构造方法不具有返回类型,也不可以书写void,拥有了返回类型的构造方法就降级为了成员方法
  3. 任何一个类(不论是否是主类)都含有构造方法,没有的,系统会创建不含任何参数的默认构造方法

回到刚才的例子,构造方法:

public Integer(int value){}

就是合法的构造方法声明。
定义顺序:
成员域>>>构造方法>>>成员方法(约定俗成)

6.实例对象的访问手段

这里只介绍很常用但并不是全部的几种访问手段。
假设我们现在有类student,其名下有

int stu_num;//成员域
public student();//构造方法
protected void print_stu();//成员方法

已经调用:

student s1=new student();

构造了一个可用的实例对象s1.

  1. 访问实例对象的成员域:s1.stu_num
  2. 访问实例对象的成员方法:s1.print_stu();
  3. 访问类的构造方法: student s2=new student();

我们来看一个完整的程序例子(建议参考雍俊海版《Java程序设计教程》):在这里插入图片描述
此程序包含两个class:
1.class J_Book
初识Java:面向对象程序设计基础入门(1)类class_第2张图片
class J_Book 不是主类;这个类包括:
成员域public int m_id;
构造方法public J_Book(int i);
这个构造方法通过参数i传递值给J_Book 类的实例对象的m_id成员;
成员方法protected void finalize();
J_Book 代表一个对象:书籍。书籍的逻辑结构包括一个成员m_id,一种操作finalize(),能够依照J_Book 类的实例对象的m_id成员的值打印不同的东西。

2.public class J_Finalize
初识Java:面向对象程序设计基础入门(1)类class_第3张图片
由于这是package当中唯一一个public类,自然这个类就是主类了。
System.gc() 方法是用于向系统请求回收垃圾,若一个实例对象建立后并没有任何引用指向它们,这个实例对象就会成为垃圾,如代码中的J_Book(2)和J_Book(3),一旦生成立刻成为垃圾,而后将会被System.gc()方法清理。
一方面,这个程序演示了类的定义过程;另一方面,这个程序体现了Java虚拟机的一个特性:
在清理一个实例对象时,Java虚拟机会调用此实例对象的成员方法。
编译结果:

《罗马假日》所对应的实例对象存储单元被回收
《Java程序设计教程》所对应的实例对象存储单元被回收

我们再举一个例子来解释本文所介绍的各个概念和它们之间的关联。
类stutent有两个成员:stu_num 代表学号;stu_name代表姓名
有自定义的构造方法student(int i),其内容包括接受参数int i并赋值给这个新建的student实例对象;同时将此student实例对象的stu_name 赋值为“?”
有成员方法,主要功能是打印student实例对象的信息。
初识Java:面向对象程序设计基础入门(1)类class_第4张图片
编译结果:

学生姓名:?
学号:501
学生姓名:?
学号:502
学生姓名:?
学号:503

同时,

a1.stu_name="雍俊海"

就可以将这个实例对象的成员值更改

你可能感兴趣的:(初识Java:面向对象程序设计基础入门(1)类class)