这里写目录标题
要懂得这些变量的区别,如果能理解下面的一段话就基本理解,就不用看下边的东西了
1、成员变量包括实例变量和类变量;而成员方法包括实例方法、类方法,当然还有一种特殊的构造方法。
2、类变量、类方法就是类中的变量、方法,必须是静态的,要加static;故其又称静态变量、静态方法。
与类加载时共同创建的东西
3、成员变量、成员方法是对象或实例中的变量、方法,不加static;
局部变量
局部变量的定义:
定义在方法中的变量都是局部变量(main方法也是方法,所以定义在main方法中的变量也是局部变量)。因为只能在方法内部使用,固不可以用private,public,protect来修饰。
生存时间:
局部变量的生存时间和方法的生存时间一致,调用该方法声明该局部变量并初始化的时,该局部变量被创建并分配内存空间;直到该方法调用结束局部变量也就结束了;
是否需要初始化
:
局部变量在使用前必须进行初始化,系统默认不会对局部变量进行初始化数据操作,如果局部变量在使用前没有进行初始化则会在编译器报错;如果局部变量进行了声明没有进行初始化, 但是也一直没有被使用的话编译也是不会报错的;(局部变量使用前必须初始化话)
全局变量(成员变量)
1. 非静态全局变量
非静态全局变量的定义
:非静态全局变量都是定在类中,是类的成员变量或者说是成员属性属于类的一部分(或 者说是对象的一部分);
生存时间
:非静态全局变量加载在堆内存中,随着声明初始化而创建,随着对象消亡而消亡;
是否需要初始化
:全局变量都是不需要被强制初始化的,系统都会默认根据其数据类型进行默认赋值;但是建议 在声明时都进行初始化操作;
创建位置
:创建在堆内存中,因为非静态的全局变量数对象的成员变量是对象的一部分;
2. 静态全局变量
静态全局变量的定义
:静态的类成员变量;
生存时间
:静态全局变量随着类的字节码文件加载而加载产生,随着字节码文件的消失而消失,生存时间比类的 对象还要长;
是否初始化
:凡是全局变量都是可以不要初始化的,静态变量也是一样,系统会自动根据其数据类型进行赋默认值,但是建议变量在声明时都进行初始化;
创建位置
:静态变量时存在于对内存中的,所以静态全局变量也是存在于堆内存中的。
最终变量
最终变量的定义
:使用关键字final声明变量称为最终变量,final 关键字可以用来修饰 类,方法和变量(成员变量和局部变量)
修饰变量
被final修饰的变量其实就相当于定义了一个常量,无法被修改的变量,如果final修饰的是一个基本数据类型的变量,那么这个变量的值就定了,不能变了,而如果修饰的是一个引用变量,那么该变量存的是一个内存地址,该地址就不能变了,但是该内存地址所指向的那个对象还是可以变的,就像你记住了人家的门牌号,但你不能管人家家里人员数量。
**修饰类:**就不能被别的类继承,final类中所有的方法都会被隐式修饰为final类
修饰方法
:当一个方法被final修饰后,就代表该方法无法被重写,如果你想明确禁止该方法在子类中被覆盖的情况下,才将方法设置为final的,这样你就无法重写该方法了
但是
:如果父类的 final修饰的方法设置为private,则子类可以写一个同名的方法,此时 ,该同名的方法不再产生final的报错,而是在子类重新定义了一个方法(注:类的private方法会隐式地被指定为final方法。)
特点
使用final声明的形式参数就成为了一个常量,在方法体内不能改变它的值
静态变量
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。” 出自引用java编程思想86页
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是须依赖具体的对象才能够被调用。
static可以修饰
1.方法
2.成员变量(属性)
3.代码块(不能出现在方法内部)
static不能修饰局部变量
Java中规定
static使用场景
如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么 main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
实例变量
**实例变量的定义百度百科:**定义在类中但在任何方法之外。(New出来的均有初始化),当一个对象被实例化之后,每个实例变量的值就跟着确定;实例变量在对象创建的时候创建,在对象被销毁的时候销毁;实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息。
访问修饰符可以修饰实例变量
实例变量特点
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName。
类变量
类变量(也称为静态变量)在类中使用static关键字声明,但在方法,构造函数或块之外。
可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡。
**只要类存在,类就可以访问类变量 类.类变量
只要实例存在,实例就可以访问实例变量 实例.实例变量**
类方法:(静态方法)
与类变量一致,在类加载时共同加入内存的方法,用static修饰
8. 成员方法:(类方法和实例方法)
实例方法:
实例方法相对于静态方法(或者叫类方法)而言,它就是没有 static 前缀的一类一般方法,被对象拥有(这也是称之为“实例”方法的原因)。
特点是定义的时候前面没有 static 前缀,本类中直接调用的时候必须也在实例方法内,否则调用前必须先实例出一个对象。
构造方法:
构造方法定义百度百科
构造方法是一种特殊的方法,它是一个与
类同名
的方法。
对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化
。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。在Java中,任何变量在被使用前都必须先设置初值,如无显式赋值,则编译器会为其进行隐性赋值。Java提供了为类的成员变量赋初值的专门方法。
构造方法作用
:(1).构造出来一个类的实例 (2).对构造出来个一个类的实例(对象)初始化。
特点
- 构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
- 主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
-
类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。
*4. 不能被static、final、synchronized、abstract和native修饰。 - 构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。
-
构造方法分为两种:无参构造方法 有参构造方法
构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。 -
构造代码块:
(1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
(2)构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化 -
子类继承父类中,
子类的实例化过程
1.***构造方法不能被子类继承
***子类创建对象时,会先去创建父类的对象。
默认是去调用父类的无参构造方法。
*2.
子类构造方法中,第一行默认是super()
***为什么子类中第一行会默认有super()
因为他继承父类的成员使用,使用前这些成员必须初始化,
而他们是父类的成员,所以,必须通过父类进行初始化。
所以,会先创建一个父类的对象。
当父类没有无参构造方法时
必须使用this或者super调用其他的构造方法。 -
自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。如果写了一个有参的构造方法,就一定要写无参构造方法。
如果想使用无参的构造方法,就必须手动给出无参构造方法。
建议:一般情况下,我们自定义的类都要手动给出无参构造方法。
成员方法
类中声明的方法都是成员方法