(一)类与对象

编写一个Java Application程序,该程序中有3个类:Triangle,Lader 和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。

  1. Triangle类:具有类型为double的三个边、周长、面积属性,具有返回周长、面积以及修改三个边的功能。另外,还具有一个boolean类型的属性,该属性用来判断三个数能否构成一个三角形。
  2. Lader类:具有类型为double的上底、下底、高、面积属性,具有返回面积的功能。
  3. Circle类:具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。

标准答案:

class Triangle {
	double sideA, sideB, sideC, area, length;
	boolean boo;

	public Triangle(double a, double b, double c) {
		sideA = a;
		sideB = b;
		sideC = c;// 参数a, b, c分别赋值给sideA, sideB, sideC
		if (a + b > c && a + c > b && c + b > a)// a, b, c构成三角形的条件表达式
		{
			boo = true;// 给boo赋值
		} else {
			boo = false;// 给boo赋值
		}
	}

	double getLength() { // 方法体,要求计算出length的值并返回
		if (boo) {
			length = sideA + sideB + sideC;
			return length;
		} else {
			System.out.println("不是一个三角形,不能计算周长");
			return 0;
		}
	}

	public double getArea() {
		if (boo) {
			double p = (sideA + sideB + sideC) / 2.0;
			area = Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
			return area;
		} else {
			System.out.println("不是一个三角形,不能计算面积");
			return 0;
		}
	}

	public void setABC(double a, double b, double c) {
		sideA = a;
		sideB = b;
		sideC = c;// 参数a, b, c分别赋值给sideA, sideB, sideC
		if (a + b > c && a + c > b && c + b > a)// a, b, c构成三角形的条件表达式
		{
			boo = true;// 给boo赋值。
		} else {
			boo = false;// 给boo赋值
		}
	}
}

class Lader {
	double above, bottom, height, area;

	Lader(double a, double b, double h) {// 方法体
		above = a;
		bottom = b;
		height = h;
	}

	double getArea() {
		area = (above + bottom) / 2 * height;// 方法体,,要求计算出area返回
		return area;
	}
}

class Circle {
	double radius, area;

	Circle(double r) { // 方法体
		radius = r;
	}

	double getArea() { // 方法体,要求计算出area返回
		return 3.14 * radius * radius;
	}

	double getLength() { // getArea方法体的代码,要求计算出length返回
		return 3.14 * 2 * radius;
	}

	void setRadius(double newRadius) {
		radius = newRadius;
	}

	double getRadius() {
		return radius;
	}
}

public class AreaAndLength {
	public static void main(String args[]) {
		double length, area;
		Circle circle = null;
		Triangle triangle;
		Lader lader;
		// circle=new Circle(10);//创建对象circle
		triangle = new Triangle(3, 4, 5);// 创建对象triangle
		lader = new Lader(3, 4, 10);// 创建对象lader
		length = circle.getLength();// circle调用方法返回周长并赋值给length
		System.out.println("圆的周长:" + length);
		area = circle.getArea();// circle调用方法返回面积并赋值给area
		System.out.println("圆的面积:" + area);
		length = triangle.getLength();// triangle调用方法返回周长并赋值给length
		System.out.println("三角形的周长:" + length);
		area = triangle.getArea();// triangle调用方法返回面积并赋值给area
		System.out.println("三角形的面积:" + area);
		area = lader.getArea();// lader调用方法返回面积并赋值给area
		System.out.println("梯形的面积:" + area);
		triangle.setABC(12, 34, 1);// triangle调用方法返修改三个边的代码,要求将三个边修改为12,34,1
		area = triangle.getArea();// triangle调用方法返回面积并赋值给area
		System.out.println("三角形的面积:" + area);
		length = triangle.getLength(); // triangle对象调用方法返回周长并赋值给length
		System.out.println("三角形的周长:" + length);
	}
}

个人作业:

class Triangle  
{  double sideA,sideB,sideC,area,length;
   boolean boo;
   public  Triangle(double a,double b,double c) 
   { sideA=a;sideB=b;sideC=c;     // 参数a, b, c分别赋值给sideA, sideB, sideC
     if(a+b>c&&a+c>b&&b+c>a&&a>0&&b>0&&c>0)  //a, b, c构成三角形的条件表达式
     { boo=true;  // 给boo赋值
     }    
     else
     { boo=false; // 给boo赋值
     }
   }
   double getLength() 
   {
	   length=sideA+sideB+sideC;
	   return length;  // 方法体,要求计算出length的值并返回
   }
public double  getArea() 
   {    if(boo)
        { double p=(sideA+sideB+sideC)/2.0;
          area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC)) ;
          return area;    }
        else
        { System.out.println("不是一个三角形,不能计算面积");
          return 0; }
   } 
   public void setABC(double a,double b,double c)
   { sideA=a;sideB=b;sideC=c;     // 参数a, b, c分别赋值给sideA, sideB, sideC
      if(a+b>c&&a+c>b&&b+c>a&&a>0&&b>0&&c>0)  // a, b, c构成三角形的条件表达式
      { boo=true;   //给boo赋值。
      } 
      else
      { boo=false;  // 给boo赋值
      }
   }
   public double getA()
  {
      return sideA;
  }
}
class Lader 
{   double above,bottom,height,area; 
    Lader(double a,double b,double h)
    {above=a;bottom=b;height=h; // 方法体
    }
    double getArea( )
    {
    	area=(above+bottom)*height/2;
    	return area; // 方法体,,要求计算出area返回
    }
} 
class Circle 
{   double radius,area;
    Circle(double r)
    { radius=r; //方法体
    }
    double getArea( ) 
    {  
    	area=radius*radius*Math.PI;
    	return area; //方法体,要求计算出area返回
    }
    double getLength( ) 
    {  return 2*radius*Math.PI;  //getArea方法体的代码,要求计算出length返回
    }
void setRadius(double newRadius)
    {  radius=newRadius;
    }
    double getRadius( ) 
    { return radius;
    }
}
public class AreaAndLength 
{  
    public static void main(String args[ ])
    {   double length,area;
        Circle circle=null;
        Triangle triangle;
        Lader lader;
        circle=new Circle(2);  //创建对象circle
        triangle=new Triangle(3,5,4);  //创建对象triangle
        lader=new Lader(2,3,4);  //创建对象lader
        length=circle.getLength();  // circle调用方法返回周长并赋值给length
        System.out.println("圆的周长:"+length); 
        area=circle.getArea();  // circle调用方法返回面积并赋值给area
        System.out.println("圆的面积:"+area); 
        length=triangle.getLength();  // triangle调用方法返回周长并赋值给length
        System.out.println("三角形的周长:"+length); 
        area=triangle.getArea();  // triangle调用方法返回面积并赋值给area
        System.out.println("三角形的面积:"+area); 
        area=lader.getArea(); // lader调用方法返回面积并赋值给area
        System.out.println("梯形的面积:"+area); 
        triangle.setABC(12, 34, 1);  // triangle调用方法返修改三个边的代码,要求将三个边修改为12,34,1
        area=triangle.getArea();  // triangle调用方法返回面积并赋值给area
        System.out.println("三角形的面积:"+area); 
        length=triangle.getLength();  // triangle调用方法返回周长并赋值给length
        System.out.println("三角形的周长:"+length);
    }
}

运行结果:

java保证参数赋值原子 java怎么给参数赋值_java


(二)继承

有一个abstract类,类名为Employee。Employee的子类有YearWorker,MonthWorker和WeekWorker。YearWorker对象按年领取薪水,MonthWorker按月领取薪水,WeekWorker按周领取薪水。Employee类有一个abstract方法:public abstract earnings(); 子类必须重写父类的earnings()方法,给出各自领取报酬的具体方式。

 有一个Company类,该类用employee数组作为成员,employee数组的单元可以是YearWorker对象的上转型对象、MonthWorker 对象的上转型对象或WeekWorker对象的上转型对象。程序能输出Company 对象一年需要支付的薪水总额。

标准答案:

abstract class Employee {
	public abstract double earnings();
}

class YearWorker extends Employee {
	public double earnings() {
		return 50000.456;
	}
}

class MonthWorker extends Employee {
	public double earnings() {
		return 12 * 2000;
	}
}

class WeekWorker extends Employee {
	public double earnings() {
		return 52 * 500;
	}
}

class Company {
	Employee[] employee;
	double salaries = 0;

	Company(Employee[] employee) {
		this.employee = employee;
	}

	public double salariesPay() {
		salaries = 0;
		for (int i = 0; i < employee.length; i++) {
			salaries = salaries + employee[i].earnings();
		}
		return salaries;
	}
}

