成员变量和局部变量的区别?
1)书写位置不同
成员变量:在类中,方法外定义的变量!
局部变量:在方法声明上或者是方法定义中!
public void show(String name){
int num = 200 ;
System.out.println(name+num) ;
}
2)内存中的位置不同
成员变量:在堆内存中
局部变量:在栈内存中
3)生命周期不同:
局部变量:随着方法调用而存在,随着方法调用完毕而消失!
成员变量:随着对象的创建完毕而存在,随着对象被GC回收掉而消失
对象的回收:
并不是立即回收,而是等待垃圾回收器空闲时回收掉!
4)初始化不同:
成员变量:可以不进行初始化,因为它在堆内存中(跟对象有关系),存在系统默认初始化
局部变量:必须在使用之前对象局部变量进行初始化,否则报错"可能尚未初始化变量xx"
匿名对象:
概念:没有名字的对象!
之前的格式:
类名 对象名 = new 类名() ;
匿名对象的创建格式:
new 类名() ;
特点:
1)可以作为形式参数传递!
2)匿名对象不要使用多次,使用一次即可!
匿名对象,应用场景:
移动端:android 大量去使用匿名对象 或者匿名内部类
匿名对象创建完毕,使用完毕就立即被回收(节省内存空间)
private关键字:
private:私有的,外界不能访问的!只能在本类中访问
(但是可以间接通过公共的成员方法来访问私有成员变量/成员方法)
它可以修饰成员变量,也可以修饰成员方法
封装的概念:
Java提供这样一种技术:
将一个类的成员变量私有化,外界不能够直接方案,可以通过
一些公共的方法(set/get...)间接的访问!
关键字:this
this:代表当前类对象的地址值引用!
为了区分:局部变量隐藏成员变量: this.成员变量;
一个类的成员组成:
1)成员变量
2)成员方法
3)构造方法
什么是构造方法?
特点:
1)方法名和类名相同
2)没有具体的返回值类型
3)连void都没有
权限修饰符 方法名和类名相同(){ //无参构造方法
}
构造方法的作用:给对象的成员进行数据初始化的!
构造方法:
构造方法是可以重载的:
无参构造方法
有参构造方法
注意事项:
在写一个类的时候,没有提供无参构造方法,系统默认提供无参构造方法!
如果开发者提供有参构造方法,系统不会提供无参构造方法了,所以永远给出无参构造方法!
学生事物:
属性:姓名,年龄,性别
行为:学习,玩游戏…
使用一个标准类的书写格式描述学生事物
学生类
属性私有化:成员变量私有化
提供给对外的公共方法:setXXX(xx x)/getXXX()
学习,玩游戏....
构造方法:
无参构造方法
无参构造方法
需求:
描述人事物
属性:姓名,年龄,国籍
成员方法:提供一个show()方法,作用,输出人的姓名,年龄,国籍
按照上面的需求:创建四个人---->国籍都是"中国",从内存角度考虑,
成员变量随着对象的完毕存在----堆内存中 (比较消耗内存空间)
如何改进: Java提供一个关键字:static(共享,共用)
static关键字的特点:
1)被static修饰的成员,随着类的加载而加载 (类就加载一次!)
javac xxx.java---->xxx.class (字节码文件)
java xxx ---->运行---->加载类的时候,对象还没开始创建
2)优先于对象存在
对象的创建是在类加载的后面
3)有被共享,共用的意思
这句话:告诉我们什么时候使用static修饰变量,方法
能够描述被共用,共享的时候
举例:
班级号可以被共用
饮水机:可以被共用
水杯中的水(不能共用)
4)最重要的特点:
被static修饰的变量以及方法可以被类名直接访问!(推荐类名直接访问)
这些被static修饰变量/方法,也可以通过对象名来访问(不推荐!)
关于static关键字的注意事项:
1)static关键字中 没有this的关键字的
2)关于访问的问题:
非静态的成员方法,既可以访问静态的变量,也可以非静态的变量
也可以访问静态的方法以及非静态的成员方法
静态的方法只能静态的变量/方法
Java中代码块:
使用{}包起来的内容,就称为代码块!
分类:
1)局部代码块
在局部位置中定义的{},作用:限定变量的声明周期
2)构造代码块
在类的成员位置中定义{},
特点:在当前类中,有限执行构造代码块,然后在执行构造方法...
(每次执行构造方法之前先执行构造代码块)
构造代码块的作用:对当前类的数据进行初始化!(很少用,笔试题!)
3)静态代码块
在{}的前面加上static
static{
....
}
静态代码块随着的类的加载而加载,由于类加载一次,静态代码块执行一次!
优先级:
静态代码块 > 构造代码块 >构造方法