java基础-day14、day15

static关键字

java基础-day14、day15_第1张图片
开发中,如何确定一个属性是否要声明为static的?
所有对象共用的属性,可声明为static。
开发中,如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为static的;工具类中的方法习惯上声明为static的,比如Math、Arrays、Collections…

即:static与类共存亡

package com.chb.day13;
/*
 * 编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,
 * 定义封装这些属性的方法。账号要自动生成。
	编写主类,使用银行账户类,输入、输出3个储户的上述信息。
	考虑:哪些属性可以设计成static属性。

 * 
 * 
 */
public class Account {
	
	private int id;
	private String pwd = "000000";
	private double balance;
	
	private static double interestRate;
	private static double minMoney = 1.0;
	private static int init = 1001;//用于自动生成id使用的
	
	public Account(){
		id = init++;
	}
	
	public Account(String pwd,double balance){
		id = init++;
		this.pwd = pwd;
		this.balance = balance;
	}
	
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public static double getInterestRate() {
		return interestRate;
	}
	public static void setInterestRate(double interestRate) {
		Account.interestRate = interestRate;
	}
	public static double getMinMoney() {
		return minMoney;
	}
	public static void setMinMoney(double minMoney) {
		Account.minMoney = minMoney;
	}
	public int getId() {
		return id;
	}
	public double getBalance() {
		return balance;
	}

	@Override
	public String toString() {
		return "Account [id=" + id + ", pwd=" + pwd + ", balance=" + balance + "]";
	}
	
}

package com.chb.day13;

public class AccountTest {
	
	public static void main(String[] args) {
		
		Account acct1 =  new Account();
		Account acct2 =  new Account("qwerty",2000);
		
		Account.setInterestRate(0.012);
		Account.setMinMoney(100);
		
		System.out.println(acct1);
		System.out.println(acct2);
		
		System.out.println(acct1.getInterestRate());
		System.out.println(acct1.getMinMoney());
	}
	
}


运行结果:
java基础-day14、day15_第2张图片
java基础-day14、day15_第3张图片
java基础-day14、day15_第4张图片
java基础-day14、day15_第5张图片
区分懒汉式和饿汉式:
饿汉式:上来先创建一个对象;
懒汉式:对象什么时候用什么时候造

java基础-day14、day15_第6张图片
java基础-day14、day15_第7张图片

main方法的使用

java基础-day14、day15_第8张图片
*找不到或无法加载到主类====》原因可能是包名有问题,需要删除*

代码块:

java基础-day14、day15_第9张图片
java基础-day14、day15_第10张图片

final关键字

java基础-day14、day15_第11张图片

public class maintest {
	public final int A=10;//方式一:声明时赋值
	
	public final int B;
	{
		B=2;//方式二:代码块中赋值
	}
	
	public final int C;
	public maintest() {//方式三:构造器中赋值
		C=3;
	}
	
}

final修饰局部变量(特别是形参时),此时的变量(形参)就是一个常量,一旦复制之后就不能进行修改。
在这里插入图片描述

属性赋值的位置及先后顺序
1.默认初始化
2.显示初始化、代买块中初始化
3.构造器中初始化
4.通过对象.属性或对象.方法赋值

抽象类和抽象方法

java基础-day14、day15_第12张图片
java基础-day14、day15_第13张图片

package com.chb.day15;
/*
 * abstract关键字的使用
 * 1.abstract:抽象的
 * 2.abstract可以用来修饰的结构:类、方法
 * 
 * 3. abstract修饰类:抽象类
 * 		> 此类不能实例化
 *      > 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
 *      > 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
 * 
 * 
 * 4. abstract修饰方法:抽象方法
 * 		> 抽象方法只有方法的声明,没有方法体
 * 		> 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
 *      > 若子类重写了父类中的所有的抽象方法后,此子类方可实例化
 *        若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
 *       
 * abstract使用上的注意点:
 * 1.abstract不能用来修饰:属性、构造器等结构
 * 2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类
 */
public class AbstractTest {
	public static void main(String[] args) {
		// Person p=new Person();
	}
}
abstract class Creature{
	public abstract void breath();
}
abstract class Person extends Creature{
	String name;
	int age;

	public Person() {

	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	// 抽象方法
	public abstract void eat();

	public void walk() {
		System.out.println("人走路");
	}
}
class Student extends Person{

	@Override
	public void eat() {
		System.out.println("学生多吃有营养的食物");
	}

	@Override
	public void breath() {
		System.out.println("学生应该呼吸新鲜的没有雾霾的空气");
	}
	
}

抽象类的匿名子类

/*
 * 抽象类的匿名子类
 * 
 */
public class PersonTest {
	
