入坑Java(六)详谈类与对象

类的构造方法

简单来说就是跟类名字一样的无参数方法,跟类名字一样的无参数方法就是类的构造方法,比如:

public class TryFirst {
 TryFirst() {}
}

我们之前说方法名首字母小写,这个就不用,因为这个是构造方法,要的就是跟类名一样,大小写也是啦。
如果变成:

public class TryFirst {
 TryFirst(int a) {}
}

方法有参数的话,那就不是咯!切记!!
构造方法有什么用嘞,它其实是在类被实例化(TryFirst tryFirst = new TryFirst())的时候会被调用的方法,不需要再tryFirst.TryFirst(),就可以被调用了。这个构造方法就算你不写,系统也会自动给它弄一个构造方法的,只是方法里面是空的而已啦。自己写的话,就可以在方法里写自己想写的代码了。

类里面的成员变量和局部变量

1)介绍变量,通过例子来讲吧,如下:

public class TryFirst {
//直接写在类{}下的就是成员变量啦,如下
	int a = 11;
	
//写在方法里面的就是局部变量啦,如下
 void oneWay(int b) {
     int a = 22;
	 int c = 33 ;
}

其中的a就是成员变量啦,而b和c则是局部变量,通过例子也可以看出来,只要不是直接写在类{}下的,都是局部变量,其中b是写在{()}里的,c是写在{{}}里的,而方法里的a(int a = 22;)是写在{{}}里的,都不是直接写在类的{}里的啦。
区别:成员变量在类的{}里都可以调用到,而局部变量只能在局部被调用,并不是在整个类{}里都可以调用。比如我想在oneWay方法之外调用c这个变量,这就做不到,但如果我想在方法oneWay里调用a变量,只需要在oneWay里写:this.a 就可以调用了。如果不是在方法内调用,直接写a就可以调用。
还有注意区分类的a(int a = 11;)和方法的a(int a = 22;)哦!他们两个可不一样,一个是成员变量一个是局部变量,也就是为了在方法里区别两个a,所以当在方法里用成员变量的时候,要写成this.a 当要用局部变量的时候,也就是方法里面的a的时候,直接写a就可以了。可能有人会问,那怎么在方法外区分它们呢?不存在这种可能呢,因为局部变量只能在相应的方法里被调用啊,在方法之外就用不了了,所以,如果是在方法外的话,就只有成员变量了,不需要区分,直接写a姐可以,比如:

public class TryFirst {
	int a = 11;
 void oneWay(int b) {
	 int a = 22;
	 int c = 33;
	 //在方法里调用局部变量的a( int a = 22;)
	 System.out.println(a);
	
	 //在方法里调用成员变量的a( int a = 11;)
	 System.out.println(this.a);
}
 //在方法之外只能调用成员变量,下面的a就是上面的成员变量(int a = 11;)
 int d = a;

需要注意一下this的用法:
a.this在static修饰的方法了是不可以用的
在这里插入图片描述
b.除了可以区分使用同名成员变量和局部变量外,还可以在方法中调用其它方法

package com.see;

public class TryUseThis {
	String str = "成员变量";

	public void one() {
		this.two();
	}

	public void two() {
		String str = "局部变量";
		System.out.println("方法用this调用别的方法" + "、 " + str + "、 " + this.str);
	}

	public static void main(String[] args) {
		TryUseThis tryUseThis = new TryUseThis();
		tryUseThis.one();
	}
}

c.可以通过this来调用类的有参数的构造方法,(一般类只有一个是无参数的构造方法):

//在无参构造方法里调用有参构造方法时,需要将"this(参数)"写在第一行,不然会报错的
public class TryUseThis {
	TryUseThis(int a) {
		System.out.println("有参构造方法"+a);
	}
	TryUseThis() {
		this(0);//这个要写在第一行!(注意大小写)
		System.out.println("无参构造方法"+1);
	}
}


2)调用变量

成员变量又叫类变量,它在类被加载的时候,就被实例话了。什么叫实例化呢,就是被分配内存了。如果一个变量没有被分配内存,它就不是实际存在的。只有程序结束运行的时候,才会释放内存
而局部变量,也就是方法里的变量,它们一开始的时候是不被分配内存的,只有方法被调用的时候,局部变量才会分配内存,即被实例化。当该方法调用完毕时,局部变量分配的内存就会被释放掉。

有时候人家会问,为什么编辑器都已经编译好了,当方法背调用的时候还能再分配内存呢?难道是重新编译吗?
其实不是的啦,方法中的变量,也就是局部变量,其实在被分配内存的全过程都是在一个栈内完成的,所用空间也是栈空间,跟成员变量的空间不同,它们是不一样的,所以被释放的时间也不一样。

可能有些人还会问,曾元变量一开始就被赋予了内存空间,但如果成员变量在一开始并没有赋值的话,赋予空间的值又是多少呢?
细心的人会发现,就算一开始成员变量没有被赋值,比如写成这样int a;也不会报错,也并没有赋值,当这种情况,系统会赋值其的默认值,int 的默认值为0,String的默认值为null ,而boolean 的默认值为false。这些都是成员变量的赋值哦!要是写在main方法里面,比如也写成int a;这个时候就不会被赋值了,毕竟main方法也是方法嘛,这不能算作是成员变量。

3)被static修饰的特殊成员变量——类成员变量
被static修饰的成员变量也是成员变量,但它在各个对象里被调用是共同的,也就是各个对象共享这个类成员变量。举个例子说明吧:

