第一次写,就先不弄样式了 ^_^
以后攒五个或以上就发一版
问题概括:
1、为何main(主)函数中不能直接调用成员变量:
1)成员函数内部为何不可以定义静态变量:
2、控制访问权限修饰符、static都不能修饰局部变量、局部函数、局部内部类
1)内部类访问局部变量的时候,为什么变量必须加上final修饰(转,转2)
3、@SuppressWarnings(unused) 、serial与rawtypes
4、String为什么不可变
5、形参的可变参数的定义(如String... args)(转)
问题回答:
1、为何main(主)函数中不能直接调用成员变量:
因为主函数是static函数,不可以直接调用非静态变量和非静态方法。(在JAVA中静态函数和变量不依赖对象,独立存在,而非静态函数和变量需要依赖对象才能建立)
解决方法:
a、将变量变成静态变量,再在调用时用实例名调用或类名调用(推荐使用类名调用,可以直观知道是静态方法或变量)
b、实例化该类,用实例名调用
c、将方法改成非静态方法(主函数中不推荐)
引申问题:
1)成员函数内部为何不可以定义静态变量:
有两种想法:
a、static只能修饰成员变量或成员方法。不能修饰局部变量。在Java 中,用static 修饰的成员 被视为共享的。定义在方法中,被视为局部的。显然是不能共享的。
——引自https://zhidao.baidu.com/question/281363843.html
b、静态变量和方法在JAVA运行就产生,而成员函数依赖对象建立,不一定存在,在一个不一定存在的方法里定义一个跟定会产生的变量,前后矛盾。
2、控制访问权限修饰符、static都不能修饰局部变量、局部函数、局部内部类
因为不管是局部变量,还是局部函数,或是局部内部类都是在成员函数内定义的,本身就只能在成员函数内被调用,外部不可以调用,已经有了限制,所以不能用控制访问权限修饰符修饰,而成员函数是依赖对象存在的,随着对象的回收而销毁;static修饰的变量和函数在类加载的时候被创建,随着类的回收而销毁。
引申问题:
1)内部类访问局部变量的时候,为什么变量必须加上final修饰 ——引自https://feiyeguohai.iteye.com/blog/1500108
final从语法上约束了实际上两个不同变量的一致性(表现为同一变量)
3、@SuppressWarnings(unused) 、serial与rawtypes
@SuppressWarnings 标示下面的{ }或者一句代码忽略
unused 用于我们有时拿出来的变量过多,却有些多余或者没有当前用到,则可以用它;
serial 主要用于我们的实体类,序列化后没有加serialVersionUID,可以加上;
rawtypes 压制警告,常用与压制泛型的警告。
@SuppressWarnings("all") 抑制所有类型的警告
4、String为什么不可变
String类本质都是对字符数组的封装(而且value也只是一个引用,它指向一个真正的数组对象)。该数组value被声明为私有,外部便无法直接访问该成员,并且加以final修饰 , 源码中也没有提供value的set方法,因此只能对value赋值一次,所以String类一旦初始化,外部便无法修改,因为value被修饰为 private final,在String类内部也无法改变。所以String对象是不可变的。
5、形参的可变参数的定义(如String... args) ——引自https://www.cnblogs.com/imqsl/p/6872390.html
String[] args 和 String... args 本质上不没有什么区别,String... args 最后还是转化成String[] args 来做的,只是String... args这种形式在应用上更加的灵活和简便。
备注:1、成员变量叫实例变量,静态变量叫类变量。
原文地址:https://www.cnblogs.com/violet-enter/p/10417123.html