包装类和math的使用

spackage cn.ekgc.javasenior.day20210623;

public class MathDemo {
	public static void main(String[] args) {
		// Java 提供了 Math 这个数学计算的工具类
		// Math 提供了两个常量值,分别是 E 和 PI
		System.out.println("PI = " + Math.PI);
		System.out.println("E = " + Math.E);
		System.out.println("abs() 获得任意数字的绝对值:" + Math.abs(-101));
		// 对于 floor() 来说,是对于一个浮点数进行向下取整,也就是直接将小数点去掉
		System.out.println("floor() 能够获得靠近这个值的最大值:" + Math.floor(55.9));
		System.out.println("pow() 能够计算任意数字的任意幂次的值:" + Math.pow(3, 2));
		// 使用 Math 的 random() 能够获得一个 [0, 1) 之间的随机数
		System.out.println("使用 Math 的 random() 获得随机数:" + Math.random());
		System.out.println("Math 的 round() 能够对一个浮点型进行四舍五入:" + Math.round(55.1));
	}
}
package cn.ekgc.javasenior.day20210623;

import java.util.ArrayList;
import java.util.List;

public class WrapperClassDemo {
	public static void main(String[] args) {
		/*
		 * 由于 Java 拥有 8 个基本数据类型,这 8 个基本数据类型是无法进行对象的创建,
		 * 这个是不符合面向对象思想的,因为为了解决这个问题,Java 提供了包装类来应对这 8 个基本数据类型。
		 * 这八个包装类就属于引用数据类型,是可以创建对象的,分别是:
		 * 基本数据类型			包装类
		 * byte					Byte
		 * short				Short
		 * int					Integer
		 * long					Long
		 * float				Float
		 * double				Double
		 * char					Character
		 * boolean				Boolean
		 * 在有了包装类之后,泛型里所放的就是包装类型
		 */
		// 要想获得一个包装类,可以通过 new 的形式来创建对象
		Integer num1 = new Integer(1);
		System.out.println(num1);
		// 也可以按照基本类型进行直接赋值
		Integer num2 = 1;
		/*
		 * 基本数据类型可以和其包装类之间进行自动转换,
		 * 由包装类变为基本数据类型称之为拆包
		 * 由基本数据类型变为包装类称之为打包
		 */
		Integer num3 = 123;
		int num4 = num3;
		int num5 = 111;
		Integer num6 = num5;
		
		List<Integer> numList = new ArrayList<Integer>();
		// 通过包装类,可以获得一个数据类型的最大值和最小值
		System.out.println("int 类型的最大值是:" + Integer.MAX_VALUE + ",最小值是:" + Integer.MIN_VALUE);
		System.out.println("int 类型的二进制数据:" + Integer.BYTES);
		// 可以通过包装类的构造方法将 String 进行转换
		Integer num7 = new Integer("100");
		System.out.println(num7);
		// 由于包装类是一个引用数据类型,那么包装类的值时可以为 null
		Integer num8 = null;
	}
}

 反射机制

 

