声明
本文章是本人在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)
}
}