	public static void main(String[] args) {
		
		method(new Student());//匿名对象
		
		Worker worker = new Worker();
		method1(worker);//非匿名的类非匿名的对象
		
		method1(new Worker());//非匿名的类匿名的对象
		
		System.out.println("********************");
		
		//创建了一匿名子类的对象:p
		Person p = new Person(){

			@Override
			public void eat() {
				System.out.println("吃东西");
			}

			@Override
			public void breath() {
				System.out.println("好好呼吸");
			}
			
		};
		
		method1(p);
		System.out.println("********************");
		//创建匿名子类的匿名对象
		method1(new Person(){
			@Override
			public void eat() {
				System.out.println("吃好吃东西");
			}

			@Override
			public void breath() {
				System.out.println("好好呼吸新鲜空气");
			}
		});
	}
	
	
	public static void method1(Person p){
		p.eat();
		p.breath();
	}
	
	public static void method(Student s){
		
	}
}

class Worker extends Person{

	@Override
	public void eat() {
	}

	@Override
	public void breath() {
	}
	
}

java基础-day14、day15_第14张图片

/*
 * 抽象类的应用:模板方法的设计模式
 * 
 */
public class TemplateTest {
	public static void main(String[] args) {
		
		SubTemplate t = new SubTemplate();
		
		t.spendTime();
	}
}

abstract class Template{
	
	//计算某段代码执行所需要花费的时间
	public void spendTime(){
		
		long start = System.currentTimeMillis();
		
		this.code();//不确定的部分、易变的部分
		
		long end = System.currentTimeMillis();
		
		System.out.println("花费的时间为:" + (end - start));
		
	}
	
	public abstract void code();
	
	
}

class SubTemplate extends Template{

	@Override
	public void code() {
		
		for(int i = 2;i <= 1000;i++){
			boolean isFlag = true;
			for(int j = 2;j <= Math.sqrt(i);j++){
				
				if(i % j == 0){
					isFlag = false;
					break;
				}
			}
			if(isFlag){
				System.out.println(i);
			}
		}

	}
	
}

java基础-day14、day15_第15张图片
java基础-day14、day15_第16张图片
java基础-day14、day15_第17张图片

package com.chb.day15;
/*
 * 定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;
abstract方法earnings();
toString()方法输出对象的name,number和birthday。
 * 
 */
public abstract class Employee {
	private String name;
	private int number;
	private MyDate birthday;
	
	public abstract double earnings();

	public Employee(String name, int number, MyDate birthday) {
		super();
		this.name = name;
		this.number = number;
		this.birthday = birthday;
	}

	public String getName() {
		return name;
	}

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

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public MyDate getBirthday() {
		return birthday;
	}

	public void setBirthday(MyDate birthday) {
		this.birthday = birthday;
	}

	@Override
	public String toString() {
		return "name=" + name + ", number=" + number + ", birthday=" + birthday.toDateString();
	}

	
	
	
}

package com.chb.day15;
/*
 * MyDate类包含:
private成员变量year,month,day ;
toDateString()方法返回日期对应的字符串:xxxx年xx月xx日

 */
public class MyDate {
	private int year;
	private int month;
	private int day;
	
	
	public MyDate(int year, int month, int day) {
		super();
		this.year = year;
		this.month = month;
		this.day = day;
	}


	public int getYear() {
		return year;
	}


	public void setYear(int year) {
		this.year = year;
	}


	public int getMonth() {
		return month;
	}


	public void setMonth(int month) {
		this.month = month;
	}


	public int getDay() {
		return day;
	}


	public void setDay(int day) {
		this.day = day;
	}


	public String toDateString() {
		return year+"年"+month+"月"+day+"日";
	}


}

package com.chb.day15;
/*
 * 定义SalariedEmployee类继承Employee类,
 * 实现按月计算工资的员工处理。该类包括:private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;
toString()方法输出员工类型信息及员工的name,number,birthday。
 */
public class SalariedEmployee extends Employee {
	private double monthlySalary;//月工资
	
	public SalariedEmployee(String name, int number, MyDate birthday) {
		super(name, number, birthday);
	}
	

	public SalariedEmployee(String name, int number, MyDate birthday, double monthlySalary) {
		super(name, number, birthday);
		this.monthlySalary = monthlySalary;
	}



	@Override
	public double earnings() {
		return monthlySalary;
	}

	public double getMonthlySalary() {
		return monthlySalary;
	}

	public void setMonthlySalary(double monthlySalary) {
		this.monthlySalary = monthlySalary;
	}

	@Override
	public String toString() {
		return "SalariedEmployee ["+super.toString() + "]";
	}

	
}

package com.chb.day15;
/*
 * 参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;
toString()方法输出员工类型信息及员工的name,number,birthday。

 */
public class HourlyEmployee extends Employee{
	private int wage;//每小时的工资
	private int hour;//月工作的小时数
	public HourlyEmployee(String name, int number, MyDate birthday) {
		super(name, number, birthday);
	}
	

