java SE小练习


	//1、成员变量、局部变量的区别? Java 几种基本类型成员变量默认初始化的值?
	
	/**区别: 
		    a、在类中的位置不同成员变量:在类中方法外面局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中);
			b、在内存中的位置不同,可以看看Java程序内存的简单分析成员变量:在堆中(方法区中的静态区)局部变量:在栈中;
			c、生命周期不同成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用或者代码块的执行而存在,
				随着方法的调用完毕或者代码块的执行完毕而消失;
			d、初始值 成员变量:有默认初始值 局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错。
		
		几种基本类型成员变量默认初始化的值
			byte short int 0
			long 0L
			char 空格
			float 0.0f
			double  0.0d
			boolean false
		
		*/
	//2、	方法重载和方法重写区别?
	/**
	 * 方法的重写Overriding和重载Overloading是Java多态性的不同表现。
	 * 重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
	 * ---------------------------------------------------------------------------------
	 * 		override重写              		        |       	  overloading重载
	 * 										|			
	 * 方法名,参数类型,返回值类型全部相同                     |        方法名相同,参数类型个数不一定相同                   
	 * 被重写的方法不能缩小父类方法的访问权限                |            对权限没有要求 
	 * 发生在继承类中							|			   发生在一个类中
	 *  									|
 	 ------------------------------------------------------------------------------------
	 *  
	 *  */
	
	//3、 能根据根据返回类型来区分重载,为什么?
	/**
	 * 不能;
	 * 因为调用时不能指定返回类型信息,编译器不知道你要调用哪个函数。
	 * 
	 * 
	 * */
	
	
	
	
	//4、 this和super以及final关键字的作用是什么?
	/**
	this关键字
		  如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据。
		  在一个构造函数中可以调用另外一个构造函数初始化对象
	
	super关键字
		 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
		 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
		
	final关键字
		修饰全局变量:该变量为一个全局的常量(全局常量一定要赋初始值,全局变量可以不赋初始值)。
		修饰局部变量:变为局部的常量,仅在所在的代码块中有效。
		修饰类:则该类为最终类,即没有子类不能被继承
		修饰方法:则该类不能被重写,成为最终方法
		
		*/
	
	
	
	//5、 java代码块的分类和特点以及加载顺序?
	/**
	 * 分类:局部代码块,构造代码块,静态代码块,同步代码块
	 * 
	 * 特点:局部代码块:直接在出现在一个方法中的{};限定变量生命周期,及早释放没用的对象,变量等,提高内存利用率
	 * 		同步代码块:synchronized关键字 ,主要出现在多线程中
	 * 		构造代码块:直接在类中定义的没有加static关键字的代码块{}称为构造代码块,用于对象进行初始化。
	 * 		静态代码块:static关键字声明;用来为静态属性初始化 ;只执行一次
	 * 加载顺序:静态代码块–>构造代码块–>构造函数 
				
	 */
	
	
	
	/*6、下面的程序可以运行么?说明原因?如果不能运行该如何修改?
	public class Test {
	    public static void main(String args[]) { 
	       Foo obj = new Foo();       
	    }     
	}
	class Foo{
	    int value;
	    public Foo(int intValue){
	        value = intValue;
	    }
	}*/
	/**
	 * 不能运行;编译出错;因为没有空的构造函数;
	 * 解决办法:
	 * 		a. Foo obj = new Foo(); 加一个int 类型参数 
	 * 		b.foo类加一个空的构造函数
	 * 
	 */
	
	
	
	/*7、 class Varialbe {
		  int num = 12; 
		public void show1() {
			int num = 50;
			System.out.println(num);
		}
		public void show2(){
			int num2; 
			System.out.println(num2);
		}
		public static void main(String[] args){
			Varialbe varialbe = new Varialbe();
			varialbe.show1();
			varialbe.show2();
		}
	}
	上述程序运行结果分别是?说明原因?*/
	/**
	 * 编译出错,无法运行 num2未实例化
	 * 把错误排除后num的值为50 num2的值是实例化后的值
	 * 
	 */
	
	
	
	
	/*8、
	class Person{  
	 private String name ;  // 姓名
	 private int age ;   // 年龄
	 public Person(String name,int age){ 
	  name = name ;
	  age = age ;
	 }
	 public String getInfo(){ 
	  return "姓名:" + name + ",年龄:" + age ;
	 }
	};
	public class ThisDemo01{
	 public static void main(String args[]){
		 Person per1 = new Person("张三",33) ; 
	     System.out.println(per1.getInfo()) ; 
	 }
	};
	上述程序运行结果?说明原因?*/
	/**
	 * 姓名:null,年龄:0
	 * 未加this关键字  
	 */
		
	
	
	/*9、
	public class JqTest {
	    public static String staticField = "晶奇科技";
	    public String field = "JQKJ"; 
	    static {
	        System.out.println( staticField );
	    }
	    {
	        System.out.println( field );
	    }
	    public JqTest()
	    {
	        System.out.println( "晶奇" );
	    }
	    public static void main( String[] args )
	    {
	        new JqTest();
	    }
	}
	上述程序运行结果?说明原因?*/
/**运行结果
	         晶奇科技
		JQKJ
		晶奇
	
	原因:再不考虑继承等情况下   静态代码块最先按顺序执行 , 构造代码块 其次执行 ,  构造方法最后执行
 */
	
	
	/*10、
	下列有关整型的最终属性i的定义正确的是哪些?并列出错误原因
	A.static int i;
	B.final i;
	C.static finalint i = 50;
	D.final float i= 1.2;*/
	/**A 又因为是最终属性  所以 要用final限制  
	 * B错误  不是整型
	 * C正确 
	 * D错误 不是整型
	 */
			

 


import java.text.DecimalFormat;

/**
 * 11、 创建一个类,为该类定义三个构造函数,分别执行下列操作:
 *  1、传递两个整数值并找出其中较大的一个值 
 *  2、传递三个double值并求出其和(注意精度)
 *  3、传递两个字符串值并检查其是否相同 
 *  4、在main方法中测试构造函数的调用
 * 
 *
 */
public class TestConstruction {

	// 1、传递两个整数值并找出其中较大的一个值
	public TestConstruction(int a, int b) {
		if (a > b) {
			System.out.println(a);
		} else {

			System.out.println(b);
		}

	}

	// 传递三个double值并求出其和(注意精度)
	public TestConstruction(double a, double b, double c) {
		DecimalFormat df = new DecimalFormat("#.0000");
		double sum = 0.0;
		sum = a + b + c;
		System.out.println(df.format(sum));
	}

	// 传递两个字符串值并检查其是否相同
	public TestConstruction(String s1, String s2) {
		if (s1.equals(s2)) {
			System.out.println("相同");
		} else {
			System.out.println("不相同");
		}

	}

	public static void main(String[] args) {
		new TestConstruction(2, 3);
		new TestConstruction(2.1, 3.1, 1.1);
		new TestConstruction("s1", "s2");
		new TestConstruction("s1", "s1");
	}
	/**
	 *  3
		6.3000
		不相同
		相同
	 */
}


/**
 * 创建一个员工类(Employee),其中包括: 1)
 * 4个属性:员工姓名(name)、员工年龄(age)、员工职位(position)、工资(salary) 2) 方法: Employee()
 * ——给所有的属性指定初始值 setName()——给name属性赋值
 * setAge()——给age属性赋值,要求年龄必须在18岁以上,当年龄无效时,将年龄强制赋值为18,并在控制台打印"年龄输入不符合要求,默认为18"
 * setPosition()——给position属性赋值,只能是“售后服务”和“销售员”,如果不符合要求,强制将职位赋值为“售后服务”
 * 并在控制台打印"职位输入不符合要求,默认为售后服务",。 setSalary()——用于员工的工资:根据员工的年龄段不同,给工资属性赋值,具体要求:
 * 18~20岁之间,1000元,21~25岁之间,1500元,26~30岁之间,2000元,31~40岁之间,3000元,41~50岁之间,3500元,
 * 50岁以上,4000元 getName()——返回name属性 getAge()——返回age属性 getPosition()——返回position属性
 * getSalary()——返回salary属性 
 * 测试类TestEmployee,在该类中创建3个Employee对象,
 * 通过键盘输入给3个员工的名字、年龄、职位进行赋值,打印出员工的各项信息(名字,职位,年龄,工资),显示出员工的信息;
 * (注:不一定按照上面去写,可按照自己对面向对象的理解去设计)
 * 
 *
 */
public class Employee {

	private String name;
	private int age;
	private String position;
	private float salary;

	public Employee(String name, int age, String position, float salary) {
		super();
		this.name = name;
		this.age = age;
		this.position = position;
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {

		return age;
	}

	public void setAge(int age) {
		if (age < 18) {
			this.age = 18;
			System.out.println("当年龄无效时,默认为18");
		} else {
			this.age = age;
		}

	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		if (position.equals("售后服务") || position.equals("销售员")) {
			this.position = position;
		} else {
			this.position = "售后服务";
			System.out.println("输入不符合要求,默认为售后服务");
		}
	}

	public float getSalary() {
		return salary;
	}

	public void setSalary() {
		if (age >= 18 && age <= 20) {
			this.salary = 1000;
		} else if (age >= 21 && age <= 25) {
			this.salary = 1500;
		} else if (age >= 26 && age <= 30) {
			this.salary = 2000;
		} else if (age >= 31 && age <= 40) {
			this.salary = 3000;
		} else if (age >= 41 && age <= 50) {
			this.salary = 3500;
		} else if (age >= 51) {
			this.salary = 4000;
		} else {
			System.out.println("没有设置年龄或者年龄无效");
		}
	}

	@Override
	public String toString() {
		return "Employee [name=" + name + ", age=" + age + ", position=" + position + ", salary=" + salary + "]";
	}

}


================================================================================
public class TestEmployee {

	@Test
	public void test1() {
		Employee e1 = null;
		List list = new ArrayList<>();
		Scanner sc = null;
		for (int i = 0; i < 3; i++) {
			e1 = new Employee(null, 0, null, 0);
			
			sc = new Scanner(System.in);
			
			System.out.println("请输入第" + (i + 1) + "个员工姓名:");
			String name = sc.next();
			e1.setName(name);

			System.out.println("请输入第" + (i + 1) + "个员工年龄:");
			int age = sc.nextInt();
			e1.setAge(age);

			System.out.println("请输入第" + (i + 1) + "个员工职位:");
			String position = sc.next();
			e1.setPosition(position);

			e1.setSalary();
			
			list.add(e1);
			System.out.println();

		}
		sc.close();
		for (Employee employee : list) {
			System.out.println(employee.toString());
		}

	}
	/**
	 * 
	 * 请输入第1个员工姓名:
a
请输入第1个员工年龄:
12
当年龄无效时,默认为18
请输入第1个员工职位:
售后服务

请输入第2个员工姓名:
b
请输入第2个员工年龄:
28
请输入第2个员工职位:
销售员

请输入第3个员工姓名:
c
请输入第3个员工年龄:
12
当年龄无效时,默认为18
请输入第3个员工职位:
d
输入不符合要求,默认为售后服务

Employee [name=a, age=18, position=售后服务, salary=1000.0]
Employee [name=b, age=28, position=销售员, salary=2000.0]
Employee [name=c, age=18, position=售后服务, salary=1000.0]
	 */
}
/**
 * 13、将1000以内人民币的数字形式转换为人民币大写, 例如:调用18.5,将会返回字符串“壹拾捌圆伍角”;
 * 
 *
 */
public class ConvertChar {
	
	private static final char[] cnNumbers = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
	private static final char[] units = { '厘', '分', '角', '圆', '拾', '佰' };
	private boolean fullFormat = true;

	
	public String format(double d) {
		NumberFormat nf = new DecimalFormat("#.###");
		double d1 = Math.floor(d);
		if (d1 > 0.0 && d1 < 1000.0) {
			String original = String.valueOf(nf.format(d));
			return this.transform(original);

		}
		return "输入一个大于0小于999的数!";

	}

	public String format(Integer num) {
		return this.transform(String.valueOf(num));
	}

	private String transform(String original) {
		String integerPart = "";
		String floatPart = "";

		if (original.indexOf(".") > -1) {
			int dotIndex = original.indexOf(".");
			integerPart = original.substring(0, dotIndex);
			floatPart = original.substring(dotIndex + 1);
		} else {
			integerPart = original;
		}

		StringBuffer sb = new StringBuffer();

		// 整数部分
		for (int i = 0; i < integerPart.length(); i++) {
			int number = Integer.parseInt(String.valueOf(integerPart.charAt(i)));
			sb.append(cnNumbers[number]);
			if (fullFormat) {
				sb.append(units[integerPart.length() + 2 - i]);
			}
		}

		// 小数部分
		if (floatPart.length() >= 1) {
			for (int i = 0; i < floatPart.length(); i++) {
				int number = Integer.parseInt(String.valueOf(floatPart.charAt(i)));
				sb.append(cnNumbers[number]);
				if (i < 3) {
					sb.append(units[2 - i]);
				}
			}
		} else if (fullFormat) {
			sb.append('整');
		}

		return sb.toString();

	}

	public static void main(String[] args) {
		ConvertChar char1 = new ConvertChar();
		
			System.out.println("请输入一个大于0小于1000的数:");
			Scanner scanner = new Scanner(System.in);
			double d = scanner.nextDouble();
			System.out.println(char1.format(d));
			scanner.close();
		

	}
}

 

你可能感兴趣的:(MTime)