4.2 类与对象 -【Java入门--疯狂Java讲义】

Java的类,可以当成一种自定义类型,每创建一个类就创建了一个自定义的类型,Java的类是引用类型。

Java类的定义

前面已经说了,类是某一批对象的抽象,Java里对于类的定义语法:

[修饰词] class 类名{
    类体;
}

这里的修饰词可以是 public、final、abstract 或者省略不写,每一个修饰词代表的意义各不相同,这些修饰词会在后期一一接触到,在刚开始,写成public或者直接省略不写就好,但是要注意,使用public时,Java源文件的文件名必须是类名.java;

class是定义类时使用的关键字;

类名的要求在前面的更新已经提到过了,这里不再重复;

类体里面可以包括的东西很多,这里先介绍几个基本的,后面陆续介绍,最后再总结一下。

类里面可以包含变量(字段、属性)

类里面可以包含方法

类里面包含构造器

变量:在一个Java类里,变量分为成员变量与局部变量,其区别是定义位置和作用域不同以及生命周期不同,当然还有一些特殊的变量,如静态变量(static修饰)、常量等,Java里的变量可以是基本数据类型或者是引用数据类型。

变量的定义与赋值语法:

//定义
[修饰符] 数据类型 变量名;
//赋值
变量名 = 值;

 其中修饰符的取值可以是public、protected、private、static、final,其中,public、protected、private三个只能同时出现一个,代表了作用范围,为static、final可以与前三个同时使用。

方法,定义语法格式:

[修饰词] 返回值类型 方法名(参数列表){
    方法体;
}

其中, 修饰词可以是public、protected、private、static、final、abstract,其中,public、protected、private只能出现一个,而abstract和final不能同时出现,static与其余的配合使用;

返回值类型可以是基本数据类型或者引用数据类型,也可以没有返回值,没有返回值的情况使用void关键字代替返回值类型,注意的是,如果返回值类型不为void,一定要显示的return一个返回值,不然编译会报错。

方法名的规则符合Java的命名基本规则,不再重复;

参数列表可以是基本数据类型,也可以是引用数据类型,也可以省略不写,在使用的时候,格式是 数据类型 形式参数名,如果有多个,中间用英文逗号隔开,在调用事,也要有相同的实际参数一一对应。

构造器(构造方法),是Java中用来创建对象(或者实例)的一个特殊的方法,格式如下:

[修饰符] 构造器名(参数列表){
    ......
}

既然构造方法是一种特殊的方法,关于方法的参数列表的规则是与构造方法的参数类型一致的,要注意的是:

构造方法的方法名必须与类名相同;

构造方法没有返回值,连void都没有;

修饰词只能是public、protected、private中的一个;

构造方法可以省略不写,但是,省略不写以后系统会自动添加一个空的、没有参数的构造方法,一旦自己手动创建了构造方法,系统将不再提供。

了解了基本的语法,用实际的代码了体会一下变量、方法、构造方法的特点:

public class Test {
	//构造方法
	public Test(){
		//构造方法体
	}
	//基本数据类型
	public int i = 10;
	//类本来是一种引用数据类型,创建一个自己类的引用类型变量
	private Test test;
	//static修饰的静态变量
	public static double d = 12.5;
	//没有返回值的方法
	public void fun01() {
		//方法体
	}
	//返回int类型值的方法
	public int fun2(){
		return 12; //如果不写这一行,编译报错
	}
	
}

学习了Java的类的基本定义,来了解类是怎么创建出一个个对象来的!

 对象的创建是依靠new这一个关键字的,一个类可以创建无数个对象,语法如下:

[修饰词] 类名 对象名 = new 构造方法名(参数列表);

构造出来的对象就是一个引用类型的变量,所以格式不再重复;

由上面可以看到,对象是通过构造方法名()的形式构造出来的,这也就说明了为什么说构造器是用来构造对象的了。 

既然可以创建对象了,那么对象如何调用类里面定义过的方法与变量呢?

这个与修饰词有关,变量与方法的修饰词是abstract的先不讨论,等后面到抽象类的时候再讨论;修饰词是private的,是类私有的,对象是访问不到的,只有在类自己里面可以访问;修饰词是protected的在一定的条件下是可以访问的,而修饰词是public的是公共的,在整个项目中可以访问,这里暂且不讨论修饰词的范围,在后面专门讨论,这种情况下,访问方法是:

//访问属性
对象名.属性;
//访问方法
对象名.方法名(参数列表);

特殊的,当修饰词是static的时候,用下面的方式访问,当然也可以通过上面的方式访问,但是是不合乎规范的:

//访问属性
类名.属性;
//访问方法
类名.方法名(参数列表);

出现这种特殊情况的原因是static修饰的属性和方法是属于类的,不属于对象,这个也是因为内存加载时间不同造成的。

那么看一个例子:


public class Test {
	//构造方法
	public Test(){
		//构造方法体
	}
	//基本数据类型
	public int i = 10;
	//类本来是一种引用数据类型,创建一个自己类的引用类型变量
	private Test test;
	//static修饰的静态变量
	public static double d = 12.5;
	//没有返回值的方法
	public void fun01() {
		//方法体
	}
	//返回int类型值的方法
	public int fun02(){
		return 12; //如果不写这一行,编译报错
	}
	
}

class Test02{
	public static void main(String[] args) {
		//创建对象
		Test test = new Test();
		//访问public 的基本数据类型的属性
		System.out.println(test.i);
		//下面代码会编译错误,因为test的修饰词是private
		//System.out.println(test.test);
		//调用没有返回值的方法
		test.fun01();
		//调用有返回值的方法,并接收返回值
		int x = test.fun02();
		//类名访问静态属性
		System.out.println(Test.d);
		//对象名访问静态属性,可以访问,不推荐
		System.out.println(test.d);
	}
}

 

类是一种引用数据类型,所以存储方式与数组的类似,只不过数组的是连续的相同类型的一段空间,而自定义的类创建饿对象是存放的属性的类型的数据,如果属性是引用类型的,继续引用属性的引用地址,例如如下代码:

class Person{
    public String name = "张三";
    public int age = 15;
}

class Test{
    Person person = new Person();
}

很简单的一个类,里面只有连个属性,一个是String(引用类型),一个是int(基本类型);在Test类中使用 Person person = new Person();语句构造了一个对象时,内存是这样存储person对象的:

 

根据这个图就能很好的理解自定义类型的存储模式了,延伸一下,由上图可以发现,在下面的代码中:

Person p1 = new Person();
Person p2 = p1;

p1与p2是会操纵同一个对象的,因为即使在栈区再定义一个Person的对象,p2=p1只不过是把p1里面存放的地址改变了,实际上引用的还是同一对象,这一点与C语言的指针相似,学过C语言应该很好理解。那么下面的代码是不是引用同一对象呢?

Person p1 = new Person();
Person p2 = new Person();

显然不是的,因为new 关键字是创建对象的关键字,一旦new一下,就会创建一个新的对象,p1与p2将引用两个不一样的对象,也是两个不一样的地址。


版权声明:本文为weixin_44390201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。