	public HourlyEmployee(String name, int number, MyDate birthday, int wage, int hour) {
		super(name, number, birthday);
		this.wage = wage;
		this.hour = hour;
	}


	@Override
	public double earnings() {
		return wage * hour;
	}

	public int getWage() {
		return wage;
	}

	public void setWage(int wage) {
		this.wage = wage;
	}

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		this.hour = hour;
	}

	@Override
	public String toString() {
		return "HourlyEmployee[" + super.toString() + "]"; 
	}

	
}

package com.chb.day15;

import java.util.Calendar;
import java.util.Scanner;

/*
 * 定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。
 * 利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday。
 * 当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息。

 */
public class PayrollSystem {
	public static void main(String[] args) {
		// 方式一:
//		Scanner scanner = new Scanner(System.in);
//		System.out.println("请输入当月的月份:");
//		int month = scanner.nextInt();

		// 方式二:
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(Calendar.MONTH);// 获取当前的月份
//				System.out.println(month);//一月份:0

		Employee[] emps = new Employee[2];
		emps[0] = new SalariedEmployee("马森", 1002, new MyDate(1992, 2, 28), 10000);
		emps[1] = new HourlyEmployee("潘雨生", 2001, new MyDate(1991, 11, 6), 60, 240);
		for (int i = 0; i < emps.length; i++) {
			System.out.println(emps[i]);
			double salary = emps[i].earnings();
			System.out.println("月工资为:" + salary);
			if ((month + 1) == emps[i].getBirthday().getMonth()) {
				System.out.println("生日快乐!奖励100元");
			}
		}
	}
}

运行结果:
java基础-day14、day15_第18张图片

接口

java基础-day14、day15_第19张图片
java基础-day14、day15_第20张图片

package com.chb.day15;

/*
 * 接口的使用
 * 1.接口使用interface来定义
 * 2.Java中,接口和类是并列的两个结构
 * 3.如何定义接口:定义接口中的成员
 * 		
 * 		3.1 JDK7及以前:只能定义全局常量和抽象方法
 * 			>全局常量:public static final的.但是书写时,可以省略不写
 * 			>抽象方法:public abstract的
 * 			
 * 		3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
 * 
 * 4. 接口中不能定义构造器的!意味着接口不可以实例化
 * 
 * 5. Java开发中,接口通过让类去实现(implements)的方式来使用.
 *    如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
 *    如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
 *    
 * 6. Java类可以实现多个接口   --->弥补了Java单继承性的局限性
 *   格式:class AA extends BB implements CC,DD,EE
 *   
 * 7. 接口与接口之间可以继承,而且可以多继承
 * 
 * *******************************
 * 8. 接口的具体使用,体现多态性
 * 9. 接口,实际上可以看做是一种规范
 * 
 * 面试题:抽象类与接口有哪些异同?
 * 
 */
public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println(Flyable.MAX_SPEED);
		System.out.println(Flyable.MIN_SPEED);
//		Flyable.MIN_SPEED = 2;
		Plane p=new Plane();
		p.fly();
	}
}

interface Flyable {
	public static final int MAX_SPEED = 7900;// 第一宇宙速度
	int MIN_SPEED = 1;// 省略了public static final

	// 抽象方法
	public abstract void fly();

	// 省略了public abstract
	void stop();

	// Interfaces cannot have constructors
//	public Flyable() {
//		
//	}
}

interface Attackable {
	void attack();
}

class Plane implements Flyable {

	@Override
	public void fly() {
		System.out.println("通过引擎起飞");

	}

	@Override
	public void stop() {

		System.out.println("驾驶员减速停止");
	}

}
class Bullet extends Object implements Flyable,Attackable,CC{

	@Override
	public void method1() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void method2() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void stop() {
		// TODO Auto-generated method stub
		
	}
}
interface AA{
	void method1();
}
interface BB{
	
	void method2();
}

interface CC extends AA,BB{
	
}

java基础-day14、day15_第21张图片
java基础-day14、day15_第22张图片

package com.chb.day15;
/*
 * 接口的应用:代理模式(就是一个中介)
 * 
 */
public class NetWorkTest {
	public static void main(String[] args) {
		Server server = new Server();
		ProxyServer proxyServer = new ProxyServer(server);
		proxyServer.browse();
	}
}
interface NetWork{
	
	public void browse();
	
}

//被代理类
class Server implements NetWork{

	@Override
	public void browse() {
		System.out.println("真实的服务器访问网络");
	}

}
//代理类
class ProxyServer implements NetWork{
	
	private NetWork work;
	
	public ProxyServer(NetWork work){
		this.work = work;
	}
	

	public void check(){
		System.out.println("联网之前的检查工作");
	}
	
	@Override
	public void browse() {
		check();
		
		work.browse();
		
	}
	
}

再比如

public class StaticProxyTest {

