2019-05-23 java学习日记
静态static注意事项
在静态方法中是没有this关键字的
1,静态是随着类的加载而加载,this是随着对象的创建而存在。
2,静态比对象先存在。
静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法
非静态方法:
成员变量:可以是静态的,也可以是非静态的
成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
简单记:
静态只能访问静态。
例子:
1 class Demo2_Static { 2 public static void main(String[] args) { 3 //Demo d = new Demo(); 4 //d.print1(); 5 //Demo d = new Demo(); 6 //System.out.println(d.num1); 7 System.out.println(Demo.num1); 8 //Demo.print2(); 9 } 10 } 11 12 class Demo { 13 int num1 = 10; //非静态的成员变量 14 static int num2 = 20; //静态的成员变量 15 16 /*public void print1() { 17 //非静态的成员方法,既可以访问静态的成员也可以访问非静态的 18 System.out.println(num1); 19 System.out.println(num2); 20 }*/ 21 public static void print2() { //静态的成员方法 22 //System.out.println(this.num1); 23 //静态的成员方法不能访问非静态的,错误: 无法从静态上下文中引用非静态变量num1 24 System.out.println(num2); 25 } 26 }
静态变量和成员变量的区别
静态变量也叫类变量 成员变量也叫对象变量
所属不同:
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
内存中位置不同:
静态变量存储于方法区的静态区
成员变量存储于堆内存
内存出现时间不同:
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
调用不同:
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象调用
public : 被jvm调用,所以权限要足够大
static : 被jvm调用,不需要创建对象,直接类名.调用即可
void : 被jvm调用,不需要有任何的返回值
main : 只有这样写才能被jvm识别,
main不是关键字
String[] args : 以前是用来接收键盘录入的,现在用Scanner键盘录入
注:这里唯一能改的就是agrs,它就是一个变量名,是参数是意思,
以前是用argument,但是嫌太长了,于是变改成了args。
如果一个类中的所有方法都是静态的,那么就多做一步,把构造方法私有化,
目的是不让其他类创建本类对象。
例子:做一个包含获取数组最大值,数组的遍历以及数组的反转的数组工具类以及说明书。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 3 这是一个数组工具类,里面封装了查找数组最大值,打印数组,数组反转的方法 4 5 @author fengjia 6 7 @version v1.0 8 9 */ 10 11 public class ArrayTool { 12 13 //如果一个类中所有的方法都是静态的,需要再多做一步,私有构造方法,目的是不让其他类创建本类对象 14 15 //直接用类名.调用即可 16 17 /** 18 19 私有构造方法 20 21 */ 22 23 private ArrayTool(){} //设计模式:单例模式 24 25 //1,获取最大值 26 27 /** 28 这是获取数组中最大值的方法 29 @param arr 接收一个int类型数组 30 @return 返回数组中最大值 31 */ 32 public static int getMax(int[] arr) { 33 int max = arr[0]; //记录第一个元素 34 for (int i = 1;i < arr.length ;i++ ) { //从第二个元素开始遍历 35 if (max < arr[i]) { //max与数组中其他的元素比较 36 max = arr[i]; //记录住较大的 37 } 38 } 39 40 return max; //将最大值返回 41 } 42 //2,数组的遍历 43 /** 44 这是遍历数组的方法 45 @param arr 接收一个int类型数组 46 */ 47 public static void print(int[] arr) { 48 for (int i = 0;i < arr.length ;i++ ) { //遍历数组 49 System.out.print(arr[i] + " "); 50 } 51 } 52 //3,数组的反转 53 /** 54 这是数组反转的方法 55 @param arr 接收一个int类型数组 56 */ 57 public static void revArray(int[] arr) { 58 for (int i = 0;i < arr.length / 2 ;i++ ) { 59 //循环次数是元素个数的一半 60 /* 61 arr[0]与arr[arr.length-1-0] 交换 62 arr[1]与arr[arr.length-1-1] 交换 63 arr[2]与arr[arr.length-1-2] 交换 64 */ 65 int temp = arr[i]; 66 arr[i] = arr[arr.length-1-i]; 67 arr[arr.length-1-i] = temp; 68 } 69 } 70 71 } 72 73 class Demo1_ArrayTool { 74 75 public static void main(String[] args) { 76 77 int[] arr = {33,11,22,66,55,44}; 78 79 /*ArrayTool at = new ArrayTool(); 80 81 int max = at.getMax(arr); //获取最值 82 83 System.out.println(max); 84 85 System.out.println("---------------"); 86 at.print(arr); //打印 87 System.out.println(); 88 System.out.println("---------------"); 89 System.out.println("反转后:"); 90 at.revArray(arr); //反转 91 at.print(arr); */ 92 93 ArrayTool.print(arr); 94 } 95 96 }
Math.random()方法会生成大于等于0.0并且小于1.0的伪随机数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Demo2_Math { 2 3 public static void main(String[] args) { 4 5 //double d = Math.random(); 6 7 //System.out.println(d); 8 9 //Math.random()会生成大于等于0.0并且小于1.0的伪随机数 10 for (int i = 0;i < 10 ;i++ ) { 11 System.out.println(Math.random()); 12 } 13 14 //生成1-100的随机数 15 //Math.random()0.0000000 - 0.999999999 16 //Math.random() * 100 ====> 0.00000 - 99.999999999 17 //(int)(Math.random() * 100) ====> 0 - 99 18 //(int)(Math.random() * 100) + 1 19 20 for (int i = 0;i < 10 ;i++ ) { 21 System.out.println((int)(Math.random() * 100) + 1); 22 } 23 } 24 25 }