文章目录
1.静态变量、常量和方法
静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员 (即实例数据域和方法)。
声明一个静态变量或定义一个静态方法,就要在这个变量或方法的声明中加上修饰符static。
- 静态变量、常量和方法被类中的所有对象所共享。静态变量 ( staticvariable), 也称为类变量 ( classvariable)。静态变量将变量值存储在一个公共的内存地址。因为是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。
- 实例变量是属于类的某个特定实例的,不能被同一个类的不同对象所共享。
- 静态方法是共同的,无须创建类的实例就可以调用静态方法 (staticmethod)
用最简单的话概括就是
- 实例方法和实例变量依赖于具体的对象,只能由对象访问。不同对象有各自独享的方法和变量。
- 静态方法和静态变量是该类所有的对象共有(或者说静态变量是类变量,它属于整个类,不依赖于对象)。所有 对象可以访问,类也可以访问。
class Circle{
int radius;
static numOfObjests = 0;
Circle(){
radius = 1;
numOfObjects++;
}
Circle(int n){
radius = n;
numOfObjects++;
}
static int getNum(){
return numOfObject;
}
double getArea(){
return radius*radius*Math.PI;
}
}
pulbic class Test{
public static void main(String[] args){
Circle c1 = new Circle(); // r=1
Circle c2 = new Circle(5); // r=5
// 实例变量
System.out.println(c1.radius);
System.out.println(c2.radius);
// 静态变量
System.out.println(c1.numOfObject);
System.out.println(c2.numOfObject);
System.out.println(Class.numOfObject);
// 实例方法
System.out.println(c1.getArea());
System.out.println(c2.getArea());
// 静态变量
System.out.println(c1.getArea());
System.out.println(c2.getArea());
System.out.println(Class.getArea());
}
}
2.可见性修饰符
2.1 声明包
可见性修饰符可以用于确定一个类以及它的成员的可见性。
可以在类、方法和数据域前使用 public 可见性修饰符,表示它们可以被任何其他的类访问。如果没有使用可见性修饰符,那么默认类、方法和数据域是可以被同一个包中的任何一个类访问的。这称作 包私有 (package-private) 或 包访问 (package-access)
包可以用来组织类。为了完成这个目标,需要在程序中出现下面这行语句,作为程序中第一条非注释和非空白行的语句。
如果定义类时没有声明包,就表示把它放在默认包中。
Java 建议最好将类放入 包中,而不要使用默认包。
package packageName;
2.2 变量和方法的可见性修饰符
- private私有的修饰符限定访问权限在它自己的类内
- 默认修饰符限定访问权限在包内
- public公共的修饰符可以无限定地访问
2.3 类的可见性修饰符
加public表示该类可以被任何类通过import访问。
不加则只能被包内的类访问,也称保留类。
值得注意的是public class 虽然可以被任何类访问,但若是所访问类中的方法不加public或者static,将会出现一个warning,所以当要访问其他包中的public类中的方法,则需要加上public或者static才能进行访问。
(引用原文链接:https://blog.csdn.net/qq_45766131/article/details/115567730)
2.4 私有构造方法
大多数情况下,构造方法应该是公共的。
但是,如果想防止用户创建类的实例,就该使用私有构造方法。例如:因为 Math 类的所有数据域和方法都是静态的,所以没必要创建Math类的实例。Math成为了一个提供方法的类,不用于创建对象,而是提供一些列的静态方法。
3.数据域封装
将数据域设为私有可以保护数据,并且使得类易于维护。
为了避免对数据域的直接修改,应该使用 private 修饰符将数据域声明为私有的,这称为数据域封装(datafield encapsulation)
私有数据域不能被对象从定义该私有域的类外访问。但是经常会有客户端需要存取、修改数据域。为了访问私有数据域,可以提供一个获取(getter)方法返回数据域的值。为了更新数据域,可以提供一个设置( setter)方法给数据域设置新值。获取方法也称为访问器(accessor), 而设置方法称为修改器(mutator)。
// 获取方法的函数签名
public returnType getPropertyName()
public boolean isPropertyName()
// 设置方法的函数签名
public void setPropertyName(dataType propertyvalue)
示例
Circle.java
public class Circle{
private double radius = 1;
public double getRadius(){
return radius;
}
public void setRadius(double r){
radius = (r>=0)?r:0;
}
}
Test.java
public class Test{
piblic static void main(String[] args){
Circle c = new Circle();
c.radius; // 错误,radius是私有的,外面拿不到
c.getRadius(); // 正确,getRadius()公有的,先通过公有的getRadius()“打入内部”,再在类内拿到私有的radius
}
}
4.对象参数,对象数组
给方法传递一个对象,是将对象的引用传递给方法
引用上的按值传参在语义上最好描述为按共享传参 (pass-by-sharing), 也就是说,在方法中引用的对象和传递的对象是一样的。
数组既可以存储基本类型值,也可以存储对象。
Circle[] circleArray = new Circle[10];
for(int i=0;i<10;i++)
circleArray[i] = new Circle(i);
5.不可变对象和类
通常,创建一个对象后,它的内容是之后允许改变的。有时候也需要创建一个一旦创建其内容就不能再改变的对象。我们称这种对象为不可变对象(immutable object), 而它的类就称为不可变类(immutable class)。例如:String 类就是不可变的。
如果一个类是不可变的,那么
- 所有数据域都是私有的。
- 没有修改器方法(公共的设置方法)
- 没有返回一个指向可变数据域的引用的访问器方法
6.变量的作用域
一个类中的实例变量和静态变量称为类变量 (class variable) 或数据域 ( datafield) 。在方法内部定义的变量称为局部变量。
**实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。**无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。
但是当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。如下:
public class A{
int i = 1;
int j = i + 1;
}
类变量只能声明一次,但是在一个方法内不同的非嵌套块中,可以多次声明相同的变量名。
如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏 ( hidden)(一般都是优先使用范围小的)。
7.this引用
关键字 this 是一个对象可以用来引用自身的引用名。可以用 this 关键字引用对象的实例成员。
7.1 使用 this 引用数据域
如果一个局部变量和一个类变量(实例变量和静态变量)具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。隐藏的静态变量可以简单地通过 ClassName.staticvariable引用。隐藏的实例变量可以使用关键字 this.variable来访问
class A{
public int a = 1;
public static int b = 2;
public void set(int a,int b){
this.a = a;
A.b = b;
}
}
7.2 使用 this 调用构造方法
关键字 this 可以用于调用同一个类的另一个构造方法。
class Person{
private age;
public Person(int age){
this.age = age;
}
public Person(){
this(1); // 调用前一个有参构造,传入1
}
}
Java 要求,在构造方法中语句 this(arg-list) 应在任何其他可执行语句之前出现。
如果一个类有多 个构造方法,最好尽可能使用this(参数列表) 实现它们。通常,无参数或参数少的构造方法可以用 this(arg-list) 调用参数较多的构造方法。这样做通常可以简化代码,使类易于阅读和维护