第一章:类和对象(中)

上节答案:B。解析:通过 类名 对象名 = new 类名();可以创建类的对象

 

1 - 5:Java中的成员变量和局部变量

很多朋友在写面向对象程序的时候发现,使用变量的时候经常容易把各种变量搞混淆,那么我们今天就一起来看一下,在写面向对象程序的时候,究竟会用到哪些变量,它们之间又有什么区别。

我们再写一个面向对象程序的时候,主要用到两种变量,成员变量局部变量

1.成员变量:

在类中定义,用来描述对象将要有什么。

2.局部变量

在类的方法中定义,在方法中临时保存数据。

在使用中我们要注意,成员变量可以被本类的所有方法使用,也可以和一些其他和我们当前类有关系的类中的方法去使用。局部变量只能在当前方法中去使用

成员变量和局部变量的区别

1、作用域不同

局部变量的作用域仅限于定义它的方法(从方法的开始到方法的结束)

成员变量的作用域在整个类内部都是可见的(从类的开始到类的结束)

我们现在通过一个代码来证明这一点:

成员变量

package com.imooc;

public class Telephone {
	//属性(成员变量),代表一个类有什么
	float screen;//屏幕
	float cpu;//CPU大小
	float mem;//内存大小
	
	//方法,代表一个类能干什么
	void call() {
		System.out.println("Telephone有打电话的功能!");
	}
	void sendMessage() {
		System.out.println("screen:" + screen + " cpu:" + cpu + " mem:" + mem + " Telephone有发短信的功能! ");
	}
}

这是上一节讲的一个类,首先,声明一个成员变量int var;我们接着可以看看,方法call和森的Message里面能不能用int var这个变量,前面已经讲过,默认成员变量是0,当我们创建对象的时候,他会有一个默认成员变量的值,保存:

package com.imooc;

public class Telephone {
	//属性(成员变量),代表一个类有什么
	float screen;//屏幕
	float cpu;//CPU大小
	float mem;//内存大小
	
	int var;
	
	//方法,代表一个类能干什么
	void call() {
		System.out.println("var:" + var);
		System.out.println("Telephone有打电话的功能!");
	}
	void sendMessage() {
		System.out.println("var:" + var);
		System.out.println("screen:" + screen + " cpu:" + cpu + " mem:" + mem + " Telephone有发短信的功能! ");
	}
}

看一下我们的main函数:

package com.imooc;

public class InitailTelephone {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Telephone phone = new Telephone();
		//phone.sendMessage();
		//给实例变量赋值
		phone.screen = 5.0f;
		phone.mem = 2.0f;
		phone.cpu = 1.4f;
		//调用对象方法
		phone.sendMessage();
		phone.call();
	}
}

运行一下,看看成员变量的值是多少。

结果:

var:0

screen:5.0 cpu:1.4 mem:2.0 Telephone有发短信的功能!

var:0

Telephone有打电话的功能!

首先我们可以看到,这两个成员变量都可以被调用,并且它的默认值为0。正如我们刚才所说,成员变量的作用域是在整个类的内部所使用的,类中的所有方法共享成员变量。

局部变量

我们在刚才方法当中,定义一个局部变量,为了跟成员变量有个区别,我们给它起名localVar,让他等于0。但是在下面那个sendMessage方法用localVar就会出错了。

2、初始值不同

在我们Java程序中,它会给成员变量一个初始值,但不会给局部变量初始值。其实我们刚才写的程序大家已经发现了,在定义成员变量的时候并没有给它赋初始值(所以默认是0),但在定义局部变量的时候不赋值的话,编译时编译器会提醒我们,要初始化一下才行。

3、在同一个方法中,不允许有同名局部变量;在不同方法中,可以有同名局部变量。

4、两类变量同名时,局部变量有更高优先级(就近原则)。

 

1 - 6:Java中的构造方法

前面已经学习了如何写一个面向对象程序,现在再来看一下,面向对象程序当中一个重要知识点:构造方法

那我们现在就看一下,到底如何写构造方法。构造方法又能帮我们解决什么问题呢?

我们之前在创建一个对象的时候,通过一个new关键字,就可以把一个类进行实例化,变成对象。其实当时来讲,我们说的并不严谨。

1、new后面跟的,并不是类名,而是我们的构造方法。就是说,我们在创建对象的时候,就会使用到我们的构造方法。它的功能只有一个:创建一个新的对象。

2、构造方法是定义在Java类中的一个用来初始化对象的方法,也就是说,构造方法也是方法。它和我们普通方法不同之处在哪里呢,我们以前普通方法只是代表我们以前能够干什么,而构造方法可以创建一个对象,并可以初始化对象的值。所以说,同样是方法,含义是不同。

