1.3类的成员变量

声明

本文章是本人在bilibili视频的学习笔记,视频地址清华大学java语言49讲(郑莉教授)

实例变量

没有static修饰的变量称为实例变量(instance Variables)

数据冗余增加操作复杂性,最大的危险性是会完成数据的不一致性
让每个学生都记得当前学生总数,保证你们记得的都不一样(那用谁的呢?),只需要保存一份就可以了(以中心为准)

C语言中静态变量具有全局的寿命,会放在静态存储区
Java中使用方static表示不属于某个对象,而属于整个类

println()方法是system.out对象的方法
要求参数是一个字符串
加号"+"是字符串拼接的运算符

Java中每个类都会自动地包含一个叫toString方法(隐含的),返回:
getClass().getName()+"@"+Integer.toHexSring(hashCode)

//取得当前所属类的类名
//hashCode是更对象内存地址相关的码
(好像是一个内存地址,不等同于真实地址)

例子一

声明一个表示圆的类,保存在文件Circle.java中。 然后编写测试类,保存在文件ShapeTester.java中(两个类放在相同目录下)
public class Circle{
       int radius;
}

public class ShapeTester{
   public static void main(String args[]){
       Circle x ;//定义了一个Circle引用类型
       x=new Circle();
       System.out.println(x);
       System.out.println("radius="+x.radius);
   }
}

编译后运行结果
Circle@26b249 //
radius=0

例子二

声明一个表示矩形的类,保存在Rectangle.java中;编写测试类,保存在ShapeTester.java中,二进制文件保存在相同的目录下
public class Rectangle{
      double width=10.128;
      double height=5.734;
}

public class ShapeTester{
  public static void main(String args[]){
      Circle x;
      Rectangle y;
      x=new Circle();
      y=new Rectangle();
      System.out.println(x+" "+y);
    //两个对象没法加,与空字符串拼接(全转换成字符串)
    }
}

编译后运行结果
Circle@82fodb Rectangle@924342

对ShapeTester进行修改,使两个实例具有不同的实例变量值

public class ShapeTester{
  public static void main(String args[]){
     Circle x;
     Rectangle y,z;
     x=new Circle();
     y=new Rectangle();
     z=new Rectangle();
     
     x.radius=50;
     y.width=68.94;
     z.height=47.54;

   System.out.println(x.radius+" "+y.width+" "+z.width)
   }
}

例子三:地址簿程序
一个人的地址通常包括以下信息 姓名,省份,城市,街道,门牌号,邮政编码。 采用过程化的程序设计方法,使用简单的变量存储,则存储两个人地址的代码如下

(对象名.成员名 去访问对象每个成员)
采用面向对象的程序设计方法,则需要首先声明Address类如下

public class Address{
   String name;
   int gateNumber;
   String streetNume;
   String city;
   String province;
   String postalCode;

}

静态变量

用static修饰,用static修饰的变量属于整个类,而不属于某个对象(只有一份)

//可以通过类名访问 Circle.PI
//可以通过对象名访问 x.PI

Circle x=new Circle();
    System.out.println(x.PI);
为什么需要静态变量,什么情况下需要静态变量?
  • 有些数值是普世性的,比如圆周率π,存一份就行
  • 对于一个圆类的所有对象。计算圆的面积时,都需要用到π的值,可在Circle类的声明中增加一个类属性PI
public class Circle{
   static double PI= 3.14159265;
   int radius;
}

当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中
(PI只有一份,在类中,不会在某个对象中,对象想用,借用即可)

每个圆可以有不同的半径,享用(共用)同一个圆周率的值

对类变量进行测试
 public class ClassVariableTester{
   public static void main(String arg[]){
     Circle x=new Circle();
     System.out.println(x.PI);
     System.out.println(Circle.PI);
     Circle.PI=3.14;  //修改
     System.out.println(x.PI);
     System.out.println(Circle.PI);
   }
}

测试结果
3.1415926
3.14159265
3.14
3.14

例子四:画一个点

声明一个Point(点)类,有两个私有变量保存点坐标,一个类变量保存已有点的个数

//学生管理系统中,学生总数由注册中心记录,而不是每个学生去记忆(没必要背负这个重任)

public class Point{
   private int x;     
   private int y;
   private static int pointCount=0;  //不想让外界知道和操作

   //构造方法(用来初始化对象)
   //自定义初始化规则,合法性判断,数值转换
   //不许规定返回类型。不许规定有return
   public Point(int x,int y){
      this.x=x;  //将实参x(具体值)赋予给当前对象
      this.y=y;
      pointCount++;
     }
}

//public在整个包中都可以用
private:我只要离开了这对大括号,在其他地方没法访问x,y

测试类ex2_4

class ex2_4
{
   public static void main(String[] args)
   {
 Point p= new Point(1,1);//构造函数构造对象
      System.out.println(p.pointCount);
  Point q=new Point(2,2);
     System.out.println(q.pointCount) System.out.println(q.pointCount==pointCount) System.out.println(Point.PointCount)
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值