Java面向对象--02
static关键字 main方法 静态成员
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. static知识点
1). 方法区/共享区/数据区
(1). 类中的函数代码本身==>这片区域叫方法区的意义
**方法内部使用的局部变量数据是存储在栈中该方法对应的区域
(2). 类中的静态数据 (也就是共享数据) ==è这片区域叫共享区的意义
2). static的基本用法
(1). static 是一个修饰符,只能修饰类的成员(也就是只能修饰成员变量和成员方法)
static绝对不能修饰局部变量!!!
(2). 静态成员的两种调用方式
[1]. 对象引用.静态成员变量
[2]. 类名.静态成员变量
(3). 静态成员变量存储的位置
类中静态成员变量是存储在方法区/共享区/数据区***
类中非静态成员是存储在堆内存中
注意区分上面两种情况。
(4). static静态成员的特点
[1].随着类的加载而加载,随着类的消失而消失。与类共存亡。
class Person{
Stringname;
static String country;
}
注意这个Person类一加载到内存的时候,静态成员变量country就在方法区开辟内存空间。随着类加载而加载。
[2]. 先于类的对象而存在
[3]. 被所有的该类的对象共享
[4]. 可以通过类名来调用静态成员
(5). 别名
[1]. 静态成员变量也叫类变量。
[2]. 非静态成员变量也叫实例变量
3). 类变量和实例变量的区别
| 内存中的存储位置 | 生命周期 |
类变量/静态变量 | 随着类加载而加载,存储到方法区 | 与类共存亡。 |
实例变量/非静态变量 | 随着对象建立而存在堆内存中 | 与对象共存亡。 |
4). 静态使用的注意事项
(1). 静态成员方法只能访问静态的成员(方法/变量) ------à静态只能访问静态
非静态可以访问静态(原因就是对象也可以调用静态成员)。
结论:静态 (方法)只能访问静态但是非静态 (方法)可以访问任意
【个人理解】
[1].澄清一下:这个静态成员方法调用的是本类的非静态成员才会出问题。
所以,如果通过静态方法调用
{1}.没有“对象.”非静态成员
{2}. “this.本类非静态成员”
都是错误的,编译无法通过!!
[2].如果调用有“非this的具体对象引用.非静态成员”是可以的。
所以,大原则:如果静态方法调用的非静态的成员,这个成员之前的对象是存在,那就没有问题。
(2). 静态方法中不可以使用super、this等关键字
(3). main方法为静态的
5). 静态的利与弊
(1). 静态的好处
[1].节省空间。对对象的共享数据在方法区单独开辟了内存空间。没有为每一个对象在堆内存中单独复制一份备份。
[2].调用方便。类名就可以直接调用静态方法,不用创建实例再调用。
(2). 静态的坏处
[1],生命周期过长
[2].出现访问局限性(只能访问本类的静态成员。 无法直接访问非静态成员)
6). 如何使用static
(1). 何时使用static修饰成员变量
[1]. 当类中出现了所有对象都共享的数据,那么就把这个成员定义为static的成员变量
[2]. 每个对象都有不同取值的成员变量是对象特有的属性,应该定义成非静态的成员变量
(2). 何时使用static修饰成员方法
[1]. 当要定义的函数的功能没有直接访问到该类的非静态成员或者通过this来访问该类的非静态成员的时候,将这个要定义的功能设置为static的成员方法
2. main函数
1). main方法的作用
main方法是程序的入口,可以被JVM调用。
2). main方法的标准格式及含义
(1). main函数各个部分的含义
publicstatic void main(String[] args) {}
[1]. public: 访问修饰符
{1}. 代表main函数的访问权限是最大的,由JVM调用。
{2}. main不是Java中的关键字,但是确是可以被JVM识别。
[2]. static: 成员修饰符
{1}. main方法在Java中一定是在某个类的成员位置上出现的。所以,可以被专门修饰成员的修饰符static来修饰。
{2}. 代表main函数是随着所属的类加载而加载到内存中的方法区。
{3}. JVM直接采用 “类名.main()”来调用某个类的主方法。
[3]. void: 返回值类型
主函数没有具体返回值。这是因为JVM自身调用main方法,main中如何执行的,JVM本身非常清楚,所以不存在什么数据的值,JVM不知道,所以执行完main方法之后,没有必要给JVM一个返回值。
[4]. String[] args:参数列表
{1}.main方法的参数是一个字符类型的数组。
{2}.用来接受程序在启动执行的时候,用户传递给程序的参数。这些参数以String的形式存储到String[] args中。
(2). 主函数main的格式是固定的
[1]. 如果想让JVM识别main方法,那么这个main方法必须遵从
public static void main(String[] args) {}
[2]. 以上的格式中,只有形参列表String[] args的变量名args可以改变。其余的地方如果被改变,虽然能通过编译(这是因为只要是函数,就能够被重载),但是无法被JVM识别!!!!
e.g.
public static void main(int x){}
public static void main(String[] args) {}
其中,JVM只能识别第二个main方法。第一个作为第二个的重载形式可以存在,所以编译通过。
(3). 为主方法main传值的两种方式
[1]. 通过JDK中的java.exe这个工具为main的String[]传值。
假设MainDemo为一个类名
{1}. > javaMainDemo
要执行哪个类,就把类名作为参数传入JVM。传入这个类名之后,JVM会调用这个类的main方法。
{2}. >javaMainDemo tomcat jetty maven
JVM会将类名之后的字符串分别封装到MainDemo类的main方法中的String[]args参数。
[2]. 通过其他方法调用main并为其进行传值
class MainDemo{
public static void main(String[] args) {
for(String arg: args){
System.out.println(arg);
}
}
}
class MainTest{
public static void main(String[] args) {
show();
}
static void show(){
String[]arr =new String[]{"Tomcat", "Maven","Jetty"};
MainDemo.main(arr);//其他方法调用了MainDemo的main方法,并且为其进行了传值
}
}
输出结果:
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------