public class TryFirst {
 	int a = 1;
 	static int b = 3;
 	public static void main(String[] args) {
 		//实例化两个对象
 		TryFirst tryFirst1 = new TryFirst();
 		TryFirst tryFirst2 = new TryFirst();
 		tryFirst1.a = 2;
 		System.out.println(tryFirst1.a);
 		System.out.println(tryFirst2.a);
 		tryFirst1.b = 4;
 		System.out.println(tryFirst1.b);
 		System.out.println(tryFirst2.b);
	}
	}

你会发现输出结果是

2
1
4
4

这就是有static修饰和没static修饰的区别。被static修饰的成员变量,在对象中是共享的,当tryFirst1改变它的值时,tryFirst2调用的就是被改变的值。
而没有static修饰的陈冠变量,变量是单独的,不受对象的影响,当tryFirst1改变它的值时,它的实际值并未被改变,所以当tryFirst2调用它时,它还是原先的值。

方法的重载

方法名可以一样吗?答案是:可以。但是是有条件的可以,条件是:必须存在不同属性的参数或者不同数量的参数。怎么个意思嘞,举个例子吧:

public class TryFirst {

 	void oneWay() {}
 	void oneWay(int a) {}
 	void oneWay(short a) {}
 	void oneWay(int a,int b) {}
 	}

上面的四个方法都叫oneWay,你会发现编译不会报错,这就是方法的重载,除了名字外,它们分别都有各自的不同,第一个的参数为0个,第二个的参数为1个,而第三个的参数类型与第二个的不同,第四个的参数数量是2个,跟前几个都不一样。

方法的返回值

我们都知道方法的写法是:void wayName(){}
那你知道void是什么意思吗?其实void表示的就是“返回空”的意思,其实方法是可以返回一个值的,只是之前我们都没有到而已,所以就没有。那么可以返回什么类型的值呢?又需要怎样才能返回呢?
能返回所有类型的值 比如8大基本参数类型,byte,int,short,long,float,double,boolean,char 以及String类型也能返回。还有所以类型的父类object也能返回。
返回方法:将void 改成你想返回的参数类型,然后在方法后面return 一个参数即可,具体如下例:

public class TryFirst {
 	public static void main(String[] args) {
 		//实例化两个对象
 		TryFirst tryFirst1 = new TryFirst();
 		int a = tryFirst1.oneWay();
 		System.out.println(tryFirst1.oneWay());
 		System.out.println(a);
	}
	int oneWay() {
		int c = 5;
		return c;
	}

我的方法名叫oneWay 而我返回的参数类型是int型,返回的是c(return c),当我们调用这个方法的时候,这个方法无形地就变成了一个值,我可以直接这么写System.out.println(tryFirst1.oneWay());
也可以通过赋值给自己定义的参数然后再int a = tryFirst1.oneWay(); System.out.println(a);
一般不建议再一次赋值,因为这样还要分配一个内存空间给它,没必要,所以能直接写就直接写,不要赋值。

被static修饰的方法

被static修饰的方法在一开始就被分配了入口地址,而没有static修饰的方法在一开始的时候并没有被分配这个入口地址,没有入口地址,就不能直接调用该方法,而有入口地址的就可以直接通过入口地址调用方法。举例说明吧:

public class TryFirst {
 	public static void main(String[] args) {
 		oneWay();
 		TryFirst tryFirst = new TryFirst();
 		tryFirst.twoWay();
	}
 	
	static void oneWay() {
		System.out.println("被static修饰的方法,一开始就有方法的入口地址");
	}
	void twoWay() {
		System.out.println("没被static修饰的方法,一开始没方法的入口地址");
	}
	}

通过例子我们可以发现,oneWay不需要先实例化对象就可以使用,而twoWay则需要先实例化对象后才能使用,这就是被static修饰与否的区别。

----------END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值