3、构造方法与类同名且没有返回值。

那我们看一下,如何使用一个构造方法。

打开Eclipse,

再在src上面右键,创建一个包,包名定义为网址倒过来写(com.imooc):

在新建的包里面右键,创建一个类,还是叫Telephone

再在com.imooc创建一个类,叫InitialTelephone

下面两张图是Telephone.java和InitialTelephone.java的代码:

那我们发现,刚开始Telephone类里面没有写任何方法,但我们现在,就已经可以new一个Telephone的对象。有的人感觉很奇怪,这类里面没有这个方法,我们怎么还能调用呢?主要原因就是,如果我们没有指定一个无参的构造方法,系统会自动的帮我们构造一个无参的构造方法。如果我们对系统的无参构造方法不满意,可以自定义个无参构造方法。为了证明我们执行的的确是构造方法,那么无参的系统生成的我们就不需要了。我们就在Telephone类里创建一个无参无返回值(不需要void)的方法,并在方法里输出无参的构造方法执行了!这句话:

InitialTelephone类没有变在这里加入Telephone phone = new Telephone();,然后直接执行:

可以看到,这里执行了Telephone类的无参无返回值构造方法,显示出“无参构造方法执行了!”这句话。也就是说当我们创建对象的时候,其实我们执行的是构造方法,这一点大家要注意。

4、带参构造方法使用

我们来看一下,其实有参的构造方法目的只有一个,就是初始化我们对象中成员变量的值。所以说呢,我在创建对象的时候我是可以传参数的,那我们如何来写一个有参的构造方法呢?其实也很简单,和我们刚刚无参构造方法最大的区别是写了一个参数列表。最终我们把参数列表里面的值赋给了成员变量。那此时呢,我们的对象是不是就有值了呀。好,那我们也通过代码方式来看一下。

注意,我们无参构造方法是可以跟有参构造方法并存的。它的命名规则是相类似的,现在Telephone里并没有成员变量,我们先给类里面定义几个成员变量,比如屏幕大小,CPU频率,内存大小。我通过一个有参的构造方法,就是为了给我们对象的实例变量赋值的。所以说同样我们要写我们的参数名称,参数名称跟刚才定义的成员变量名字是一样的可能容易搞混,我们就在参数名称前面加一个new,这样不会搞混。

然后在主函数里新建一下这个类,看看能不能运行:

这时候,screen值为5.0,cpu值为1.4,mem值为2.0,这个类里面的值已经赋过了。

5、当没有指定构造方法时,系统会自动添加无参构造方法

6、当有指定构造方法时,无论是有参或无参构造方法,都不会添加无参构造方法。因为你已经自定了构造方法,系统就不再帮你定了。

7、构造方法的重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。其实我们刚才写的有参构造方法和无参构造方法,方法名相同,这就是方法的重载。

8、构造方法不但可以给对象属性赋值,还可以保证给对象的属性赋一个合理的值。例如说,我们在创建一个手机的时候,通常来讲,智能手机的屏幕都是大于3.5英寸的,如果我赋值的时候不小心赋值了1.5英寸的值,显然是不合理的,那么我们能在构造方法里是可以避免这个问题:

如何解决这个问题呢,我们可以在这边加一个判断,如果传进来的参数小于3.5,就给screen一个默认值3.5,并且我们可以提示一下,“您输入的参数有问题,自动赋值3.5”,如果大于3.5,就可以直接等于newScreen了。

 

 

1 - 7:Java中的static使用之静态变量

大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!

Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~

使用 static 可以修饰变量、方法和代码块。

本小节,我们先认识一下静态变量。

例如,我们在类中定义了一个 静态变量 hobby ,操作代码如下所示:

运行结果:

要注意哦:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~

任务

在编辑器中定义了一个 HelloWorld 类,在类中定义一个静态变量 className ,保存班级名称。在 main 方法中调用静态变量输出班级信息。

请将第 4、9 行中代码补充完整

public class HelloWorld {
    
    // 定义静态变量,保存班级名称
	           String className = "JAVA开发一班";

	public static void main(String[] args) {
        
		// 访问静态变量,输出班级名称
		System.out.println(                 );
	}
}

运行结果:JAVA开发一班 

 

1 - 8:练习题

在 Java 类中,使用以下( )声明语句来定义公有的静态变量 num

A、public int num = 100;

B、final int num = 100;

C、public static int num = 100;

D、private static int num = 100;

答案在下节公布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值