public class HardWork {
	public static void main(String args[]) {
		Employee[] employee = new Employee[20];
		for (int i = 0; i < employee.length; i++) {
			if (i % 3 == 0)
				employee[i] = new WeekWorker();
			else if (i % 3 == 1)
				employee[i] = new MonthWorker();
			else if (i % 3 == 2)
				employee[i] = new YearWorker();
		}
		Company company = new Company(employee);
		System.out.println("公司工资总额:" + company.salariesPay());
	}
}

个人作业:

abstract class Employee
{
   public abstract double earnings( );
}
class YearWorker extends Employee
{
	public double earnings() {
		double salary=200;
		return salary*12;
	}  // 重写earnings( )方法
}
class MonthWorker extends Employee
{
	public double earnings() {
		double salary=200;
		return salary;
	}// 重写earnings( )方法
}
class WeekWorker extends Employee
{
	public double earnings() {
		double salary=200;
		return salary/4;
	}// 重写earnings( )方法
}
class Company
{
   Employee[ ] employee;
   double salaries=0;
   Company(Employee[ ] employee)
   {
      this.employee=employee;
   }
   public double salariesPay( )
   {
      salaries=0;
      for(int i=0;i<employee.length;i++) {
    	  salaries+=employee[i].earnings();// 计算salaries
      }
      return salaries;
   }    
}
public class HardWork
{
   public static void main(String args[ ])
   {
      Employee[ ] employee=new Employee[20];
      for(int i=0;i<employee.length;i++)
       {
           if(i%3==0)
             employee[i]=new WeekWorker( );
           else if(i%3==1)
             employee[i]=new MonthWorker( );
           else if(i%3==2)
             employee[i]=new YearWorker( );
       } 
     Company company=new Company(employee);
     System.out.println("公司年工资总额:"+company.salariesPay( ) );
   }
}

个人作业运行结果:

java保证参数赋值原子 java怎么给参数赋值_java保证参数赋值原子_02


(三)实例成员与类成员

class A
{   float a;         // 声明一个float型实例变量:a
    static float b;         // 声明一个float型类变量:b
    void setA(float a)
    {  this.a=a;     // 将参数a的值赋值给成员变量a
    }
    void setB(float b)
    {  this.b=b;      // 将参数b的值赋值给成员变量b
    } 
    float getA( )
    {   return a;
    }
    float getB( )
    {   return b;
    }
    void inputA( )
    {  System.out.println(a);
    }
    static void inputB( )
    {  System.out.println(b);
    }
}
public class Example
{   public static void main(String args[ ]) 
    {  A.b=100;  // 通过类名操作类变量b,并赋值100
       A.inputB();  // 通过类名调用方法inputB( )
       A cat=new A( );
       A dog=new A( );
       cat.setA(200);// cat象调用方法setA(int a)将cat的成员a的值设置为200
       cat.setB(400); // cat调用方法setB(int b)将cat的成员b的值设置为400
       dog.setA(200); // dog象调用方法setA(int a)将dog的成员a的值设置为200
       dog.setB(400);// dog调用方法setB(int b)将dog的成员b的值设置为400
       cat.inputA();// cat调用inputA( ) 
       cat.inputB();// cat调用inputB( ) 
       dog.inputA();// dog调用inputA( ) 
       dog.inputB();// dog调用inputB( ) 
    } 
}

 运行结果:

java保证参数赋值原子 java怎么给参数赋值_ide_03

 注意:inputB( )不能对非静态字段 a 进行静态引用。


(四)package语句与import语句

tom.jiafei包内:

package tom.jiafei;
public class Triangle  
{  
   double sideA,sideB,sideC;
   boolean boo;
   public Triangle(double a,double b,double c) 
   {
     sideA=a;sideB=b;sideC=c; 
    
if(a+b>c&&a+c>b&&c+b>a)
     {
        System.out.println("我是一个三角形");
        boo=true;
     } else
     { 
        System.out.println("我不是一个三角形");
        boo=false;
     }
   }
 public void 计算面积( ) 
   {    
       if(boo)
        {
          double p=(sideA+sideB+sideC)/2.0;
          double area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC)) ;
          System.out.println("是一个三角形,能计算面积");
          System.out.println("面积是:"+area);
        }
      else
        { 
           System.out.println("不是一个三角形,不能计算面积");
        }
   }
public void 修改三边(double a, double b, double c)
   { 
     sideA=a;sideB=b;sideC=c;
     if(a+b>c&&a+c>b&&c+b>a)
     { 
        boo=true;
     }    
    else
     { 
        boo=false;
     }
   }
}

其他包内调用:

