怕死的免责声明:本人为现为新人笔者,此文章用于记录本人学习路程为主,因此文章内容无教学向。对于文章涉及内容,如有错误敬请指正,若有更好的建议及改进方法本人也愿虚心求教。若有参考本文章内容操作而出现的各种问题,现在下能力不足,也许无法解决,故各位谨慎借鉴。
方法在内存的分布
第一次调用到的时候:
类:方法区
方法:在栈中创建一个栈帧
创建对象:在堆中开辟内存,保存成员变量,不保存方法
调用创建对象的方法时:将那个方法在栈中创建新的栈帧,在使用完成后销毁。
所以说一般来说main的栈帧最先创建而最后销毁,
堆中的内存,由垃圾处理机制决定。
方法重载(overload)
方便使用嘛就。 方便调用
同一个类中方法名称相同,参数列表不同
参数类型不同→类型,数量,位置但凡有一个不同就是不同。
重载和返回值没有关系!!!
构造器
1.构造器方法名和类名一样
2.没有返回值
3.通过new方法构造
4.我们没有自定义的时候默认有个无参构造的方法(注意 自定义了无参构造的话 要把无参的带上 为了可以正常的New一个对象)
public Phone(){
super();
}
public Phone(int a,String s1,String s2){
this.size=a;
this.name=s1;
this.home=s2;
}
知识点★
构造函数的执行是否可以表示对象已经创建? 不准确
创建对象为下面4步:
1.分配对象空间,并将对象成员变量初始化为0或空
2.执行属性值的显示初始化
3.执行构造方法
4.返回对象的地址给相关的变量
this
本质:创建好的对象的地址
(构造方法也是方法)
1.局部变量和成员变量间的区分
2.构造方法间的调用 记得放有效代码第一行
知识点★
基本类型传递按值传递
其他引用类型的的按地址传递
public static void main(String[] args) {
int [] arr ={10,20,30,40};
a(arr);
System.out.println(Arrays.toString(arr));
}
private static void a(int[] arr){
arr[1] = 100;
}
Static
静态
可以修饰 成员变量 | 方法 | 代码块
在修饰变量时
A、static修饰变量保存到方法区中并且只有一份
B、static修饰的变量不属于对象而是属于类被所有对象所共用
C、static修饰的变量在使用时候推荐使用【类名.变量】进行使用
小结:static变量和非static变量的区别:
1.份数不同:静态变量:1份;非静态变量:1个对象一份。
2.存储位置不同:静态变量:方法区:非静态变量:堆中。
3.内存分配空间的时间不同:静态变量:第一次加载类的时候;非静态变量:创建对象的时候。
4.生命周期不同。静态变量和类的生命周期相同;非静态变呈的生命周期和所属对象相同。
5.调用方式不同
静态变量:通过类名调用Student.classRoom。
也可以通过对象名调用stu1.classRoom="301"但不推荐。
非静态变量:通过对象名调用stu1.name="小张"
在修饰方法时
静态方法 运用的时候不需要new对象
同样的可以直接通过 类名.方法名调用
private static int anInt=100;
private int anInt2=100;
public static void aa(){
System.out.println(anInt);
// System.out.println(anInt2);
bb();
// cc();
// System.out.println(this.anInt2);
}
public static void bb(){
}
public void cc(){
System.out.println(anInt);
aa();
}
static修饰方法
A、static修饰的方法称为静态方法调用时候直接使用类名.方法()]
B、静态方法中不可以直接使用非静态成员变量
C、静态方法中不可以直接调用非静态方法
D、静态方法中不可以使用this关键字
三个不可以:
静态方法中不可以直接访问非静态变量
静态方法中不可以直接访问非静态方法
静态方法中不可以访问this
理解:加载类的时候就加载静态变量和静态方法,此时可能还没有创建对象,所以非静态变量和非静态的方法还没有分配空间,无法访问
两个可以:
非静态方法中可以访问静态变皇
非静态方法中可以访问静态方法
理解:加载类的时候就已经加载静态变量和静态方法,创建对象后,非静态变量和非静态的方法才分配空间,此时静态变量和静态方法已经存在,可以访问
在修饰代码块时
静态代码块在类加载的时候执行,只执行一次
public class Demo01 {
{
System.out.println("非静态代码块");
}
static {
System.out.println("静态代码块");
}
public Demo01() {
System.out.println("构造方法");
}
}
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
System.out.println("----------------");
Demo01 demo02 = new Demo01();
}
结果:
static修饰代码块
A、静态代码块在类加载的时候执行只会执行一次
非静态代码块和构造函数每一次创建对象都会执行
B、静态代码块>非静态代码块>构造方法
C、
静态代码块:
1、给静态成员变量赋值
2、我们以后学习会有很多配置文件,这些配置文件加载一次即可,这个时候就可以写到静态代码块中
非静态代码块:
1、给对象中成员变量初始化赋眉
2、后期的匿名内部类进行赋值使用
总而言之 Static 要理解代码执行以及数据生成的顺序
总结:
优点:不需要在进行实例化。静态变量的值,直接赋新值即可,不需要参数传递,之后可以直接进行参数引用即可;静态方法可以直接通过”类名.方法"的形式进行方法调用。通常方法被多次调用,并且方法中没有动态方法引用的时候使用比较方便。
缺点:初始化加载到内存,如果后续没被引用,加大了内存负担和程序运行负担,影响程序运行效率(一般很小),并且静态变量如果多处被引用赋值,很可能导致参数值混乱,如果从线程安全、性能、兼容性上来看也是选用实例化(创建对象)方法为宜。