变量、对象、封装、构造方法、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.构造方法
构造方法:
给对象的数据进行初始化

格式:

  1. 方法名与类名相同
  2. 没有返回值类型,连void都没有
  3. 没有具体的返回值

构造方法的注意事项:
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

 
static的内存图解

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;

 

 

 

posted @ 2018-05-07 22:16  要死要活的程序猿啊  阅读(370)  评论(0编辑  收藏  举报