JavaSE_day23(补充static知识,Math工具类使用教程,自定义工具类以及测试类,代码块知识、分类、执行顺序以及练习)

 * 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("--------------------");
	}
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值