IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Java实训笔记(二)

    zhazha1980518发表于 2011-08-26 17:01:29
    love 0

    1、静态成员

    在前面我们学习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;

    }

    2、包

    包是组织类的方式,为了避免类名的重复。标准java类库分布在不同的包中,包括:java.lang、java.util、java.io、java.sql和java.net。java程序默认导入的包是lang包,具体的包在后面的实训笔记中讲解。自定义包是用package,放在源文件的开发,定义类之前。

    package com.java.ch2;

    public class Employee{

    }

    在使用包时通过import方式导入。

    3、继承

    在前面有一个雇员类,我们都知道一个公司的雇员一般要分为经理和普通员工,这两种都是雇员,那我们要实现这种结构,就需要用到继承,继承就是“是”的关系,不是是的关系不能写成继承。在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修饰字段表示常量。

    4、抽象类

    在我们在设计类往往存在很通用的类,比如学生是一个人,员工也是一个人,在这个里面都有一个描述的方法,在人里面是用来表述一个人,但是没有办法给出具体的实现,那这个时候就要把这个方法写成抽象方法,抽象方法所在类必是抽象类,抽象类中可以有其他方法和字段。类中如果不含抽象方法,也可以写成抽象类。

    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();

    }

    }

    这个例子把我们刚刚前面学的东西都系统的结合集合,好好琢磨这个例子,有很多的东西在这里。

    5、接口

    接口是用来描述类具有什么功能,而并不是给出每个功能的具体实现。一个类可以实现一个或多个接口。接口中的所有方法自动是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来实例化,但是可以创建接口变量,可以引用实现接口的类的对象。接口不能含有字段和静态方法,但可以包含常量。

    使用接口改写我们前面的果园的例子,请大家自行改写,我就不列出详细代码。

    在这里也就明确了接口与抽象类的区别,请大家认真看我笔记,自行总结。

    6、Swing界面

    在前面所写的例子都是基于控制台的程序,现在我们就开始进入到基于图像界面的程序,在学习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方法即可。



沪ICP备19023445号-2号
友情链接