学习-Java类和对象之static关键字之求圆环面积和周长

学习-Java类和对象之static关键字之求圆环面积和周长,第1张

学习-Java类和对象之static关键字之求圆环面积和周长

任务描述

本关任务:已知圆环的大圆半径 R 和 小圆半径 r 的长度分别为 32.0 和 10.0,求该圆环的面积和周长。

圆环面积公式为:S=π(R2−r2); 圆环周长公式为:C=2π(R+r)。

相关知识

为了完成本关任务,你需要掌握: static 关键字:静态变量、常量和方法。

static 关键字

static 关键字可以用来可以用来修饰类的属性或者方法。例如我们之前学习的静态变量、静态方法等。

当属于同一个类的所有对象出现共享数据时,就需要将存储这个共享数据的成员用 static 修饰。例如:在我们之前学习的 Person 类中,对象“张三”有两个眼睛一个嘴巴,而其它的对象同样有两个眼睛一个嘴巴,也就是说这个属性的资源是被共享的,是属于这个类的,并不单单是属于某个对象的,我们可以将其设置为静态的。

static 修饰成员属性和方法最大的作用,就是可以使用"类名."的方式 *** 作方法和属性,避免了先要 new 出对象的繁琐和资源消耗。

static 的特点:

    随着类的加载而被加载;

    优先于对象存在;

    被所有对象共享;

    被 static 所修饰的变量或者方法会储存在数据共享区;

    被 static 修饰后的成员变量只有一份。

静态变量

被 static 修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。静态变量可以直接通过类名.静态变量名称调用,虽然也能通过对象来访问静态变量和方法,但为了可读性,方便分辨静态变量,应该通过类名来调用。

例子:

 
    public class Person{static int a = 10;public static void main(String[] args) {System.out.print(Person.a);}}

执行结果:

 
    10

静态变量和实例变量的区别:

    生命周期的不同; 成员变量随着对象的创建而存在随着对象的回收而释放,静态变量随着类的加载而存在随着类的消失而消失。

    调用方式不同; 成员变量只能被对象调用,静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

    数据存储位置不同; 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据,静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

    内存中的数量不同。 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。静态变量由于不属于任何实例对象,是属于类的,所以在内存中只会有一份,在类的加载过程中,JVM 为静态变量分配一次内存空间。

静态方法

被 static 修饰的成员方法叫做静态方法,也叫做类方法,静态方法可以直接通过类名.静态方法名称调用(同样也可以用对象.方法的方式),不属于对象的。

 
    public class Person{public static void sleep (){System.out.print("我要睡觉了");}public static void main(String[] args) {System.out.print(Person.sleep());}}

执行结果:

 
    我要睡觉了

要注意的是静态的可以访问静态的,但是不能访问非静态的成员属性和方法,这很好理解,因为 static 修饰的方法是属于类的,如果去直接使用对象的成员变量,它会不知所措(不知该使用哪一个对象的属性)。

静态常量

在 Java 中,final 表示不变,所以用它修饰的量表示常量,例如:

 
    final double pi = 3.1415;

在 Java 中,常量一般会用 static 进行修饰,变成静态变量的,这是为什么呢?

在创建类的多个对象时,用 static 修饰的常量在内存中只有一份拷贝。不用 static 修饰,则每创建一个对象会拷贝一份到内存中。


public class RingArea {
    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    

    // 定义三个量,两个变量分别为大圆半径和小圆半径,常量表示π,它的值可以调用 Math.PI获取,并将其设为静态常量。
    static double PI = Math.PI;
    double R;
    double r;
    // 定义一个无参构造方法,将小圆半径设为 10.0,大圆半径设为32.0
    public RingArea() {
        this.R = 32.0;
        this.r = 10.0;
    }
    
    public static double ring(double R,double r){
        return 2 * PI * (R + r);
    }
    
    public static double area(double R,double r){
        return PI * (R * R - r * r);
    }
    // 定义主方法
public static void main(String[] args) {
    // 在主方法中通过定义的无参构造方法定义一个对象
        RingArea ringArea = new RingArea();
    // 通过类名.方法名的方式调用计算圆环周长的方法,获取圆环周长,分别将该对象的小圆半径的值和大圆半径的值传入该方法中
        double c = RingArea.ring(ringArea.R,ringArea.r);
    // 通过类名.方法名的方式调用计算圆环面积的方法,获取圆环面积,分别将该对象的小圆半径的值和大圆半径的值传入该方法中
        double s = RingArea.area(ringArea.R,ringArea.r);
    // 不换行四舍五入保留两位小数后格式化输出求出的值,输出格式:该圆环的周长为xx,面积为xx
        System.out.print("该圆环的周长为" + String.format("%.2f",c));
        System.out.print(",面积为" + String.format("%.2f",s));
        }
    
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5716099.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存