* 1.补充static
(1)A.java
public class A { public static void main(String[] args) { /* 突发奇想: ==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。 equals 方法不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于“==”,比较的是引用类型的变量所指向的对象的地址值。 一般情况下,类会重写equals方法用来比较两个对象的”内容“是否相等。比如String类中的equals()是被重写了,比较的是对象的”字符串“值。 */ } }
(2)
* static关键字的注意事项:
* 静态方法
* 可以调用静态的成员变量
* 可以调用静态的成员方法
* 不可以调用非静态的成员变量
* 不可以调用非静态的成员方法
* 总结:只能在静态的方法中调用静态的成员(变量与方法)。静态的加载很快!所以非静态的优先级不够,都没加载怎么输出??所以报错了!!
* 非静态的方法
* 可以调用静态的成员变量
* 可以调用静态的成员方法
* 可以调用非静态的成员变量
* 可以调用非静态的成员方法
* 总结:啥都可以
*
* 在静态的方法中是否有this对象?
* 在静态的方法中没有this当前对象的引用,因为静态的方法(变量也是)随着类的加载而加载,优先于所有的对象
*
* static的优点:对对象的共享数据提供单独空间的存储,节省空间,没有必要对每一个对象都存储一份
* 可以直接被类名调用,不用在堆内存创建对象(2.1)person类:
package day23_20221120; public class B_Person { String name; int age; static String graduateFrom; //毕业院校 public static void study(){ //static静态方法! System.out.println(graduateFrom); //根据测试类那边是否赋值输出null或者赋给的值! sleep(); /* System.out.println(name); //会报错,不可以调用非静态的成员变量 eat(); //会报错,不可以调用非静态的成员方法 this.age = age; //会报错! 没有this */ } public void eat(){ System.out.println("eat"); System.out.println(graduateFrom); //static静态变量! sleep(); //static静态方法! method(); System.out.println(name);//根据测试类那边是否赋值输出null或者赋给的值! // this.age = age; //不会报错,非静态可以有this方法! } public static void sleep(){ //static静态方法! System.out.println("sleep"); // this. } public void method(){ System.out.println("method"); } }
(2.2)person测试类
package day23_20221120; /* * static关键字的注意事项: * 静态方法 * 可以调用静态的成员变量 * 可以调用静态的成员方法 * 不可以调用非静态的成员变量 * 不可以调用非静态的成员方法 * 总结:只能在静态的方法中调用静态的成员(变量与方法)。静态的加载很快!所以非静态的优先级不够,都没加载怎么输出??所以报错了!! * 非静态的方法 * 可以调用静态的成员变量 * 可以调用静态的成员方法 * 可以调用非静态的成员变量 * 可以调用非静态的成员方法 * 总结:啥都可以 * * 在静态的方法中是否有this对象? * 在静态的方法中没有this当前对象的引用,因为静态的方法(变量也是)随着类的加载而加载,优先于所有的对象 * * static的优点:对对象的共享数据提供单独空间的存储,节省空间,没有必要对每一个对象都存储一份 * 可以直接被类名调用,不用在堆内存创建对象 * * */ public class B_StaticDemo2 { public static void main(String[] args) { //为Person类的静态成员变量进行赋值 B_Person.graduateFrom = "金灵教育"; //创建Person的对象 B_Person p = new B_Person(); p.study(); System.out.println("------------------------"); p.eat(); System.out.println("------------------------"); B_Person.sleep(); //通过类名直接调用静态修饰的成员方法 } }
*
* 2.Math类,类中的方法,是static静态方法!
package day23_20221120; /* * Math类的演示 * 被static修饰的成员方法 ,可以称这样的类为"工具类" * */ public class C_MathDemo { public static void main(String[] args) { //Math:包含了一些基本的数学运算方法 //static double PI System.out.println(Math.PI); System.out.println("--------------"); //static double abs(double a) : 返回绝对值 System.out.println(Math.abs(15)); //15 System.out.println(Math.abs(-10)); //10 System.out.println(Math.abs(-50)); //50 System.out.println("--------------"); //注意是整型还是浮点型! //static double ceil(double a) : 天花板 向上取证 System.out.println(Math.ceil(1.2)); //2.0 System.out.println(Math.ceil(1.6)); //2.0 System.out.println("--------------"); //static double floor(double a) :底板 向下取证 System.out.println(Math.floor(1.2)); //1.0 System.out.println(Math.floor(1.6)); //1.0 System.out.println(Math.floor(9.9)); System.out.println("--------------"); //static long round(double a) :四舍五入 System.out.println(Math.round(1.2)); //1 System.out.println(Math.round(1.6)); //2 System.out.println(Math.round(5.5)); System.out.println("--------------"); //static double max(double a, double b) System.out.println(Math.max(30, 50)); //比大小,选出大的! System.out.println(Math.min(30,59)); System.out.println("--------------"); //static double random() :返回一个随机数,大于等于0.0且小于1.0 System.out.println(Math.random()); } }
* 3.自定义工具类(数组)
(3.1)自定义工具数组类
package day23_20221120; /* * 自定义:数组操作相关的工具类,不需要创建对象使用 。 * 我们可以私有它的构造方法(私有就是只能在本类中被访问!所以创建不了对象!) * * * * */ public class D_MyArrays { private D_MyArrays(){ } /* * 获取指定数组中的最大元素 * */ public static int getMax(int[]arr){ //定义参照物 int max = arr[0]; for(int i = 0;i<arr.length;i++){ if(max < arr[i]){ //替换参照物 max = arr[i]; } } return max; } /* * 获取指定数组中的指定元素的索引的位置 * */ public static int getIndex(int[]arr,int a){ for(int i = 0;i<arr.length;i++){ if(arr[i]==a){ return i; } } return -1;//如果传进来的元素数组中不存在,返回-1 } }
(3.2)工具类的测试类
package day23_20221120; /* * 测试自定义的数组类的类 * * * */ public class D_MyArraysTest { public static void main(String[] args) { int[]arr = {1,2,3,4,5,6,7,8,9}; int max = D_MyArrays.getMax(arr); //类名直接使用! System.out.println(max); System.out.println(D_MyArrays.getIndex(arr, 3)); } }
* 4.代码块
局部代码块:存在于方法中,控制变量的作用域(即变量在哪个范围内有效!)
构造代码块: 提取构造方法中的共性,每次创建对象都会执行,并且在构造方法执行之前执行
静态代码块: 随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动
在本例中,看程序执行顺序,局部代码块》静态代码块》构造代码块》无参有参构造方法代码执行。
一般来讲,静态代码块》构造代码块》无参有参构造方法代码执行是正确的。package day23_20221120; /* * * 局部代码块:存在于方法中,控制变量的作用域(即变量在哪个范围内有效!) * 构造代码块: 提取构造方法中的共性,每次创建对象都会执行,并且在构造方法执行之前执行 * 静态代码块: 随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动 * * 在本例中,看程序执行顺序,局部代码块》静态代码块》构造代码块》无参有参构造方法代码执行。 * 一般来讲,静态代码块》构造代码块》无参有参构造方法代码执行是正确的。 * * * */ public class E_BlockDemo { public static void main(String[] args) { //1、局部代码块(比静态代码块更快!看程序执行顺序就知道了,后面几行才开始加载Student类!) { for(int i = 0;i < 10; i++){ System.out.println("我是帅哥"+i); } int num = 10; System.out.println("-----------------"); } // System.out.println(num);//报错咯 代码块内定义的num所以代码块外的num找不到 Student s1 = new Student(); Student s2 = new Student("张三",18); } } class Student{ String name; int age; //2、静态代码块: 随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动 。(比构造代码块更快!) static{ System.out.println("加载数据库驱动..."); System.out.println("-----------------"); } //3、构造代码块: 提取构造方法中的共性,每次创建对象都会执行,并且在构造方法执行之前执行。(与类中的局部代码块类似,不过不在main方法内咯!) { for(int i = 0;i<10;i++){ System.out.println("我爱Java"+i); } } public Student(){ System.out.println("1-----------1"); } public Student(String name,int age){ this.name = name; this.age = age; System.out.println("2-----------2"); } }
* 5.练习代码块:package day23_20221120; /* * 一般来讲,静态代码块》构造代码块》无参有参构造方法代码执行,是正确的!! * * * 面试题: [重要] * * Coder静态代码块执行了 --- Coder构造代码块执行了 ---- Coder无参空构造 * 先加载E_BlockTest类,所以顺序如下: * BlockTest静态代码块执行 --- BlockTest的主函数执行了 ---> * BlockTest构造代码块执行了--->BlockTest无参构造执行 * Coder静态代码块执行了(只需加载1次) ---> * Coder构造代码块执行了 --- Coder无参空构造执行-----> * Coder构造代码块执行了 --- Coder无参空构造执行 * * * * */ public class E_BlockTest { //静态代码块 static { System.out.println("BlockTest静态代码块执行了1"); } //构造代码块,要创建对象才会调用 { System.out.println("BlockTest构造代码块执行了2"); } //要创建对象才会调用 public E_BlockTest(){ System.out.println("BlockTest的无参构造执行了2"); System.out.println("-----------------------"); } public static void main(String[] args) { System.out.println("BlockTest的主函数执行了1"); System.out.println("----------------------"); E_BlockTest t=new E_BlockTest(); Coder c = new Coder(); Coder c2 = new Coder(); } } class Coder{ //静态代码块 static { System.out.println("Coder静态代码块执行了3"); System.out.println("-------------------"); } //构造代码块 { System.out.println("Coder构造代码块执行了4、5"); } public Coder(){ System.out.println("Coder无参构造4、5"); System.out.println("--------------------"); } }
JavaSE_day23(补充static知识,Math工具类使用教程,自定义工具类以及测试类,代码块知识、分类、执行顺序以及练习)
于 2023-04-19 16:26:57 首次发布