package cn.ekgc.javasenior.day20210629;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectDemo01 {
	public static void main(String[] args) throws Exception {
		/*
		 * 1、反射机制是 Java 所特有的机制,能够是开发者在代码运行的状态下,
		 * 动态的了解一个 Java 类所具有的属性、方法和构造方法,并且能够实现
		 * 动态的创建这个类的对象、调用这个对象的属性和方法。
		 * 2、所有的反射机制的功能入口,都是从 java.lang.Class 这个类开始的。
		 * 3、Java 所有的类都是 Class 类的对象。
		 */
		// 要想获得任何一个类的 Class 类的对象,有两种方式:
		// 方式一:直接通过类名的 class 属性获得
		Class stuClass1 = Student.class;
		// 方式二:首先创建该类的对象,然后通过调用该对象的 getClass() 获得
		Student student = new Student();
		Class stuClass = student.getClass();
		// 在获得 Class 对象之后,就可以借助于反射机制,获得这个类的属性、方法和构造方法
		// 获得 Student 的所有属性,反射机制将每个属性都对应为一个 Field 对象
		// 对于 getFields() 只能够获得所有的使用 public 修饰的属性
		Field[] fields = stuClass.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		// 要想获得所有 Student 写出的属性,使用 getDeclaredFields()
		System.out.println("==========================");
		Field[] declaredFields = stuClass.getDeclaredFields();
		for (Field field : declaredFields) {
			System.out.println(field);
		}
		System.out.println("==========================");
		// 也可以通过属性名,获得某个具体的属性,并且进行赋值
		// 获得 name 属性
		Field nameField = stuClass.getField("name");
		// 获得 name 属性对应的 Field 对象后,就可以使用这个 Field 对象进行属性值的赋值
		// 在使用 set() 赋值时,需要指明给哪个对象的该属性赋值,第二个参数指的是所赋予的具体值
		// 以下代码的作用就是给 student 对象的 name 属性赋予 张涛
		// 等价于:student.name = "张涛"
		nameField.set(student, "张涛");
		System.out.println(student.name);
		// 对于反射机制,会将方法对应到 Method 对象上,
		// 要想获得一个类的所有方法,也有 getMethods() 和 getDeclaredMethods()
		System.out.println("==========================");
		Method[] declaredMethods = stuClass.getDeclaredMethods();
		for (Method method : declaredMethods) {
			System.out.println(method);
		}
		System.out.println("==========================");
		// 通过方法名可以获得一个具体方法的 Method 对象,并且通过 invoke() 来调用这个方法
		Method sayHelloMethod = stuClass.getMethod("sayHello");
		// 通过反射机制调用该方法
		// 以下代码就是:student.sayHello();
		sayHelloMethod.invoke(student);
		System.out.println("==========================");
		// 通过反射机制也可以获得该类的构造方法,
		// 如果要获得一个类的所有构造方法,可以通过 getConstructors() 或者是 getDeclaredConstructors()
		Constructor[] declaredConstructors = stuClass.getDeclaredConstructors();
		for (Constructor constructor : declaredConstructors) {
			System.out.println(constructor);
		}
		System.out.println("==========================");
		// 由于构造方法的方法名都是相同,那么可以通过参数列表来获得某个具体的构造方法
		Constructor constructor = stuClass.getConstructor(String.class, String.class, String.class);
		// 获得某个具体的构造方法,那么就可以通过这个构造创建对象
		Student stu = (Student) constructor.newInstance("张涛", "9527", "男");
		System.out.println(stu);
	}
}
package cn.ekgc.javasenior.day20210629;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializableDemo01 {
	public static void main(String[] args) {
		/*
		 * 对于 Java 运行过程中,所产生的对象也属于数据,
		 * 因此这种数据也能够存储到文件中,
		 * 而且文件中已经存储的对象数据,也能够通过流重新读取到程序中恢复成一个对象。
		 * 因此遇到的问题就是,在写出对象数据时,如何将对象变为字节序列,
		 * 以及将字节序列恢复成一个对象。需要约定对象的编码方案。
		 * 因此,我们将一个对象变为字节序列的过程称之为序列化;
		 * 将一个字节序列恢复成一个对象的过程称之为反序列化。
		 * 要想将一个对象具有序列化和反序列化的能力,则该类必须实现接口 java.io.Serializable。
		 * 只要实现该接口,那么 Java 会自动的为该类提供一套完整的序列化和反序列的方案,
		 * 我们要求任何一个 Java 类都必须实现 java.io.Serializable 接口。
		 * 原因在于,一个 Java 对象,不仅仅需要变为字节序列存储在硬盘,
		 * 而且也需要进行网络传输,无论是磁盘保存,还是网络传输,都必须变为字节序列才可以进行。
		 * 当接收磁盘保存的对象或者是对方通过网络所发送的对象数据时,也必须经过反序列化才能够变为一个对象。
		 */
		// 创建 User 对象
		User user = new User("王大锤", "13601002978", 1);
		// 如果需要将一个对象保存到文件中,那么可以借助于 ObjectOutputStream 完成
		// 创建需要保存数据的文件路径
		String path = "C:\\Users\\Arthur\\Desktop\\users.txt";
		// 根据文件路径创建 File 对象
		File file = new File(path);
		// 初始化 FileOutputStream 和 ObjectOutputStream 类型的变量
		FileOutputStream out = null;
		ObjectOutputStream oos = null;
		
		try {
			// 通过 File 对象创建 FileOutputStream 对象
			out = new FileOutputStream(file);
			// 通过 FileOutputStream 对象创建 ObjectOutputStream 对象
			oos = new ObjectOutputStream(out);
			
			// 通过 ObjectOutputStream 将 User 对象写出
			oos.writeObject(user);
			System.out.println("对象写入成功!");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭最外层的流
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
package cn.ekgc.javasenior.day20210629;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class SerializableDemo02 {
	public static void main(String[] args) {
		/*
		 * 通过序列化功能,能够将 Java 对象变为字节序列保存到文件中去,
		 * 那么通过 ObjectInputStream 也能够将存储的对象序列读取到程序中,
		 * 借助于反序列化功能,将字节序列恢复成一个 Java 对象
		 */
		// 设定需要读取的文件路径
		String path = "C:\\Users\\Arthur\\Desktop\\users.txt";
		// 根据文件路径创建对应的 File 对象
		File file = new File(path);
		// 分别创建 FileInputStream 和 ObjectInputStream 类型的变量
		FileInputStream in = null;
		ObjectInputStream ois = null;
		
		try {
			// 通过 File 对象创建 FileInputStream 对象
			in = new FileInputStream(file);
			// 通过 FileInputStream 对象创建 ObjectInputStream 对象
			ois = new ObjectInputStream(in);
			
			// 通过 ObjectInputStream 对象的 readObject() 读取文件中的数据
			// 并且通过反序列化,将数据恢复成一个对象
			User user = (User) ois.readObject();
			System.out.println(user);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭 ObjectInputStream 对象
				ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
package cn.ekgc.javasenior.day20210629;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class StudentDemo {
	public static void main(String[] args) throws Exception {
		// 对于普通的属性或者是方法的调用,需要创建对象
		Student student = new Student();
		student.name = "法外狂徒张三";
		student.cellphone = "110";
		student.setGender("男");
		System.out.println(student);
		System.out.println("=================");
		// 使用反射机制实现以上功能
		// 获得 Student 的 Class 对象
		Class<Student> stuClass = Student.class;
		// 获得 Student 的无参数构造方法
		Constructor<Student> constructor = stuClass.getConstructor();
		// 借助于无参数构造方法创建对象
		Student stu = constructor.newInstance();
		// 获得 Student 的 name 属性
		Field nameField = stuClass.getField("name");
		// 给 stu 对象的 name 属性赋值
		nameField.set(stu, "法外狂徒张三");
		// 同理获得 cellphone 属性
		Field cellphoneField = stuClass.getDeclaredField("cellphone");
		cellphoneField.set(stu, "110");
		// 获得 Student 的 setGender()
		Method setGenderMethod = stuClass.getMethod("setGender", String.class);
		// 执行该方法
		setGenderMethod.invoke(stu, "男");
		System.out.println(stu);
	}
}
package cn.ekgc.javasenior.day20210629;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;

import javax.activation.FileDataSource;

public class Student01 {
public static void main(String[] args) throws Exception {
	Class stuclass1 = Student.class;
	Student student = new Student();
	Class stuclass = student.getClass();
	Field[] fields = stuclass.getFields();
	for(Field field: fields) {
		System.out.println(field);
	}
	System.out.println("=========================");
	Field[]declaFields = stuclass.getDeclaredFields();
	for(Field field: declaFields) {
		System.out.println(field);
	}
	System.out.println("=========================");
	Field nameField = stuclass.getField("name");
	nameField.set(student,"法外狂徒张三");
	System.out.println(student.name);
	Method[] declaredMethods = stuclass.getDeclaredMethods();
	for(Method method: declaredMethods) {
		System.out.println(method);
	}
	System.out.println("=========================");
	Method sayhello = stuclass.getMethod("sayHello");
	sayhello.invoke(student);
	Constructor[] declaredConstructors = stuclass.getConstructors();
	for(Constructor con: declaredConstructors) {
		System.out.println(con);
	}
	Constructor constructor = stuclass.getConstructor(String.class,String.class,String.class);
	Student stu = (Student )constructor.newInstance("张三丰","9527","男");
	System.out.println(stu);
	
}
}

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值