	public static void main(String[] args) {
		Proxy s = new Proxy(new RealStar());
		s.confer();
		s.signContract();
		s.bookTicket();
		s.sing();
		s.collectMoney();
	}
}

interface Star {
	void confer();// 面谈

	void signContract();// 签合同

	void bookTicket();// 订票

	void sing();// 唱歌

	void collectMoney();// 收钱
}
//被代理类
class RealStar implements Star {

	public void confer() {
	}

	public void signContract() {
	}

	public void bookTicket() {
	}

	public void sing() {
		System.out.println("明星:歌唱~~~");
	}

	public void collectMoney() {
	}
}

//代理类
class Proxy implements Star {
	private Star real;

	public Proxy(Star real) {
		this.real = real;
	}

	public void confer() {
		System.out.println("经纪人面谈");
	}

	public void signContract() {
		System.out.println("经纪人签合同");
	}

	public void bookTicket() {
		System.out.println("经纪人订票");
	}

	public void sing() {
		real.sing();
	}

	public void collectMoney() {
		System.out.println("经纪人收钱");
	}
}

java基础-day14、day15_第23张图片
在这里插入图片描述
在这里插入图片描述
java基础-day14、day15_第24张图片
java基础-day14、day15_第25张图片
java基础-day14、day15_第26张图片
java基础-day14、day15_第27张图片
java基础-day14、day15_第28张图片
3 工厂方法模式
java基础-day14、day15_第29张图片
java基础-day14、day15_第30张图片
java基础-day14、day15_第31张图片
java基础-day14、day15_第32张图片

java基础-day14、day15_第33张图片

类的内部成员之五: 内部类

java基础-day14、day15_第34张图片
java基础-day14、day15_第35张图片

java基础-day14、day15_第36张图片

package com.chb.day15;

/*
 * 类的内部成员之五:内部类
 * 1. Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
 * 
 * 2.内部类的分类:成员内部类(静态、非静态)  vs 局部内部类(方法内、代码块内、构造器内)
 * 
 * 3.成员内部类:
 * 		一方面,作为外部类的成员:
 * 			>调用外部类的结构
 * 			>可以被static修饰
 * 			>可以被4种不同的权限修饰
 * 
 * 		另一方面,作为一个类:
 * 			> 类内可以定义属性、方法、构造器等
 * 			> 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
 * 			> 可以被abstract修饰
 * 
 * 
 * 4.关注如下的3个问题
 *   4.1 如何实例化成员内部类的对象
 *   4.2 如何在成员内部类中区分调用外部类的结构
 *   4.3 开发中局部内部类的使用  见《InnerClassTest1.java》
 * 
 */
public class InnerClassTest {
	public static void main(String[] args) {
		// 创建Dog实例(静态的成员内部类):
		Person1.Dog dog = new Person1.Dog();
		dog.show();

		// 创建Bird实例(非静态的成员内部类):
		// Person1.Bird bird = new Person1.Bird();//错误的,必须先创建外部类的对象
		Person1 p = new Person1();
		Person1.Bird bird = p.new Bird();
		bird.sing();
	}
}

class Person1 {
	String name = "小明";
	int age;

	public void eat() {
		System.out.println("人:吃饭");
	}

	// 静态成员内部类
	static class Dog {
		String name;
		int age;

		public void show() {
			System.out.println("卡拉是条狗");
//				eat();
		}

	}

	// 非静态成员内部类
	class Bird {
		String name = "杜鹃";

		public Bird() {

		}

		public void sing() {
			System.out.println("我是一只小小鸟");
			Person1.this.eat();// 调用外部类的非静态属性
			eat();
			System.out.println(age);
		}

		public void display(String name) {
			System.out.println(name);// 方法的形参
			System.out.println(this.name);// 内部类的属性
			System.out.println(Person1.this.name);// 外部类的属性
		}
	}

	public void method() {
		// 局部内部类
		class AA {

		}
	}

	{
		// 局部内部类
		class BB {

		}
	}

	public Person1() {
		// 局部内部类
		class CC {

		}
	}

}

java基础-day14、day15_第37张图片
java基础-day14、day15_第38张图片

package com.chb.day15;

public class InnerClassTest1 {

	// 开发中很少见
	public void method() {
		// 局部内部类
		class AA {

		}
	}

	// 常见的是线面这种,返回一个实现了Comparable接口的类的对象
	public Comparable getComparable() {

		// 创建一个实现了Comparable接口的类:局部内部类
		// 方式一:
//		class MyComparable implements Comparable{
//
//			@Override
//			public int compareTo(Object o) {
//				return 0;
//			}
//			
//		}
//		
//		return new MyComparable();

		// 方式二:
		return new Comparable() {

			@Override
			public int compareTo(Object o) {
				return 0;
			}

		};

	}
}

你可能感兴趣的:(JavaSE基础)