您的位置:首页 > 编程语言 > Java开发

重踏学习Java路上_Day07(成员与局部变量,形参,匿名对象,封装,private,this,构造与成员方法,static)

2015-06-22 19:14 1036 查看
1:成员变量和局部变量的区别(理解)
(1)在类中的位置不同
成员变量:类中方法外
局部变量:方法定义中或者方法声明上, 注意:权限修饰符修饰局部变量是没有任何意义的
(2)在内存中的位置不同
成员变量:在堆中
局部变量:在栈中
(3)生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值不同
成员变量:有默认值,int,byte,short为0,char为"\u0000",应用类型为null,布尔类型为false
局部变量:没有默认值,必须定义,赋值,然后才能使用

局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

2:类作为形式参数的问题?(理解)
(1)如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象。

3:匿名对象(理解)
(1)没有名字的对象
(2)应用场景
A:调用方法,仅仅只调用一次的时候。
b:可以作为实际参数传递。

(3)匿名调用的好处?有,匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。

/*
匿名对象:就是没有名字的对象
*/

class Student {
public void show() {
System.out.println("我爱学习");
}
}

class StudentDemo {
public void method(Student s) {
s.show();
}
}

class NoNameDemo {
public static void main(String[] args) {
//带名字的调用
Student s = new Student();
s.show();
s.show();
System.out.println("--------------");

//匿名对象
//new Student();
//匿名对象调用方法
new Student().show();
new Student().show(); //这里其实是重新创建了一个新的对象
System.out.println("--------------");

//匿名对象作为实际参数传递
StudentDemo sd = new StudentDemo();
//Student ss = new Student();
//sd.method(ss); //这里的s是一个实际参数
//匿名对象
sd.method(new Student());

//在来一个
new StudentDemo().method(new Student());
}
}

4:封装(理解)
(1)隐藏实现细节,提供公共的访问方式
(2)好处:
A:隐藏实现细节,提供公共的访问方式
B:提高代码的复用性(重用性)
C:提高代码的安全性
(3)设计原则
将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公共方法对其进行访问。
(4)private是封装的一种体现。
封装:类,方法,private修饰成员变量

/*
定义一个学生类:
成员变量:name,age
成员方法:show()方法

我们在使用这个案例的过程中,发现了一个问题:
通过对象去给成员变量赋值,可以赋值一些非法的数据。
这是不合理的。
应该是这个样子的:在赋值之前,先对数据进行判断。
判断到底在哪里做比较合适呢?
StudentDemo类是一个测试类,测试类一般只创建对象,调用方法。
所以,这个判断应该定义在Student类中。
而我们在成员变量的位置可不可以进行数据判断呢?
是不可以的,因为做数据校验,必须要依靠一些逻辑语句。
逻辑语句是应该定义在方法中的,所以,我们最终决定在Student类中提供一个方法
来对数据进行校验。

按照我们前面的分析,我们给出了一个方法进行校验。
但是呢,它偏偏不调用方法来赋值,还是直接赋值了,
这样我们的方法就没有起到作用。
我就应该要求你必须使用我的方法,而不能直接调用成员变量赋值。
怎么去强制要求不能直接使用成员变量呢?
针对这种情况,Java就提供了一个关键字 private

private:私有的。可以修饰成员变量和成员方法。
注意:被private修饰的成员只能在本类中访问。

其实我讲到现在讲解的是一个封装的思想。
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
*/
class Student {
//姓名
String name;
//年龄
private int age;

//写一个方法对数据进行校验
/*
返回值类型:void
参数列表:int a
*/
public void setAge(int a) {
if(a < 0 || age > 120) {
System.out.println("你给的年龄有问题");
}else {
age = a;
}
}

//show()方法,显示所有成员变量值
public void show() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
}
}

class StudentDemo {
public static void main(String[] args) {
//创建学生对象
Student s = new Student();
s.show();
System.out.println("--------------");

//给成员变量赋值
s.name = "林青霞";
//s.age = 27;
s.setAge(27);
s.show();
System.out.println("--------------");

//给age赋值
//s.age = -27; //这个数据是不合理的
//通过方法给值
s.setAge(-27);
s.show();
System.out.println("--------------");
}
}

5:private关键字(掌握)
(1)私有的意义,可以修饰成员变量和成员方法
(2)特点:
被private修饰的后的成员只能在本类中被访问
(3)private的应用:
以后再写一个类的时候:
把所有的成员变量给private了
提供对应的getXxx()/setXxx()方法

6:this关键字(掌握)
(1)代表当前类的引用对象
记住:哪个对象调用方法,该方法内部的this就代表那个对象
(2)this的应用场景:
A:解决了局部变量隐藏成员变量的问题
B:其实this还有其他的应用,明天讲解。



7:构造方法(掌握)

学习完这个之后,类的组成变为:类

1.成员变量
2.构造方法
无参构造方法
带参构造方法
3.成员方法

根据返回值:
void类型;
非void类型;
形式参数:
空参方法;
非空参方法;

