《Java实验四》

//实验4--附录一代码
public class PassValueTest
{
    //静态代码块,类一加载就执行的部分。
    //所以运行这个程序会输出 class loding
    static {
        System.out.println("class loding");
    }
    public static void main(String[] args){
        
    }
}
//实验4--附录二代码

/*
所有解释体现在代码中的注释中。
*/
public class PassValueTest
{
    private int i = -100;    //定义一个私有的成员变量i,初值是-100.

    //定义一个test1方法,参数类型是整形,功能是给局部变量b赋值为100.
    public void test1(int b)
    {
        b = 100;
    }

    //定义一个test2方法,参数是类PassValueTest类型的引用变量,功能是修改私有
    //变量i的值为100.
    public void test2(PassValueTest b)
    {
        b.i = 100;
    }

    //定义一个test3方法,参数是类PassValueTest类型的引用变量,功能是把本对象的私有
    //成员变量赋值给局部类类型的变量b。
    public void test3(PassValueTest b)
    {
        b = this;
    }

    //定义主函数。
    public static void main(String[] args)
    {
        //创建一个类PassValueTest的对象。
        PassValueTest obj = new PassValueTest();

        //定义一个整形变量temp,赋值为100.
        int temp = 100;

        //调用成员方法test1,并对方法中的局部整形变量赋值为100.
        obj.test1(temp);
        System.out.println(temp);

        //调用成员方法test2,并修改其成员变量i的值为100.
        obj.test2(obj);
        System.out.println(obj.i);
        
        //修改私有成员变量i的值为100.
        obj.i = 100;//这句代码对吗?哦哦,对,因为是在一个类中访问的。

        //创建一个类PassValueTest的对象。
        PassValueTest newobj = new PassValueTest();
        //调用成员方法test3,并把当前对象的私有成员变量i的值(为-100)赋给局部类类型
        //的变量b
        newobj.test3(newobj);
        System.out.println(newobj.i);
    }
}
////实验4--附录三代码
/*
问题如下:
编译如下代码,分析结果;将“注释这行”所在的行注释,再将
注释的call2方法和main方法中的“StaticTest.call2(obj);”方
去掉注释,再次编译,观察结果分析其原因。

回答如下:
(1)在没有去掉注释之前进行编译,会发生如下错误:
========================================================================
StaticTest.java:13: 错误: 无法从静态上下文中引用非静态 方法 nonstaticmethod()
                nonstaticmethod();//注释这行.
                ^
1 个错误
===========================================================================
这个错误说明:在用类名直接调用静态方法时可以的,但在此例中(没有去掉代码中的注释),
直接用类名调用了call1方法(StaticTest.call1();)但是在call1方法中有调用到了静态的
staticmethod()方法,这是没错的,但是在call1方法中又调用了非静态的nonstaticmethod
方法。此时编译器出现报错提示如上。
    从而也就是说:静态的方法可以有类名直接调用,非静态的方法不能有类名调用。

(2)按照题目要求的做法后,在编译不会出现问题;
    运行结果是:
    静态方法被调用
    非静态方法被调用
    非静态方法被调用
    
    分析运行结果如下:
    首先在主函数中创建了一个StaticTest类的对象obj,然互直接由类名调用静态方法
call1,在call1方法中又调用到了静态的staticmethod方法,然后输出(1)“静态方法被调用”。
接着用类名直接调用了静态的方法call2,并把对象obj传递给静态方法的形式参数o1.在
静态的call2方法中,传递过来的对象调用了非静态的方法nonstaticmethod,此时便打印输出
了(2)“非静态方法被调用”,紧接着又在静态的call2方法中创建了一个本类对象o2,然后用o2对象
也调用了非静态的方法nonstaticmethod.便输出了(3)“非静态方法被调用”

    从以上分析(和自己在代码中的测试)来看:可以总结的是,静态方法可以由类名直接调用,
也可以由对象调用,而非静态的方法只能由对象调用


*/

