- 前言
在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使用.
类
那么,这里为什么要先将类,而不是像之前一样先讲对象呢,那是因为在前面的学习中,我们知道了,对象是类的一个实例.类是封装兑现属性和行为的载体,所以对象的一切都在类之中,对象的属性,行为的调用都得先通过实例才能使用,它们是一个包含关系,对象是依赖于类的.
- 类在Java中的创建
我们都知道,在我们新建一个Java文件的时候,大多是这样的.
这充分说明了在Java语言中,一切都是基于类与对象建立的.
类在Java语言中式通过class关键字定义的.而且还可以使用各种修饰符对其权限进行限定,关于修饰符,在前面也有讲到过.
class cat{
}
- 类的成员变量与成员方法
我们通过观察类文件的结构可以发现是这样的.
我们可以发现:
在一个Java文件中不仅是可以声明多个类的,还可以在类的内部定义一个类,这可以叫做类的嵌套使用了,这种机制应该就是Java中的内部类的特性.我们在后面在做详细学习.
我们还可以在Structure视窗里发现,类的结构是由方法体和成员变量组成的.
成员变量
我们已经了解到类封装对象属性和行为的载体,而对象的属性是通过成员变量定义的,行为是通过方法创建的.一个类的成员变量就是封装对象的某种属性,成员变量也可以通过修饰符限定其使用范围,因此有静态变量,成员变量,局部变量,常量等区分,关于它们之间的联系与区别,这一点在前面的Java基础中应该有讲过.
- 成员方法
我们可以通过实例化一个对象,然后调用其属性和方法.而在通常情况下,一个对象的属性是不会在封装类就被初始化的,只会被定义,应为对象的属性通常都是可变的,我们只能通过实例化对象,来确定一个具体对象的具体属性.
那么我们应该如何来调用到对象的属性和设置对象的属性呢.这时我们就会理所当然的想到,当然时使用方法了嘛.是的我们只需要在类中封装获取和设置对象属性的方法就可以了.
而这类获取和设置成员变量的方法就叫做成员方法.(因为其都具有很明显的特征和作用)
// 成员方法,获取成员变量
public boolean getindepentThing(){
return this.independentThing;
}
// 成员方法,设置成员变量
public void setindepentThing(boolean independentthing){
this.independentThing = independentthing;
}
-
类的构造方法
构造方法是类中的另以特殊的方法体,构造方法是一个与类名相同的方法,对象的创建就是通过构造方法来完成的.每当类实例化一个对象时,类都会调用构造方法,所以构造方法其实就是相当与实例化对象时的初始化一样.- 构造方法是没有返回值的
- 构造方法的名称要与本类的名称相同.
为什么构造方法的名称必须与类名称相同,我们看看对象的实例化:
animal animal = new animal();
如此,我们大概明白了,之所以构造方法的名称和类名称相同,是为了在对象的实例化的时候,通过new animal(),使构造方法在对象的实例化的同时也运行了,这样才能实现在实例化对象就能够初始化对象的属性的目的.构造方法的存在,解决了对象的初始化问题,使得我们每次实例化的对象都拥有我们想要设定的属性值,之后我们就可以直接调用其属性,而不需要频繁的使用成员方法来设定对象的值.
/**
* 构造方法
*/
public animal(){ // 无参的构造方法.
this.independentThing= false;
}
public animal(boolean independentthing){ // 有参的构造方法
this.independentThing = independentthing;
}
- 类中普通的方法
在之前的学习中我们已经了解了关于方法在Java中的定义,使用返回值类型修饰符+方法名.即可创建一个方法体.而我们常常会使用到的void修饰符是分特殊的,它不需要我们return一个值,void的字面意思就是空,我们治理只需要了解到void修饰的方法体,是不需要返回值的.
在类和对象的学习中,我们又了解到,类中的方法其实就是对某个对象的行为的一种封装,所以类中最常见的方法,其实就是这种对行为封装的方法,也可以说是我们自定义的方法,因为这种方法的所有内容都是我们自定义的.这类方法其实才是最普遍存在于类中的.
void eat(){
System.out.println("动物的吃行为");
}
-
类的主方法
我们在前面的学习中,了解到一个类只能有一个主方法,而这个主方法是用来让Java编译器识别,编译运行的.为什么要这样设计,我们其实已经可以分析的出来了,因为Java语言是基于类和对象的基础上的一门语言,其基本的组成单位其实可以说就是众多的类,然后由众多的类组成的类库组成了Java的标准类库,我们都是基于Java标准类库来编程的,如果不定义一个主方法用来编译运行,那么各种类中的不计其数的方法该如何来标记,如何知道该编译运行哪个方法,调用哪个类.所以类的主方法的存在是必然的一个演变过程.
类的主方法是类的入口点,它定义了程序从何处开始,主方法提供程序流向的控制,Java编译器通过主方法来执行程序.
主方法的语法是固定的:
public static void main(String[] args){
// 方法体
}
我们从主方法的定义可以看到其具有的一些特性:
主方法是一个静态的方法,所以如果要直接在主方法中调用其他方法,则调用的方法也必须是静态的才行.
主方法是没有返回值的.
主方法的形式参数是数组,其中arg[0]~arg[n]表示程序的第一个参数到第n个参数.可以使用args.lenght获取到这个值.
对象
我们现在已经非常了解了,对象就是由类抽象出来的一个实例.比如人类中有一个叫小舍,性别为男的人.那么这个人就是从人类中实例化出来的一个对象.
-
对象的创建
其实我们在之前的学习中已经或多或少的有使用到对象,我们是这样创建一个对象的:
animal animal = new animal();
animal animal12 = new animal(true);
在字符串的学习中,我们使用过String类的构造方法,创建一个初始化对象.
String astr3 = new String(a,0,2);
String astr4 = new String(b);
String astr5 = new String(b,0,2);
在Java语言中我们通过new操作符来创建对象.
这里其实有一点小疏忽,一般情况下,类的成员变量一般不会设置成公开的,需要使用private修饰符将其修饰为私有的,然后通过成员方法来访问和设置它的值.
private boolean independentThing;
System.out.println(animal.getindepentThing());
animal1.setindepentThing(false);
我们实例化了对象之后,我们就可以通过对象来调用其属性和行为(就是方法)了
animal.eat();
System.out.println(animal.independentThing);
- 对象的引用
在Java语言中,尽管一切都可以看作对象,但实际上的操作标识符是一个引用,那么引用在Java中是怎么体现的.
// 类名 对象引用名称,
animal animal;
实际上,引用并不一定要有一个对象相关联,引用和对象相关连的语法是:
animal animal = new animal();
new就是创建对象的操作符,整个语句相当于创建一个引用animal类的对象,这就是实例化对象的过程.
-
对象的比较
我们知道在程序的实际中经常会使用到比较判断,而我们在前面的基础数据类型和运算符的学习中知道了,符是用来比较两个数据的.那么我们现在又知道了对象在Java中的地位是举足轻重的,并且会时长用到,那么对象的比较是否也可以使用符来比较呢.
System.out.println("字符串是否和abc相等:"+mstr.equals("abc"));
System.out.println("字符串是否和abc相等:"+(mstr=="abc"));
显然,是不行的,因为我们在前面字符串的比较时就简单的了解到,号是不能用来比较两个String类型的值的,需要通过String类的equals()方法比较.对象的比较是通过其相应类的equals()方法进行比较的.而不能使用符比较,这是因为==比较的是两者引用的地址是否相等.而equals方法比较的才是比较两个对象引用的内容是否相等.
- 对象的销毁
每个对象都有声明周期,当生命周期结束的时候,对象就会被销毁,其分配的内存就会被回收,在其他一些语言中,对象的内存回收可能会需要手动销毁回收,但在Java语言中,拥有一整套完整的垃圾回收机制,可以根据对象的生命周期来回收其内存,Java的垃圾回收机制也不单单运用在对象上,它对于Java的内存回收有一整个控制回收机制.我们在这里就简单的了解一下就行.
- 源代码
package day_4_8;
/**
* @outhor xiaoshe
* @date 2019/4/8 - @time 17:22
*类
* 在Java语言中,类是使用class关键字来定义的
* 类可以有不同种,通过类前面的关键字来修饰
* 也就是Java修饰符,一般情况下,修饰符限定了类的使用范围.
* class后接类名,class是定义类的关键字,具体的类名需要自定义命名,
* 命名规则是需要遵循java标识符的规则的.
*/
public class sty_class {
// 通过主类里的主方法来调用不同类的不同方法.因为只有主方法才会被编译运行
// 所以想要使用任何类,或类的方法的使用.都需要通过主方法调用才能实现.
public static void main(String[] args) {
// 想要调用某个类的某个方法,就需要实例化一个这个类的对象,通过实例化对象调用方法.
// 无参的构造方法构建对象.
animal animal = new animal();
animal.eat();
System.out.println(animal.getindepentThing());
//有参的构造方法,构建对象
animal animal1 = new animal(true);
animal1.setindepentThing(false);
System.out.println(animal1.getindepentThing());
System.out.println(args.length);
}
public static class book{
}
}
/**
* 我们在同一个java文件里,可以声明多个不同的类.
* 声明animal动物类.
* 通过类来封装对象的属性和行为.
*/
class animal{
// 在哦Java语言中,通过类的成员变量表示对象的属性.
private boolean independentThing;
// 成员方法,获取成员变量
public boolean getindepentThing(){
return this.independentThing;
}
// 成员方法,设置成员变量
public void setindepentThing(boolean independentthing){
this.independentThing = independentthing;
}
/**
* 构造方法
*/
public animal(){ // 无参的构造方法.
this.independentThing= false;
}
public animal(boolean independentthing){ // 有参的构造方法
this.independentThing = independentthing;
}
// 在Java中通过构建方法的形式,来表示对象的行为.
void eat(){
System.out.println("动物的吃行为");
}
}
- 后记
类和对象可以说是Java语言的基础之基础,重中之重,理解清楚面向对象思想和学明白Java类和对象的机制是学习Java语言的必不可缺的阶段,在理解它们的基础上学习Java能够达到事半功倍的地步.因为可以说Java语言的一切几乎都是建立在类和对象上的,当你把类和对象理解透彻了,在其基础上学习其它知识怎会不更加简易呢.?
更新时间:
2019-4-8
21:04