变量、对象、封装、构造方法、static
1.成员变量和局部变量
一个实例
class Varialbe { //成员变量 //int num = 10; int num; //0 public void show() { //int num2 = 20; //局部变量 //可能尚未初始化变量num2 //int num2; //没有默认值 int num2 = 20; System.out.println(num2); //int num = 100; System.out.println(num); } } class VariableDemo { public static void main(String[] args) { Varialbe v = new Varialbe(); System.out.println(v.num); //访问成员变量 v.show(); } }
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
例如,上面关于num的输出问题
2.形式参数的问题:
基本类型:形式参数的改变不影响实际参数(值传递)
引用类型:形式参数的改变直接影响实际参数(引用传递)
类作为形式参数的问题?
如果你看到一个方法需要的参数是一个类名,就应该指定这里实际需要的是一个具体的对象。
3.匿名对象
匿名对象:就是没有名字的对象。
匿名对象的应用场景:
A:调用方法,仅仅只调用一次的时候。
注意:调用多次的时候,不适合。
那么,这种匿名调用有什么好处吗?
有,匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
B:匿名对象可以作为实际参数传递
4.封装
private:私有的。可以修饰成员变量和成员方法。
注意:被private修饰的成员只能在本类中访问。
(1)封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
(2)好处:
- 隐藏实现细节,提供公共的访问方式
- 提高代码的复用性
- 提高代码的安全性
(3)设计原则
把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式。
(4)private是封装的一种体现
封装:类,方法,private修饰成员变量
5.封装和private的应用:
A:把成员变量用private修饰
B:提高对应的getXxx()和setXxx()方法
6.this关键字
this:是当前类的对象引用。简单的记,它就代表当前类的一个对象。
注意:谁调用这个方法,在该方法内部的this就代表谁。
this的场景:
解决局部变量隐藏成员变量
this:哪个对象调用那个方法,this就代表那个对象
7.构造方法
构造方法:
给对象的数据进行初始化
格式:
- 方法名与类名相同
- 没有返回值类型,连void都没有
- 没有具体的返回值
构造方法的注意事项:
A:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
图解反编译前
反编译后
通过反编译可知
主要是new Student()引发的构造方法Student(反编译中的图解)public 为默认所以上图不显示
B:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。(构造方法也可以重载,即带不同参数--默认不带参数)
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
8.类的组成:成员变量,成员方法
今天我们又加入了一个新的成员:构造方法。
以后再提类的组成:
- 成员变量
- 构造方法
- 成员方法
图解
9.import必须出现在所有的class前面
例如
import java.util.Scanner; class …… { } class …… { }
10.static
static的特点:(它可以修饰成员变量,还可以修饰成员方法)
A:随着类的加载而加载
回想main方法。
B:优先于对象存在
C:被类的所有对象共享
举例:咱们班级的学生应该共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
举例:
饮水机(用静态修饰)(饮水机可以多人共享使用)
水杯(不能用静态修饰)(水杯只能自己一个人用,原则上不可以共享,每个人都有一个)
D:可以通过类名调用
其实它本身也可以通过对象名调用。
推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的,类成员
静态变量也可以通过类名调用.png
11.static关键字注意事项
A:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法
非静态方法:
成员变量:可以是静态的,也可以是非静态的
成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
简单记:
静态只能访问静态。(非静态可以访问一切)
例子
1 class Teacher { 2 public int num = 10; 3 public static int num2 = 20; 4 5 public void show() { 6 System.out.println(num); //语句1,隐含的告诉你访问的是成员变量 7 System.out.println(this.num); //语句2,明确的告诉你访问的是成员变量,与语句1相同效果 8 System.out.println(num2); 9 10 //function(); 11 //function2(); 12 } 13 14 public static void method() { 15 //无法从静态上下文中引用非静态 变量 num 16 //System.out.println(num); 17 System.out.println(num2); 18 19 //无法从静态上下文中引用非静态 方法 function() 20 //function(); 21 function2(); 22 } 23 24 public void function() { 25 26 } 27 28 public static void function2() { 29 30 } 31 } 32 33 class TeacherDemo { 34 public static void main(String[] args) { 35 //创建对象 36 Teacher t = new Teacher(); 37 t.show(); 38 System.out.println("------------"); 39 t.method(); 40 } 41 }
12.静态变量和成员变量的区别
所属不同
静态变量属于类,所以也称为为类变量。
成员变量属于对象,所以也称为实例变量(对象变量)。
内存中位置不同
静态变量存储于方法区的静态区。
成员变量存储于堆内存。
内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失。
成员变量随着对象的创建而存在,随着对象的消失而消失。
调用不同
静态变量可以通过类名调用,也可以通过对象调用。
成员变量只能通过对象名调用。
13.main方法的格式讲解
public static void main(String[] args) {...}
- public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。
- static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。
- void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。你返回内容给jvm没有意义。
- main:是一个常见的方法入口。我见过的语言都是以main作为入口。
- String[] args:这是一个字符串数组。值去哪里了?
这个东西到底有什么用啊?怎么给值啊?
这个东西早期是为了接收键盘录入的数据的。
格式是:
java MainDemo hello world java
例子
1 class MainDemo { 2 public static void main(String[] args) { 3 //System.out.println(args); //[Ljava.lang.String;@175078b 4 //System.out.println(args.length); //0 5 //System.out.println(args[0]); //ArrayIndexOutOfBoundsException 6 7 //接收数据后 8 System.out.println(args); 9 System.out.println(args.length); 10 //System.out.println(args[0]); 11 for(int x=0; x<args.length; x++) { 12 System.out.println(args[x]); 13 } 14 } 15 }
补充:
private是封装的一种表现。
思考题:构造方法中可不可以有return语句呢?
可以。而是写成这个样子:return;