Java 类与对象、继承、实例成员与类成员、接口、abstract修饰符的使用

Java中类与对象的写法与C、C++相似

一、类与对象

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

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

文件命名为AreaAndLength.java

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(sideA+sideB>sideC && Math.abs(sideA-sideB)<sideC)  //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(sideA+sideB>sideC && Math.abs(sideA-sideB)<sideC)  // 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+height)*height*0.5; 
      return area;  // 方法体,,要求计算出area返回
    }
} 
class Circle 
{   double radius,area;
    Circle(double r)
    { radius=r; //方法体
    }
    double getArea( ) 
    {  area=3.14*radius*radius;
       return area; //方法体,要求计算出area返回
    }
    double getLength( ) 
    {
      return 2*3.14*radius;  //getArea方法体的代码,要求计算出length返回
    }
void setRadius(double newRadius)
    {  radius=newRadius;
    }
    double getRadius( ) 
    { return radius;
    }
}

public class AreaAndLength    //此类可以理解为主函数,运行时需将文件名命名为AreaAndLength
{  
    public static void main(String args[ ])
    {  double length,area;
       Circle circle=null;
       Triangle triangle;
       Lader lader;
       circle=new Circle(4.0);  //创建对象circle
       triangle=new Triangle(3.0,4.0,5.0);  //创建对象triangle
       lader=new Lader(2.0,4.0,3.0);  //创建对象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类基本格式

class 类名{
double/int/string   //类变量
类名(){

}      //构造函数
其他方法
}

主函数调用时

public class 类名    //此类可以理解为主函数,运行时需将文件名命名为此public类的类名
{  
    public static void main(String args[ ])
    {  
       Circle circle=null; 
       circle=new Circle(4.0);  //创建对象circle
        length=circle. getLength( ) ; // circle调用方法返回周长并赋值给length
        System.out.println("圆的周长:"+length); 
    }
}

注意:boolean类型变量其值为true或者false

 二、继承

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

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

将源文件保存为HardWork.java

abstract class Employee
{
   public abstract double earnings( );
}
class YearWorker extends Employee
{
 public double earnings( )
 { return 3000.0;
 }
  // 重写earnings( )方法
}
class MonthWorker extends Employee    //类的继承,用extends+父类名表示
{
  public double earnings( )
 { return 6000.0;
 } 
// 重写earnings( )方法
}
class WeekWorker extends Employee
{
  public double earnings( )
{  return 9000.0;
 } // 重写earnings( )方法
}
class Company
{
   Employee[ ] employee;
   double salaries=0;
   Company(Employee[ ] employee)
   {
      this.employee=employee;
   }
   public double salariesPay( )
   {
      salaries=0;
      for(int i=0;i<20;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( ) );
   }
}

abstract抽象类

用abstract修饰的类为抽象类,抽象类不能被实例化。

用abstract修饰的方法为抽象方法,抽象方法没有方法体

抽象方法必须有子类实现

详见 java abstract修饰符_say_haha的博客-CSDN博客_javaabstract修饰符

三、实例成员与类成员

import java.util.Scanner;
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(a);
    }
}
public class Example
{   public static void main(String args[ ]) 
    { A s;
      s=new A( );
      s.setB(100);// 通过类名操作类变量b,并赋值100
      s.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( ) 
    } 
}

问题

①将inputA()方法中的System.out.println(a);改写为System.out.println(a+b);编译是否出错?为什么?

没有。b为float型类变量,且为静态(static)

②将inputB()方法中的System.out.println(b);改写为System.out.println(a+b);编译是否出错?为什么?

出错了。

Example.java:21: 错误: 无法从静态上下文中引用非静态 变量 a

    {  System.out.println(a+b);

                          ^

1 个错误

static方法与类有关、与实例无关

静态初始化 static{语句。。。} 先于实例的初始化 

四、接口

①定义一个接口,它含有两个抽象方法:第一个抽象方法用于实现在两个数中求最小的数;第二个抽象方法用于实现在三个数中求最大的数;

  • 定义一个类实现这个接口;
  • 再定义一个含有main()方法的主类,实现最小和最大的数的输出。
interface A{    //接口A
double Min(double a,double b);
double Max(double x,double y,double z);
}
public class MinMax implements A{    //创建函数MinMax来定义方法Min、Max
public double Min(double a,double b){
if(a>b){
return b;
}
else
return a;
}
public double Max(double x,double y,double z){
double s;
if(x>y){
s=x;}
else
s=y;
if(s<z){
s=z;}
return s;
}
public static void main(String a[ ]){    //执行类方法
    MinMax m=new MinMax();
    System.out.println("最小值"+m.Min(4.5,5.5));
    System.out.println("最大值"+m.Max(3.4,3.7,2.2));
}
}

 

①定义一个StartStop接口,含有start()和stop()两个抽象方法;

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

class Meeting implements StartStop{
public void start(){
System.out.println("会议开始");
}
public void stop(){
System.out.println("会议结束");
}
}

class Car implements StartStop{
public void start(){
System.out.println("发动引擎");
}
public void stop(){
System.out.println("熄火");
}
}

public class MeetingCar{        //创建一个public类,并将文件名命名为MeetingCar
public static void main(String a[]){
   StartStop[] s;      //定义StartStop类型数组s
   s=new StartStop[2];  //给s分配两个空间
   Meeting meet;     
   Car car;
   meet=new Meeting();
   car=new Car();          //分别给s[0]、s[1]赋值为Meeting、Car
   s[0]=meet;
   s[1]=car;
   s[0].start();    //执行方法(注意要加括号)
   s[0].stop();
   s[1].start();
   s[1].stop();
}
}

结果为 

 

 

 

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

 

abstract class Shape{
double area;
Shape(){ }
public abstract double getArea();
public String toString(){
return "Area";
}
}
class Triangle extends Shape{
double side1,side2,side3;
Triangle (double sideA,double sideB,double sideC){
side1=sideA;
side2=sideB;
side3=sideC;
}
public double getArea(){
double p=(side1+side2+side3)/2.0;
          area=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3)) ;
          return area;  
}
public String toString(){
return "Area:"+area;
}
}
class Circle extends Shape{
double radius;
Circle(double r){
radius=r;
}
public double getRadius(){
return radius;
}
public double getArea(){
area=3.14*radius*radius;
return area;
}
public boolean equals(Object anobject){
Circle an=(Circle) anobject;
if(this.radius ==an.getRadius()){
System.out.println("equal");
return true;
}
else
System.out.println("unequal");
return false;
}
public String toString(){
return "Area:"+area;
}
}

public class Shapes
{
   public static void main(String args[ ])
   {
     Triangle tri;
     Circle cir;
     tri=new Triangle(3.0,4.0,5.0);
     cir=new Circle(4.0);
     tri.getArea();
    System.out.println(tri.toString());
     cir.getArea();
     System.out.println(cir.toString());
     Circle c1;
     c1=new Circle(4.0);
     c1.equals(cir);
     Circle c2;
     c2=new Circle(5.0);
     c2.equals(cir);
}
}


输出为 

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值