public class StaticTest
{
    public static void call1()
    {
        staticmethod();
        //nonstaticmethod();//注释这行.
    }

    
    public static void call2(StaticTest o1)
    {
        o1.nonstaticmethod();
        /*
        *o1.staticmethod();
        *这一句是测试用的,是用于测试静态的方法也能由对象直接调用
        *如果加上这一句,编译运行都没有错,运行的结果是:
        *    静态方法被调用
        *    非静态方法被调用
        *    静态方法被调用
        *    非静态方法被调用
        *则说明了静态的方法也能被对象直接调用。
        */
        StaticTest o2 = new StaticTest();
        o2.nonstaticmethod();
    }
    

    public void nonstaticmethod()
    {
        System.out.println("非静态方法被调用");
    }

    public static void staticmethod()
    {
        System.out.println("静态方法被调用");
    }

    public static void main(String[] args)
    {
        StaticTest obj = new StaticTest();
        StaticTest.call1();
        StaticTest.call2(obj);
    }
}
//实验四---第三题:
class Circle
{
    private final double PI = 3.14;
    private double radius;
    private double area;
    private double length;

    Circle(){}
    //构造函数
    Circle(double radius)
    {
        this.radius = radius;
    }
    //设置圆半径
    public void setRadius(double radius)
    {
        this.radius = radius;
    }
    //获取圆半径
    public double getRadius()
    {
        return radius;
    }
    
    //求圆的面积
    public double getArea()
    {
        area = PI*radius*radius;
        return area;
    }

    //求圆的周长
    public double getLength()
    {
        length = 2*PI*radius;
        return length;
    }

    public void print()
    {
        System.out.println("圆的半径="+getRadius()+"圆的面积="+getArea()+"圆的周长="+getLength());
    }

    public static void main(String[] args)
    {
        Circle c1 = new Circle();
        c1.setRadius(1);
        //c1.getArea();
        //c1.getLength();
        c1.print();

        Circle c2 = new Circle(100);
        c2.print();
    }
}
//实验四---第四题:
public class MyDate
{
    //成员变量:
    private int year;
    private int month;
    private int day;
    private boolean leap;

    //构造函数
    MyDate(){}

    MyDate(int year,int month,int day)
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    private void setYear(int year)
    {
        this.year = year;
    }
    private  int getYear()
    {
        return year;
    }

    private void setMonth(int month)
    {
        this.month = month;
    }
    private int getMonth()
    {
        return month;
    }

    private void setDay(int day)
    {
        this.day = day;
    }
    private int getDay()
    {
        return day;
    }

    //判断是否是闰年。
    public  boolean isRunyear(int year)
    {
        if(year%4==0){
            if(year%100==0){
                if(year%400==0)
                    leap = true;
                    else
                        leap = false;
                }
                else
                    leap = true;
            }
            else
                leap = false;
        return leap;
    }
    
    //计算输入的xx年xx月xx日是本年的第几天。
    public int f()
    {
        int sum=0;
        switch(month)
        {
            case 1:sum=0;break;
            case 2:sum=31;break;
            case 3:sum=59;break;
            case 4:sum=90;break;
            case 5:sum=120;break;
            case 6:sum=151;break;
            case 7:sum=181;break;
            case 8:sum=212;break;
            case 9:sum=243;break;
            case 10:sum=273;break;
            case 11:sum=304;break;
            case 12:sum=334;break;
            default:System.out.println("data error!");break;
        }
        sum+=day;
        boolean l = isRunyear(year);
        if(l && month>2)
            sum++;
        return sum;
    }
    //打印相关信息。
    public void print(boolean l)
    {
        if(l)
            System.out.print(year+"是闰年   ");
        else
            System.out.print(year+"不是闰年   ");
        System.out.println(year+"/"+month+"/"+day+"是这一年的第"+f());
    }

    public static void main(String[] args)
    {
        MyDate d1 = new MyDate();
        d1.setYear(2012);
        d1.setMonth(10);
        d1.setDay(1);
        int x = d1.getYear();
        boolean y = d1.isRunyear(x);
        d1.print(y);

        System.out.println("=======================================");
        MyDate d2 = new MyDate(2009,4,1);
        int n = d2.getYear();
        boolean m = d2.isRunyear(n);
        d2.f();
        d2.print(m);
    }
}