为了完成本次学习,我们需要掌握: static 关键字:静态变量、常量和方法。
实战1.求圆环面积和周长
已知圆环的大圆半径 R 和 小圆半径 r 的长度分别为 32.0 和 10.0,求该圆环的面积和周长。
圆环面积公式为:S=π(R*R −r*r );
圆环周长公式为:C=2π(R+r)。
/**
* 任务:已知圆环的大圆半径 R 和 小圆半径 r 的长度分别为 32.0 和 10.0,求该圆环的面积和周长。
* 类名为:RingArea
*/
public class RingArea {
// 定义三个量,两个变量分别为大圆半径和小圆半径,常量表示π,它的值可以调用 Math.PI获取,并将其设为静态常量。
double R;
double r;
static double pi = Math.PI;
// 定义一个无参构造方法,将小圆半径设为 10.0,大圆半径设为32.0
public RingArea()
{
this.R = 32;
this.r = 10;
}
/**
* 定义一个静态方法,该方法实现计算圆环的周长,携带两个参数,分别为传来的小圆半径和大圆半径的值。
* 将圆环周长的计算结果返回,返回类型为double
*/
public static double Ring(double R,double r)
{
double c = 2*pi*(R+r);
return c;
}
/**
* 定义一个静态方法,该方法实现计算圆环的面积,携带两个参数,分别为传来的小圆半径和大圆半径的值。
* 将圆环面积的计算结果返回,返回类型为double
*/
public static double Area(double R,double r)
{
double s = pi*(R*R-r*r);
return s;
}
// 定义主方法
public static void main(String[] args)
{
// 在主方法中通过定义的无参构造方法定义一个对象
RingArea ringarea = new RingArea();
// 通过类名.方法名的方式调用计算圆环周长的方法,获取圆环周长,分别将该对象的小圆半径的值和大圆半径的值传入该方法中
double c = ringarea.Ring(32,10);
// 通过类名.方法名的方式调用计算圆环面积的方法,获取圆环面积,分别将该对象的小圆半径的值和大圆半径的值传入该方法中
double s = ringarea.Area(32,10);
// 不换行四舍五入保留两位小数后格式化输出求出的值,输出格式:该圆环的周长为xx,面积为xx
System.out.printf("该圆环的周长为%.2f,面积为%.2f",c,s);
}
}
输出结果:该圆环的周长为263.89,面积为2902.83
实战2.检验三边是否构成三角形
根据键盘输入的三个 double 型的数字判断其是否能构成三角形。
/**
* 任务:根据键盘输入的三个 double 型的数字判断其是否能构成三角形。
* 类名为:Triangle
*/
import java.util.Scanner;
public class Triangle {
/**
* 定义一个静态方法,该方法检验三边是否能构成三角形,携带三个参数,分别为传来的三个参数,无返回值
* 如果能构成,不换行输出:这三条边可以构成三角形
* 如果不能,不换行输出:这三条边不能构成三角形
*/
public static void judge(double a,double b,double c)
{
int f=0;
if(a+b>c && a+c>b && b+c>a)
{
f=1;
}
if(f==1)
{
System.out.print("这三条边可以构成三角形");
}
else System.out.print("这三条边不能构成三角形");
}
// 定义主方法
public static void main(String[] args)
{
// 获取键盘输入的三个数
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
double c = sc.nextDouble();
// 通过类名.方法名的方式调用检验三边是否能构成三角形的方法,分别将键盘输入的三个数传入该方法中
Triangle triangle = new Triangle();
triangle.judge(a,b,c);
}
}
测试输入:
3 4 5
预期输出:
这三条边可以构成三角形
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 修饰,则每创建一个对象会拷贝一份到内存中。