Java的变量主要分为三类,一类是实例变量,一类是静态变量也叫做类变量,一类是局部变量,在我们的Java里面没有全局变量这个说法;那么我们为什么要使用变量啦。举个简单的例子
一个变量最基本的要有几个要素构成,变量名,变量类型,变量值和变量作用域;
再了解变量作用域之前先来看看Java的修饰符:
访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×
以上四种是访问权限修饰符。每个变量都有其变量名,变量类型和访问权限。
下面来对比一下这几个变量:
局部变量:
1.只能使用默认的访问权限,即只能自一个类,和一个包中访问。
2.局部变量只有在方法和函数体中创建,当函数或方法执行的时候才会去创建局部变量,当方法执行完毕的
时候会去销毁。
3.局部变量里面系统不会默认的去给他分配默认值,所以要我们在使用前自己去分配值,如果是复合类型的
局部变量的话,可以通过New关键字去分陪值;
4.局部变量是堆栈级别的内部实现
5.局部变量是可见的,通常只能在一个方法和函数中可见;
实例变量:
1.实例变量在方法外面,类里面声明。访问权限会根据定义的访问控制符来分配;
2.实例变量有默认值,数值的是0,布尔值的为flase,字符型的位null;
3.实例变量名可以和局部变量名重复,但在程序执行的时候,会优先执行局部变量名,这也是java的就近原则;
4.实例变量可以在一个类的任何地方可见,其可见程度和访问修饰符有关;
5.实例变量的存储方式和他的类型有关。
静态变量:
1静态变量声明在方法和函数外面,类里面。而且必须要加上static关键字声明;
2.静态变量有默认值,数值的是0,布尔值的为flase,字符型的位null;
3.实例变量名可以和局部变量名重复,但在程序执行的时候,会优先执行局部变量名,这也是java的就近原则;
4.静态变量是在程序启动时创建在程序结束时销毁;
5.一般会把静态变量的名称大写;
6.静态变量也叫类变量,因为不论你创建多少个对象,静态变量始终都只有一个。
7.静态变量被存储在静态存储器中。这是罕见的使用静态变量以外声明为final,用作公共或私有常数。
最后再说说几个Java里面的关键字:
关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对java的编译器有特殊的意义,
他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
abstract标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
implements实现 import导入 interface接口。package打包,声明仅仅指定了文件中所定义的类属于哪一个包。
throws扔,一个方法中发生异常但没有捕获,在方法头声明,由方法调用者处理。//throw后不允许有其他的语句。
final如果不希望某个类被其他的类继承,在这种情况下需要使用修饰符final来说明一个类是终极的,不能够做父类。
用final修饰的的量,叫做常量,常量是不可变化的,所以必须在创建的时候给它赋值,或者在初始化的时候给它赋值;
new该子句创建一个新的对象实例。New 子句必须指定一个可以用来创建实例的已定义类。可以在声明语句或赋值语句中使用 New。执行该语句时,
它将调用指定类的构造函数,传递提供的所有参数。
this引用属性,当方法中的参数和某个属性有相同的名字时,这是局部变量优先,属性被隐藏。然而,有时为了能够在方法中以用隐藏的属性,就可以用this区分,由this引用的就是属性,没有this引用的则是局部变量或者是参数。
finally—表示总是执行的,即在try-catch语句中,匹配完异常处理之后会调用finally来执行清除操作,比如关闭流。也就是说只要在try-catch语句
中不论执行了什么,此方法总是会执行一遍;
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上,能否作用在char上;
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long都不能作用于swtich,因为long的范围要比int大,转换成int的时候不是自动转换。另外switch里面还支持枚举类型,从JDK1.7以后字符串类型也可以作用到switch语句上;
抽象类(abstract class)和接口(interface)有什么异同?
我觉得接口是对动作的抽象,即谁在做什么?谁就是我们的对象了,而做什么就是我们的接口动作。比如现在有个电脑类和一个
手机类,他们两个都可以下载东西。我们说电脑下载东西,那么下载东西就是我们的接口。而手机也可以下载东西,手机也可以
实现这个接口,所以我说接口是对动作的抽象。而抽象类则是对本源的抽象,抽象类里面主语是具体的,比如电脑能干嘛,
在抽象类中电脑就是是一个可以与之对应的事物,而我们只是抽象了能干嘛。所以说抽象类一般是单继承的。简单一点就是接口
声明谁能干什么,而抽象类声明,这个对象是什么,并且能够干什么;
接着再从语法上来比较一下:
1.抽象类是用abstract来修饰的,而接口是用interface来修饰的;
2.如果一个类继承了抽象类,那么这个类不一定是抽象类,只有实现了抽象
方法的类才叫抽象类,而如果一个类继承了接口,那么这个类必须是抽象类;
3.抽象类里面可以有普通方法,和普通变量,而接口里面的方法必须是抽象的,
接口的变量必须是静态的都可以访问的变量;
4.他们都有抽象方法;
5.接口可以多继承,而抽象类不可以多继承;
6.抽象类里面可以实现部分方法,而接口里面的方法都不能自己去实现;
当我们关注于一个事物本身去做什么事情的时候可以用抽象类,而当我们只关心一个操作的时候,
可以用接口;