import tom.jiafei.Triangle;
import java.util.Date;
class SunRise
{ 
  public static void main(String args[ ])
  { 
    Triangle triangle=new Triangle(12,3,104);
            triangle.计算面积( );
            triangle.修改三边(3,4,5);
            triangle.计算面积( );
    Date date=new Date( );
    System.out.println(date);
  }
}

运行结果:

java保证参数赋值原子 java怎么给参数赋值_java_04


(五)接口的定义与使用

(1)定义和实现接口

interface Listener{

void action();

}

public class Test implements Listener{

 public static void main(String a[]){

new Test();

}

}

编译程序指示什么错误,写出原因。

类型 Test 必须实现继承的抽象方法 Listener.action(),因为接口没有默认实现,如果不实现继承的抽象方法,则该类为抽象类,抽象类不能用来创建对象。

(2)在Test类中增加如下方法:

public void action(){

System.out.println("stand up ");}

public static void main(String a[]){

Test x=new Test();

x.action();

}

编译并执行程序,说说为什么要在action方法头增加public修饰?

因为不能降低自 Listener 继承的方法的可视性。如果为private,则不能被子类继承,子类便无法实现该方法。

(3)再增加一个类Test2实现Listener接口

class Test2 implements Listener {

public void action(){

System.out.println("sit down");}

}

并修改Test类的main方法:

public static void main(String a[]){

Listener x[]={new Test(),new Test2()};

 x[0].action();

x[1].action();

}

调试程序,观察通过接口引用变量访问对象方法的动态多态行为,写出程序的输出。

程序输出:

stand up

sit down

(4)在方法参数中使用接口类型

给test类增加一个方法add,设计如下:

public void add(Listener a){

a.action();

}

main方法改动如下:

public static void main(String a[]){

Test x=new Test();

x.add(x);

x.add(new Test2());

}

观察输出结构,分析内在关系,写出程序的输出。

不同类类型的变量调用的是各自类中实现的方法,实现了多态。

程序输出:

stand up

sit down

完整Test代码:

interface Listener{
void action();
}
public class Test implements Listener{
	public void action(){ 
		System.out.println("stand up ");}
	public void add(Listener a){
		a.action();
		}
	public static void main(String a[]){
 	 	Test x=new Test();
 	 	x.add(x);
 	 	x.add(new Test2());
}
/*
 * public static void main(String a[]){ Listener x[]={new Test(),new Test2()};
 * x[0].action(); x[1].action(); }
 */
}
class Test2 implements Listener {
		public void action(){
			System.out.println("sit down");}
}

2、编写程序

  • 定义一个接口,它含有两个抽象方法:第一个抽象方法用于实现在两个数中求最小的数;第二个抽象方法用于实现在三个数中求最大的数;
  • 定义一个类实现这个接口;
  • 再定义一个含有main()方法的主类,实现最小和最大的数的输出。

标准答案:

interface MaxAndMin {
	public abstract int Min(int a, int b);
	public abstract int Max(int x, int y, int z);
}

class ABC implements MaxAndMin {
	public int Min(int a, int b) {
		if (a > b)
			return b;
		else
			return a;
	}

	public int Max(int x, int y, int z) {
		int max = x;
		if (y > max)
			max = y;
		if (z > max)
			max = z;
		return max;
	}
}

public class Tester {
	public static void main(String args[]) {
		ABC t = new ABC();
		System.out.println("最小值是" + t.Min(10, 20));
		System.out.println("最大值是" + t.Max(10, 30, 20));
	}
}

个人作业:

interface Listener2{
	int FindMin(int a,int b);
	int FindMax(int a,int b,int c);
}
public class MaxMin implements Listener2{
	public int FindMin(int a,int b){ 
		if(a<b)
			return a;
		else
			return b;
	}
	public int FindMax(int a,int b,int c){ 
		int max=a;
		if(b>max)
			max=b;
		if(c>max)
			max=c;
		return max;
	}
	public static void main(String a[]){
		MaxMin x=new MaxMin();
 	 	System.out.println("最大数为:"+x.FindMax(2,1,3));
 	 	System.out.println("最小数为:"+x.FindMin(5,7));
	}
}

运行结果:

java保证参数赋值原子 java怎么给参数赋值_java_05


(六)选做题

1、参看UML图,编写类Shape和Triangle,实现类中的方法(斜体字是抽象方法),并自定义构造函数、get、set等方法。

java保证参数赋值原子 java怎么给参数赋值_ide_06

标准答案:

abstract class Shape {
	public abstract double getArea();

