目录
一、成员变量与局部变量的区别
二、静态变量有什么作用?
三、字符型常量和字符串常量有什么区别?
四、静态方法为什么不能调用非静态成员
五、静态方法和实例方法有什么不同
六、重载和重写有什么区别
七、什么是可变长参数
4个方面:
1. 语法形式
主要就是是否能被修饰符进行修饰
成员变量可以被权限修饰符以及static修饰
而局部变量不能被权限修饰符和static修饰。
但是两者都能被final修饰
2. 存储方式
成员变量 一般存放在堆中 除非是被static修饰 就存放在方法区中
局部变量 一般就存在于栈中 除非是对象类型的 那么栈就只存放对象引用,其值还是存放在堆上
3. 生存时间
成员变量是对象的一部分,随着对象的创建而创建 随着对象的销毁而销毁
而局部变量是随着方法的调用而自动生成,方法调用完则销毁
4. 默认值
成员变量是有其对应的默认值的,而局部变量没有其默认的初始值。
当然成员变量如果被final修饰,那么也需要手动的赋上初值
为什么成员变量能有默认值,而局部变量没有?
因为如果没有默认值的话,那么变量存储的是内存地址一个任意的随机值。不安全
那为什么成员变量可以不需要我们自己手动设值呢?因为可以通过反射机制赋上
而且如果我们没有手动的赋上值,编译器也不能报错,所以就只能有默认值了
但是局部变量则能够直接使用编译器判断,可以直接报错,让我们必须得赋上值
对于多个对象所共享的,可以在类中声明静态变量。
这样可以减少内存占用,减少代码。并且修改一处能够处处修改
字符串常量是用单引号,只是占两个字节 而字符串常量则占用若干个字节
字符串常量可以看作一个数字,ASCII值,可以参与表达式运算,而字符串常量则是代表一个地址值
就从生命周期上来看,当有静态方法的时候,非静态成员还不存在,非静态成员在创建对象的时候才有。静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名访问,而非静态成员属于实例对象,只有类实例化后才能才存在,需要类的实例对象去访问
1. 调用方式
静态方法能使用类以及对象进行调用
而非静态方法只能通过对象调用
2. 访问限制
静态方法只能访问静态成员 静态属性静态方法
而非静态方法既能访问静态成员也能访问非静态成员
重载是在本类或者是父类/子类中,方法名一样参数不一样的方法,相当于就是调用同名的方法,放入不一样的参数,执行一段不同的逻辑。
方法参数不同可以是:方法参数个数、方法参数类型、方法参数顺序
重写则是子类重新编写父类中已经定义好的方法,或者是实现接口中的方法
这个则是方法名以及方法参数完全一样,但是方法返回值和权限修饰符以及抛出的异常可以不一样
权限修饰符必须不小于父类的
方法返回值 如果是引用类型 必须是和父类一样或者是父类的子类 如果是void或者是基本数据类型则需要保持一致
抛出的异常和方法返回值类似,不能比父类抛出的异常大 其实这个还有方法返回值都是为了能够在多态性的时候 父类的类型能够罩住子类的返回值或者是抛出的异常
另外注意:private、final、staitc、synchronized、native修饰的方法都不能重写
private因为子类看不到 final则是直接不能重写
static是因为方法属于类,被重写没有意义,所以即使同名同参数也不能叫重写,可以看作是一个全新的方法
synchronized则是被同步了,也是没有意义,父类中需要同步,那么子类也是希望能够同步的,不希望随意被修改
native是需要操作系统去重写的,而不需要我们程序员自己来重写
就是方法形参可以使用 String ... args的方式,其实就是String[] args数组
可以接收多个该类型的参数,注意因为其动态性,所以这个可变参数只能有一个,并且只能放到方法参数的最后一个参数 当存在一个方法是可变形参和具体参数时,则优先选择那个具体参数的方法