在前面我们学习java中类和对象的关系也了解类的编写,现在我们要实现统计员工人数?要解决这个问题我们就要明白:当我们创建了一个对象时,这个对象就具有自己的字段,也就是说字段是属于对象的,现在要实现统计人数,需要一个公共的字段,那在这里就需要用到静态字段。
静态字段声明:
private static int count=0;
在构造方法中实现coun+1。
public Employee{
count++;
}
public Employee(String name, doublesalary, int year, int month, int day) {
this.name = name;
this.salary =salary;
GregorianCalendar calendar = new GregorianCalendar(year,month - 1, day);
this.hireDay = calendar.getTime();
count++;
}
当需要显示count值需要添加静态方法.
public static void getCount(){
return count;
}
静态方法是一种不能向对象实施操作的方法。由于静态方法不能操作对象,所以静态方法不能访问字段,同时静态方法不能使用this参数。调用静态是由类名来调用。
//调用形式:类名.静态方法名
System.out.println(Employee.getCount());
静态常量:静态变量使用较少,但静态常量使用较多,比如Math中PI和System中out都是静态常量。
//静态常量
public class Math{
public static final double PI = 3.1415926;
}
包是组织类的方式,为了避免类名的重复。标准java类库分布在不同的包中,包括:java.lang、java.util、java.io、java.sql和java.net。java程序默认导入的包是lang包,具体的包在后面的实训笔记中讲解。自定义包是用package,放在源文件的开发,定义类之前。
package com.java.ch2;
public class Employee{
}
在使用包时通过import方式导入。
在前面有一个雇员类,我们都知道一个公司的雇员一般要分为经理和普通员工,这两种都是雇员,那我们要实现这种结构,就需要用到继承,继承就是“是”的关系,不是是的关系不能写成继承。在java通过extends关键字表示继承。
//在这里Employee就称为超类、父类,Manager称为子类,派生类
public class Manager extends Employee{
}
在设计类时,把通用的方法放在基类中,特殊用途的方法放在子类。
由于Manager继承Employee的特性,在创建对象要指定父类中的字段值,父类中的字段值是private,不能直接访问和继承,在这里就通过super来调用父类的构造方法来实现向父类的构造方法传值。如果子类的构造方法没有显示的调用父类构造方法,则将自动的调用父类默认的构造方法,如果父类没有不带参数的构造方法,并且在子类的构造方法中有没有显示的调用父类的构造方法,编译器则报错。
//在这里Employee就称为超类、父类,Manager称为子类,派生类
public class Manager extends Employee{
private double bonus;
public Manager(String n,double s,int y,int m,int d,double bonus){
super(n,s,y,m,d);
this.bonus = bonus;
}
}
现在如果要得到经理类的薪水,在经理的薪水就是基本工资加上奖金。那这个时候我们就需要对父类getSalary方法进行重新实现,这种就叫覆盖。在实现的过程,就需要调用父类的getSalary方法,这个时候就弄不清楚到底是调用哪个类的getSalary,解决这个问题就要使用super关键字,可以调用父类的方法。
public class Manager extends Employee{
double baseSalary = super.getSalary();
return baseSalary+bonus;
}
一个对象变量可以引用多种实际类型的现象被称为多态,意思就是一个父类的变量可以应用一个父类的对象,也可以引用一个子类的对象,然而不能将一个超类的引用赋给子类变量。在运行时能够自动地选择调用哪个方法的现象被称为动态绑定。这个的意思就是说调用的方法取决创建是哪个类的对象,如果创建父类的对象就调用父类的对象,如果创建子类的对象就调用子类的对象。
Employee e = new Employee("张飞", 10000, 182, 3, 7);
Employee boss = new Manager("张飞", 10000, 182, 3, 7,200);
如果类中使用final作为修饰,那表示类不能继承, final修饰方法,那表示方法不能被覆盖,final修饰字段表示常量。
在我们在设计类往往存在很通用的类,比如学生是一个人,员工也是一个人,在这个里面都有一个描述的方法,在人里面是用来表述一个人,但是没有办法给出具体的实现,那这个时候就要把这个方法写成抽象方法,抽象方法所在类必是抽象类,抽象类中可以有其他方法和字段。类中如果不含抽象方法,也可以写成抽象类。
abstract class Person{
public Person(String n){
this.name = n;
}
Public abstract String getDesc();
Public String getName(){
Return this.name;
}
}
public class Student extendsPerson{
Public Student(String n,String m){
Super(n);
this.major = m;
}
Public String getDesc(){
Return “major”+major;
}
Private String major;
}
在这里我们来实现一个果园的例子,来详细讲解抽象类和接口的使用。
实现:模拟一个生长着橘子和苹果的果园,在水果熟了以后通过工人采摘得到相应的水果。
通过题目分析得知,需要橘子类、苹果类、水果类、工人类。
//Fruit.java
//父类水果类,在这里定义了一个抽象方法作为示例,表示生长
public abstract class Fruit{
public abstract void growth();
}
//Apple.java
//子类苹果类,实现了生长方法
public class Apple extends Fruit
public void growth(){
System.out.println(“苹果在生长”);
}
}
//Orange.java
//子类橘子类,实现了生长方法
public class Orange extends Fruit{
public void growth(){
System.out.println(“橘子在生长”);
}
}
//Worker.java
//工人类,实现采摘,通过名称作为参数来得到水果
public class Worker {
public static Fruit harvest(String name){
if(“apple”.equals(name)){
return new Apple();
}else if(“arange”.equals(name)){
return new Orange();
}else{
return null;
}
}
}
//FruitTest.java
public class FruitTest {
public static void main(String []args){
Fruit fruit = Worker.harvest(“apple”);
If(fruit!=null)fruit.growth();
}
}
这个例子把我们刚刚前面学的东西都系统的结合集合,好好琢磨这个例子,有很多的东西在这里。
接口是用来描述类具有什么功能,而并不是给出每个功能的具体实现。一个类可以实现一个或多个接口。接口中的所有方法自动是public,在声明方法时可以不用提供public关键字。
public interface Comparable{
int compareTo(Object other);
}
实现接口是通过implements
public Employee implements Comparable{
public int compareTo(Object other){
Employee other= (Employee)other;
if(salary
return -1;
}
if(salary >other.salary){
return 1;
}
Return 0;
}
}
接口不能new来实例化,但是可以创建接口变量,可以引用实现接口的类的对象。接口不能含有字段和静态方法,但可以包含常量。
使用接口改写我们前面的果园的例子,请大家自行改写,我就不列出详细代码。
在这里也就明确了接口与抽象类的区别,请大家认真看我笔记,自行总结。
在前面所写的例子都是基于控制台的程序,现在我们就开始进入到基于图像界面的程序,在学习java图像界面的时候,我们会把输入/输出、集合、JDBC的操作都融入到swing。那我们为什么要学习swing啦,学习swing,我们主要学习的是思想,解决问题的方法。
在使用swing时,我们需要使用的包:javax.swing包,明确了我们所要导入的包,那下面就要学习创建界面的步骤:
1、 创建窗体:创建窗体使用的是JFrame类,创建窗体有两种方法:
//方法一:直接对JFrame实例化
JFrame myframe = new JFrame();
//方法二:自定义一个类让他继承JFrame
public class MyFrame extends JFrame{
}
2、 设置布局:布局决定着控件放在窗体中的位置,如果不设定布局就直接添加控件,采用窗体的默认布局,就是边界布局,边界布局的特点:控件排在东西南北中,默认在中间。如果要改变布局就要使用setLayout方法。
//设置流式布局,流式布局从左到右,从上到下
public class MyFrame extends JFrame{
public MyFrame(){
this.setLayout(newFlowLayout());
}
}
//设置空布局,自己设定位置,在这里创建了一个上面有ok的按钮,放在窗体的地方:距离左边0像素,//上边0像素,按钮的宽度50px,高度30像素
public class MyFrame extends JFrame{
public MyFrame(){
this.setLayout(null);
JButton btnOk =new JButton(“Ok”);
btnOk.setBounds(0,0,50,30);
}
}
3、 添加控件:在jdk1.5之前要通过内容窗格来添加,之后直接添加。
Container c = this.getContentPane();
c.add(btnOk);
this.add(btnOk);
4、 显示窗体:只要通过setVisible方法即可。