	public String toString() {
		return "This is a Shape";
	}
}

class Triangle extends Shape {
	private double side1, side2, side3;

	public Triangle(double s1, double s2, double s3) {
		side1 = s1;
		side2 = s2;
		side3 = s3;
	}

	public double getArea() {
		double s = (side1 + side2 + side3) / 2;
		return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));
	}

	public String toString() {
		return "This is a Triangle, sides are :" + side1 + "," + side2 + "," + side3;
	}
}

class Circle extends Shape {
	private double radius;

	public Circle(double r) {
		radius = r;
	}

	public double getRadius() {
		return radius;
	}

	public double getArea() {
		return Math.PI * radius * radius;
	}

	public boolean equals(Object obj) {
		if (obj instanceof Circle)
			return this.radius == ((Circle) obj).getRadius();
		else
			return false;
	}

	public String toString() {
		return "this is a Circle with radius " + radius;
	}
}

个人作业:

import java.util.Objects;
public abstract class Shape {
	public abstract double getArea();
	public abstract String toString();
	public static void main(String args[ ])
    { 
		Triangle triangle=new Triangle(3,5,4);
		Circle circle1=new Circle(2);
		Circle circle2=new Circle(3);
		System.out.println("三角形的面积:"+triangle.getArea());
		System.out.println(triangle.toString());
		System.out.println("圆1的面积:"+circle1.getArea()); 
		System.out.println("圆2的面积:"+circle2.getArea()); 
		System.out.println("半径是否相等: " + circle1.equals(circle2));
		System.out.println(circle1.toString());
		System.out.println(circle2.toString());
    }
}

class Triangle extends Shape {
	private double side1,side2,side3;
	public Triangle(double a,double b,double c) {
		side1=a;side2=b;side3=c;
	}
	public double getArea() {
		double p=(side1+side2+side3)/2.0;
        return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
	}
	public void setSide(double side1,double side2,double side3) {
		this.side1 = side1;
		this.side2 = side2;
		this.side3 = side3;
	}
	public String toString() {
		return ("三角形的三边长分别为:"+side1+'、'+side2+'、'+side3+','+"面积为:"+getArea());
	}
}

class Circle extends Shape {
	private double radius;
	public Circle(double r) {
		radius=r;
	}
	public double getArea() {
        return radius*radius*Math.PI;
	}
	public String toString() {
		return ("圆的半径为:"+radius+','+"面积为:"+getArea());
	}
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		
		if(obj instanceof Circle) {
			Circle c = (Circle)obj;
			return this.radius == c.radius;
		}
		
		return false;
	}
	public double getRadius() {
		return radius;
	}
	public void setRadius(double radius) {
		this.radius = radius;
	}
}

个人作业运行效果:

java保证参数赋值原子 java怎么给参数赋值_java_07

2、按照要求编写程序

  • 定义一个StartStop接口,含有start()和stop()两个抽象方法;
  • 分别创建“会议”和“汽车”两个类实现StartStop接口;
  • 定义测试类,利用接口StartStop定义一个数组,创建一个“会议”对象和一个“汽车”对象赋值给数组,通过数组元素访问对象的start()和stop()方法。

标准答案:

interface StartStop {
	void Start();

	void Stop();
}

class Conference implements StartStop {
	public void Start() {
		System.out.println("Start the conference!");
	}

	public void Stop() {
		System.out.println("Stop the conference!");
	}
}

class car implements StartStop {
	public void Start() {
		System.out.println("Insert key in ignition and turn!");
	}

	public void Stop() {
		System.out.println("Turn key in ignition and remove!");
	}
}

public class Interfacetest {
	public static void main(String[] args) {
		StartStop s[] = { new car(), new Conference() };
		for (int i = 0; i < s.length; i++) {
			s[i].Start();
			s[i].Stop();
		}
	}
}

个人作业:

interface StartStop {
    public void start();
    public void stop();
}
class Car implements StartStop {
     public void start(){
         System.out.println("车启动了");
     }
    public void stop(){
        System.out.println("车停止了");
    }
}
class Metting implements StartStop {
     public void start(){
         System.out.println("会议开始了");
     }
    public void stop(){
        System.out.println("会议停止了");
    }
}
public class CarAndMeeting {
	public static void main(String[] args) {
        StartStop ss[]={ new Metting(), new Car() };
        for(StartStop s: ss) {
        	s.start();
            s.stop();
        }
    }
}

个人作业运行效果:

java保证参数赋值原子 java怎么给参数赋值_java_08