注意:给成员变量赋值的方式
无参构造方法+setXxx()
带参构造方法

(1)作用:用于对对象的数据进行初始化,其实Student s = new Student();中的Student()就是一个方法,因为有括号就是调用方法,没括号就是变量。所以Student()就是一个构造方法,但它是没有一个需要设定默认参数的构造方法。
(2)格式:
A:方法名和类名相同
B:没有返回值类型,连void都不能有
C:没有返回值

(3) Hibernate实体为什么要提供一个无参的构造函数?

当查询的时候返回的实体类是一个对象实例,是hibernate动态通过反射生成的
反射的Class.forName("className").newInstance();需要对应的类提供一个无参构造函数;

System.out.print(Class.forName("java.lang.String").newInstance().getClass().getName());这个需要无参构造函数

思考题:构造方法中可不可以有return语句呢?
可以。而是我们写成这个样子就OK了:return;
其实,在任何的void类型的方法的最后你都可以写上:return;

(3)构造方法的注意事项
A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
B:如果我们给出了构造方法,系统将不再提供默认构造方法
如果这个时候,我们要使用无参构造方法,就必须自己给出。
推荐:永远手动自己给出无参构造方法。

(4)给成员变量赋值的方式
A:setXxx()
B:带参构造方法

(5)标准案例 (一个基本类的标准代码写法)
class Student {
private String name;
private int age;

public Student(){}

public Student(String name,int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

测试:
class StudentDemo {
public static void main(String[] args) {
//方式1
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(27);
System.out.println(s1.getName()+"---"+s1.getAge());

//方式2
Student s2 = new Student("刘意",30);
System.out.println(s2.getName()+"---"+s2.getAge());
}
}

8:代码:Student s = new Student();做了哪些事情?(理解)
(1)把Student.class文件加载到内存
(2)在栈内存为s开辟空间
(3)在堆内存为学生对象申请空间
(4)给学生的成员变量进行默认初始化。null,0
(5)给学生的成员变量进行显示初始化。林青霞,27
(6)通过构造方法给成员变量进行初始化。刘意,30
(7)对象构造完毕,把地址赋值给s变量



9:面向对象的练习题(掌握)
(1)标准的手机类的定义和测试
(2)Demo类有求和方法,Test类进行测试。
什么时候定义成员变量?
当该变量是用来描述一个类的时候。
(3)长方形案例
(4)员工案例
(5)MyMath案例(自己提供加减乘除并测试)

10:static关键字(理解)
(1)静态的意思。可以修饰成员变量成员方法

静态修饰的内容一般被我们称其为:与类相关,类成员,而非静态修饰的内容我们一般称为对象成员。
(2)静态的特点:
A:随着类的加载而加载
B:优先于对象存在,所谓优先就是说静态比创建的对象先存在。
C:被类的所有对象共享,只有一份拷贝,被类的所有对象所共享。如果某个成员变量是被所有共享的,那么它就应该定义为静态的。
这其实也是我们判断该不该使用静态的依据。
举例:饮水机和水杯的问题思考
D:可以通过类名调用
既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
(3)静态的内存图
静态的内容在方法区的静态区,专门有一个静态区,main()方法不需要创建对象才加载到栈区域,静态修饰可以直接通过类名调用,所以不需要创建对象,main方法就能进入栈内存,开辟内存空间。



(4)静态的注意事项

对象方法是调用才执行,而静态是类加载就加在
A:在静态方法中没有this对象,静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在。
B:静态只能访问静态(代码测试过),静态方法只能访问静态成员变量和静态成员方法

C:静态方法:

成员变量:只能访问静态变量

成员方法:只能访问静态成员方法

非静态方法:

成员变量:可以是静态,也可以是非静态。

成员方法:可以使静态成员的方法,也可以是非静态的成员方法。

(5)静态变量和成员变量的区别
A:所属不同
静态变量:属于类,类变量
成员变量:属于对象,对象变量,实例变量
B:内存位置不同
静态变量:方法区的静态区
成员变量:堆内存
C:生命周期不同
静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量:可以通过对象名调用,也可以通过类名调用
成员变量:只能通过对象名调用
(6)main方法是静态的
public:公共的,访问权限是最大的。由于main方法是被JVM调用,所以权限要足够大。
static:静态的,不需要创建对象,通过类名就可以访问,方便JVM的调用
void:方法的返回值是返回给调用者的,而main方法是被jvm调用的,返回值给jvm没有意义
main:就是一个常见的名称。
String[] args:可以接收数据,提供程序的灵活性,这个东西早期是为了接收键盘录入的数据的。
格式:java MainDemo hello world java
java MainDemo 10 20 30

为什么在main方法中可以访问非静态的变量??

main()方法是程序的入口,你在main方法里定义了一个变量,那当然这个变量在main方法里是可见的,当然可以直接访问的
静态上下文只能访问静态成员或静态方法,但我们是在main方法下定义对象与使用方法,所以不会违背上面的话,同一个类下,如果在main方法外面定义方法来调用,该方法必须是static。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: