java学习之路 之 高级类特性2-关键字static、final、动态语句块结合的练习题

class Employee {
	
	static { // 随着的类的加载而执行, 且执行一次, 由JVM自动执行, 相当于类构造器
		System.out.println("static{}...静态语句块"); 
		//return;
		company = "BAIDU";
	}
	
	private static String company = "baidu"; // 静态属性, 类变量, 它的存在不需要对象,只需要类即可
	// 属性的声明语句和赋值语句是分别执行的, 先执行声明,开辟空间并写0, 后执行赋值操作, 赋值操作和静态代码块同级别
	
	static {
		System.out.println("static{}2...");
	}
	
	public static void setCompany(String company) {
		Employee.company = company;
	}
	
	public static String getCompany() {
		return company;
	}
	
	public static void test() {// 静态方法 类方法, 它的调用不需要对象,只需要通过类即可调用
		System.out.println("static test()...");
		// 在静态环境中this关键字被禁止
		// 也不能直接访问非静态成员, 因为非静态成员的存在依赖对象!!
		// 如果能过对象就可以访问了
		/*
		name = "李四";
		age = 40;
		salary = 4000;
		*/
		Employee emp = new Employee();
		System.out.println(emp);
		emp.name = "李四"; // 只有在同一个类中才可以直接访问私有属性
		emp.age = 40;
		emp.salary = 4000;
		System.out.println(emp);
	}
	
	private static int count = 0;
	
	{ // 动态语句块, 在创建对象时无条件执行一次!, 先于构造器执行
		System.out.println("动态语句块2");
		name = "xxx";
	}
	
	private final int ID; // 空final量, 危险!!! 必须保证对其进行一次赋值!!
	private String name = "XXX";
	private int age;
	private double salary;
	
	{ // 动态语句块, 在创建对象时无条件执行一次!, 先于构造器执行
		System.out.println("动态语句块1");
		this.ID = ++count; // 非静态环境中直接访问静态成员!!, 进行一次赋值
	}
	
	public Employee() {
	}
	
	public Employee(String name, int age, double salary) {
		this.name = name;
		this.age = age;
		this.salary = salary;
		System.out.println("Employee()...");
	}
	
	public Employee(String name, int age) {
		
	}
	
	/*
	public void setID(int ID) {
		this.ID = ID;
	}*/
	
	public int getID() {
		return ID;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	public double getSalary() {
		return salary;
	}
	
	@Override
	public String toString() {
		return "ID:" + ID + ",姓名:" + name + ",年龄:" + age + ",工资:" + salary;
	}
	
	
}

class EmployeeTest2 {
	public static void main(String[] args) {
		Employee.test(); // 类在第一次使用时加载, 调用test方法, 创建对象
	}
}

class EmployeeTest {
	public static void main(String[] args) {
		//System.out.println(Employee.company);
		System.out.println(Employee.getCompany());
		//Employee.company = "百度";
		Employee.setCompany("百度");
		//System.out.println(Employee.company);
		System.out.println(Employee.getCompany());
		Employee.test();
		
		Employee emp1 = new Employee("张三", 30, 3000);
		Employee emp2 = new Employee("张四", 40, 4000);
		Employee emp3 = new Employee("张五", 50, 5000);
		Employee emp4 = new Employee("张六", 60, 6000);
		System.out.println(emp1);
		System.out.println(emp2);
		System.out.println(emp3);
		System.out.println(emp4);
		Employee emp5 = new Employee();
		Employee emp6 = new Employee();
		System.out.println(emp5);
		System.out.println(emp6);
	}
}

class EmployeeSub extends Employee {}

class EmployeeSubTest {
	public static void main(String[] args) {
		System.out.println(EmployeeSub.getCompany());
	}
}
/*编写上衣Frock类,不继承任何父类。包含尺寸size、颜色color、价格price等属性 构造器,get/set
在上衣类Frock中覆盖toString方法,用来返回 frock的详细信息。
在Frock类中声明私有的静态属性currentNum,初始值为100000,作为衣服出厂的序列号起始值。
声明公有的静态方法getNextNum,作为生成上衣唯一序列号的方法。每调用一次,将currentNum增加100,并作为返回值。
*/

/*
	在Frock类中声明serialNumber属性,并提供对应的get方法;
	在Frock类的构造器中,通过调用getNextNum方法为Frock对象获取唯一序列号;
	在FrockTest 类的main方法中,分别创建三个Frock 对象,并打印三个对象的序列号,验证是否为按100递增。
*/

/*
	在Frock类中声明公有静态常量INCREMENT,值为100,修改静态方法getNextNum代码,用INCREMENT常量代替原有的增量值100。
	执行FrockTest类的main方法,验证修改是否正确。
	将Frock类中的serialNumber属性改为空final变量,并且仍然在构造器中为其赋值;
	为serialNumber增加公有的set方法,确认是否能够编译通过?
	去掉set方法,执行FrockTest 类的main方法,验证程序是否正确。
*/
public class Frock {
	
	public static final int INCREMENT; 
	
	private static int currentNum = 100000;
	
	static {
		INCREMENT = 100;
		currentNum = 150000;
	}
	
	public static int getNextNum() {
		return currentNum += INCREMENT;
	}
	
	private final int serialNumber;
	private int size;
	private String color;
	private double price;
	
	{
		this.serialNumber = getNextNum();
	}
	
	public Frock() {
	}
	
	public Frock(int size, String color, double price) {
		this.size = size;
		this.color = color;
		this.price = price;
	}
	
	public void setSize(int size) {
		this.size = size;
	}
	
	public int getSize() {
		return size;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setPrice(double price) {
		this.price = price;
	}
	
	public double getPrice() {
		return price;
	}
	
	@Override
	public String toString() {
		return "序列号:" + serialNumber + ",大小:" + size + ",颜色:" + color + ",价格:" + price;
	}
	
}
/*
在FrockTest 类的main方法中,分两次调用getNextNum方法,获取序列号并打印输出
*/
class FrockTest {
	
	public static void main(String[] args) {
		System.out.println(Frock.getNextNum());
		System.out.println(Frock.getNextNum());
		Frock f1 = new Frock(180, "白色", 200);
		Frock f2 = new Frock(170, "黑色", 100);
		Frock f3 = new Frock(185, "红色", 300);
		System.out.println(f1);
		System.out.println(f2);
		System.out.println(f3);
				
		Frock f4 = new Frock();
		System.out.println(f4);
	}
}

/*
编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,
定义封装这些属性的方法。账号要自动生成。
考虑:哪些属性可以设计成static属性。所有对象是否可以共享
*/
public class Account {
	
	static double interestRate = 0.045;
	static double minBalance = 99.9;
	static final int COUNT = 10;
	static int id = 1000;
	
	public static int getNextID() {//下一个id值被id + COUNT赋值并返回
		return id += COUNT;
	}
	
	private final int ID;
	private int password;
	private double balance;
	
	{
		ID = getNextID();//常量ID 被静态方法getNextID方法的返回值赋值
	}
	
	public Account() {}
	
	public Account(int password,double balance) {
		this.password = password;
		this.balance = balance;
	}
	
	public void setPassword(int password) {
		this.password = password;
	}
	
	public int getPassword() {
		return password;
	}
	
	public void setBalance(double balance) {
		this.balance = balance;
	}
	
	public double getBalance() {
		return balance;
	}
	
	@Override
	public String toString() {//重写String类的toString方法,返回Account对象的详细信息
		return "账号:" + ID + ",密码:" + password + ",存款余额:" + balance + 
			   ",利率:" + interestRate + ",最小余额:" + minBalance;
	}
}

class AccountTest {
	//编写主类,使用银行账户类,输入、输出3个储户的上述信息。
	public static void main(String[] args) {
		Account acc1 = new Account(1213,5000);
		Account acc2 = new Account(2331,6000);
		Account acc3 = new Account(1234,8000);
		System.out.println(acc1);
		System.out.println(acc2);
		System.out.println(acc3);
	}
}
/*
Device 设备
	ID (是常量,并且要求自动生成) 
	name
	factory
	price
*/
public class Device {
	
	static int id = 0;
	
	public static int getNextId() {
		return ++id;
	}
	
	private final int ID;
	private String name;
	private String factory;
	private double price;
	
	{
		ID = getNextId();
	}
	
	public Device() {}
	
	public Device(String name,String factory,int price) {
		this.name = name;
		this.factory = factory;
		this.price = price;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setFactory(String factory) {
		this.factory = factory;
	}
	
	public String getFactory() {
		return factory;
	}
	
	public void setPrice(double price) {
		this.price = price;
	}
	
	public double getPrice() {
		return price;
	}
	
	@Override
	public String toString() {
		return "编号:" + ID + ",名字:" + name + ",生产商:" + factory + ",价格:" + price + "元";
	}
}

public class InputDevice extends Device {
	
	private int speed;
	
	public InputDevice() {}
	
	public InputDevice(String name,String factory,int price,int speed) {
		super(name,factory,price);
		this.speed = speed;
	}
	
	@Override
	public String toString() {
		return super.toString() + ",速度:" + speed;
 	}
}

class Mouse extends InputDevice {
	
	private boolean wirless;
	
	public Mouse() {}
	
	public Mouse(String name,String factory,int price,int speed,boolean wirless) {
		super(name,factory,price,speed);
		this.wirless = wirless;
	}
	
	@Override
	public String toString() {
		return super.toString() + ",无线鼠标?" + (wirless ? "是" : "否");
 	}
}

class Keyboard extends InputDevice {
	
	private int keyCount;
	
	public Keyboard() {}
	
	public Keyboard(String name,String factory,int price,int speed,int keyCount) {
		super(name,factory,price,speed);
		this.keyCount = keyCount;
	}
	
	@Override
	public String toString() {
		return super.toString() + ",键盘按键数:" + keyCount;
 	}
}

public class OutputDevice extends Device {
	
	private String color;
	
	public OutputDevice() {}
	
	public OutputDevice(String name,String factory,int price,String color) {
		super(name,factory,price);
		this.color = color;
	}
	@Override
	public String toString() {
		return super.toString() + ",颜色:" + color;
 	}
}

class Monitor extends OutputDevice {
	
	private int size;
	
	public Monitor() {}
	
	public Monitor(String name,String factory,int price,String color,int size) {
		super(name,factory,price,color);
		this.size = size;
	}
	@Override
	public String toString() {
		return super.toString() + ",尺寸:" + size;
 	}
}

public class DeviceTest {
	//写一个测试类
	//创建一个数组, 保存2个鼠标,1个键盘,2个显示器 
	public static void main(String[] args) {
		Device[] des = new Device[5];
		//public Mouse(String name,String factory,int price,int speed,boolean wirless)
		des[0] = new Mouse("普通鼠标","DELL",120,35,false);
		des[1] = new Mouse("机械鼠标","雷蛇",200,40,true);
		//public Keyboard(String name,String factory,int price,int speed,int keyCount)
		des[2] = new Keyboard("键盘","DELL",180,40,85);
		//public Monitor(String name,String factory,int price,String color,int size)
		des[3] = new Monitor("普通显示屏","DELL",160,"黑色",15);
		des[4] = new Monitor("液晶显示屏","惠普",190,"白色",21);
		//遍历输出Device对象的详细信息
		for (Device de : des) {
			System.out.println(de);
		}
		System.out.println("----------------------------按照价格排序后---------------------");
		//冒泡排序des数组
		for (int i = 0;i < des.length - 1;i++) {
			for (int j = 0;j < des.length - 1 - i;j++) {
				if (des[j].getPrice() > des[j + 1].getPrice()) {
					Device tmp = des[j];
					des[j] = des[j + 1];
					des[j + 1] = tmp;
				}
			}
		}
		//遍历输出Device对象的详细信息
		for (Device de : des) {
			System.out.println(de);
		}
	}
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一篇 基础篇 第0章 JDK安装和最简单的环境变量配置方法 第1章 Java基础概念 一、 Java基础语法 1、Helloworld.java 2、标识符 3、关键字 4、常量 5、变量 6、语句 6.1 if语句和switch语句 6.1.2 if语句举例 6.1.3 switch语句 6.2 for循环语句 6.3 while语句和do-while语句 6.3.1 while语句形式 6.3.2 do-while语句 6.3.3 while语句和do-while语句举例 6.4 break语句和continue语句 6.4.1 break语句 6.4.2 continue语句 二、和对象 1、面向对象基础 1.1 面向对象程序设计入门分析 1.2 抽象 1.3 封装 2、 2.1 头 2.2体 2.3 创建对象 2.4 面向对象举例 2.5 构造函数 2.5.1 构造函数的一般概念 2.5.2 创建自己的构造函数 2.5.3 构造方法注意事项 2.5.4构造函数的作用 3、方法 3.1 方法介绍 3.2方法定义 3.3调用方法 3.4 方法举例 4、访问控制符 5、this关键字 5.1 this方法应用举例 6. Static关键字 6.1 static应用举例 7. super关键字 7.1 super应用举例 8. abstract关键字 9. final关键字 9.1 final介绍 9.2 final使用注意事项 三、继承 1、继承的概念 1.1 继承的定义 1.2 继承举例 1.3 父和子 继承 2.1 方法继承 2.2 方法覆盖 2.3 方法重载 3、多态与动态绑定 3.1 多态分为两种 3.2 调用一个对象方法的机制 3.3 方法调用举例 4、构造函数的重载 4.1 默认字段初始化 4.2 默认构造函数 4.3 显式字段初始化 4.4 构造函数被调用后的详细执行过程 5、包 5.1 创建包 5.2 创建可复用的步骤简要说明 5.3 包的导入 5.4 包的可见性 接口 6.1 接口的概念 6.2 接口的声明 6.3 接口的实现 四、IO流及异常处理 1、流和文件 1.1 流 1.2 文件 2、常用流 2.1 字节流 2.1.1 InputStream(输入流) 2.1.2 OutputStream(输出流) 2.1.3 FileInputStream(文件输入流) 2.1.4 FileOutputStream(文件输出流) 2.1.5 BufferedInputStream(缓冲输入流) 2.1.6 BufferedOutputStream(缓冲输出流) 2.1.7 PrintStream(打印流) 2.2字符流 2.2.1 Reader 2.2.2 Writer 2.2.3 FileReader 2.2.4 FileWriter 2.2.5 CharArrayReader 2.2.6 CharArrayWriter 2.2.7 BufferedReader 2.2.8 BufferedWriter 2.2.9 PrintWriter 2.2.10 System.in对象和System.out对象 文件处理 3.1 创建或打开、关闭文件对象 3.2 关闭文件 3.3 read()方法 3.4 write()方法 3.5 其他操作文件的方法 4、Java异常处理 4.1 Java异常概念 4.2 异常型 4.3 Java的内置异常 4.4 Java异常举例 4.5 异常的捕获和处理 4.6 异常抛出 4.6.1 throw语句 4.6.2 throws语句 4.6.3 finally语句 4.7 自定义异常 4.8 异常应用的其他问题 4.9 异常应用举例 五、线程 1、线程的概念 1.1 程序、进程与线程 1.2 线程调度与优先级 1.3 线程的状态与生命周期 1.4 控制一个线程生命周期最常用的方法 2、线程的创建和启动 3、线程的同步与死锁 3.1 同步的概念 3.2 线程同步举例 3.3 线程死锁 六、GUI 1、图形用户界面概述 1.1 组件 1.2容器 1.3 AWT组件 1.4 Swing组件 1.5 组件与容器的关系 1.6 swing常用组件 2、Swing常用组件 2.1文本组件 2.2 标签 2.3 按钮 2.4单选按钮组件 2.5 复选框组件 2.6列表框组件 2.7组合框组件 2.8滑组件 事件处理 3.1 事件处理原理 3.2 事件架构 3.3 焦点事件 3.4 键盘事件 3.5 鼠标事件 4、布局设计 4.1 FlowLayout流布局 4.2 BorderLayout边界布局 4.3 CardLayout卡式布局 4.4 GridLayout卡式布局 4.5 GridBagLayout卡式布局 4.6 BoxLayout盒式布局 5、菜单步骤 6、对话框设计 6.1 JOptionPane对话框 6.2 JDialog对话框 文字与图形处理 7.1 文本和字体 7.2 简单图形绘制 7.3 颜色 7.4 图像处理 七、网络 1、Java网络编程简介 1.1 IP网间协议 1.2 TCP传输控制协议 1.3 UDP用户数据包协议 2、URL连接 2.1 URL 2.2 Java.net包中URL定义 2.3 创建URL对象 2.4 Java.net包中URLConnection 2.5 AppletContext接口 2.6 获取网络属性信息 2.7 创建输入流(InputStream)对象 3、SOCKET连接 3.1 Socket通信的一般结构 3.2 TCP Socket编程 3.2.1 Socket 3.2.2 ServerSocket 3.3 UDP Socket编程 八、Java概念疑难解答 第2章 Java经典练习题 2.1 斐波那契数列 2.2 判断素数 2.3 水仙花数 2.4 分解质因数 2.5 杨辉三角 2.6 学习成绩查询 2.7 求最大公约数与最小公倍数 2.8 完全平方数 2.9 统计字母、空格、数字和其它字符个数 2.10 求主对角线之和 2.11 完数求解 2.12 求s=a+aa+aaa+aaaa+aa...a的值 2.13 高度计算 2.14 乘法口诀 2.15 无重复三位数 2.16 菱形打印 2.17 利润计算 2.18 第几天判断 2.19 从小到大输出数列 2.20 猴子吃桃问题 2.21 乒乓球比赛 2.22 求分数之和 2.23 求阶乘的和 2.24 递归求法 2.25 求不多于5的正整数 2.26 回文判断 2.27 星期判断 2.28 插数入数组 2.29 取整数的任意位 2.30 按顺序输出数列 2.31 位置替换 2.32 字符串排序 2.33 贷款器 2.34 通讯录排序 2.35 闰年判断 2.36 二元方程求解 2.37 密码解译 2.38 DVD查询 2.39 电子日历 2.40 万年历 第二篇 提高篇 第3章 Java常用算法 3.1递归算法 3.2冒泡排序算法 3.3 快速排序算法 3.4选择排序算法 3.5直接插入算法 3.6希尔排序算法 3.7 二分查找算法 3.8 二叉树 3.9 图的实现 3.10 生产者消费者的实现 3.11 银行家算法 3.12 KMP算法 3.13 RSA的实现 第4章 IO流实例开发 4.1流到底怎样输入和输出扯淡区 4.2 FileInputStream的应用 4.3 FileOutputStream的应用 4.4 FileReader的应用 4.5 FileWriter的应用 4.6 BufferedInputStream的应用 4.7 BufferedOutputStream的应用 4.8 BufferedReader的应用 4.9 BufferedWriter的应用 第5章 Java图形界面开发 5.1 开发自己的控件 5.2 控件的排布示例 5.3 开发自己的QQ聊天系统 5.4 颜色选择器 5.5 按钮测试 5.6 密码验证器 5.7 绘制自己的坐标 5.8 多种字体显示 5.9 窗口风格选择器 5.10 右键菜单 5.11 树形关系网 5.12 开发自己的文本编辑器 5.13 开发自己的剪切板 5.14 文本拖动效果演示 5.15 怎样拖动图片 5.16 开发自己的数字时钟 5.17 数字动画 5.18 滑杆调试器 5.19 启动程序开发 5.20 开发自己的调色板 5.21 文件选择器 5.22 丰富多彩的光标选择器 5.23 开发自己的浏览器 5.24 文字抖动效果演示 5.25 文字阴影效果演示 5.26 3D文字效果演示 5.27 波浪文字效果演示 5.28 飞行文字效果演示 5.29 伸展文字效果演示 5.30 开发自己的网页图片 5.31 火焰图片效果演示 5.32 图片百叶窗效果演示 5.33 图片倒影效果演示 5.34 怎样翻转图片 5.35 开发自己的闹钟 5.36 应用自己的万年历 5.37 开发自己的计算器 5.38 开发自己的电子相册 第6章 Java游戏 6.1 俄罗斯方 6.2 连连看游戏 6.3 迷宫 6.4 模拟闪电 6.5 扫雷 6.6 贪食蛇 6.7 围棋 6.8 五子棋 6.9 人机猜拳游戏 第三篇 实战篇 第7章 项目开发 7.1 开发自己的浏览器 7.2 开发自己的象棋游戏 7.3 网络主机线程扫描与端口控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值