实例成员
- 不用static修饰的成员称为实例成员,它们属于对象(每个对象一份),通过对象访问,不能通过类。
- 实例属性的初始化通常在定义时进行或在构造函数中进行。
- 类内部,实例成员可以在实例方法中直接访问(成员前用this指代当前对象,可以省略,但当局部变量和成员变量重名时,this不能省略),不能在静态方法中直接访问,(静态方法中是不允许出现this的),这就解释了为什么被main方法直接调用的方法前要加static。
静态成员
- 用static修饰的类成员称为静态成员(或类成员),它们属于类(只有一份,被多个对象共享),通过类访问,也可以通过对象访问。
- 类内部,静态成员可以通过静态方法直接访问(成员前省略类名),也可以在实例方法(包括构造方法,省略this)中直接访问。
例子:
1、
public class Main {
public static void main(String args[]) {
Value1 v1 = new Value1(1, 2);
Value1 v2 = new Value1(3, 4);
System.out.println(v1.x + " " + v1.y);
System.out.println(v2.x + " " + v2.y);
}
}
class Value1 {
static int x;
int y;
Value1(int a, int b) {
x = a;
y = b;
}
}
其运行结果为:
其原因是什么?
静态变量x看最后一次了执行的结果。
补充
1、class的限定public 默认 abstract final
2、属性的限定public protected 默认 +static:实例属性与静态属性
类符号常量:public static final double PI=3.1415926
一般建议private,那只能在本类中访问,如何做到在其它类中也可以使用呢?
类的成员属性setter方法与getter方法,方便在其它类中读取或者设置
private int x;
public int getX()
{
return this.x;
}
public void setX(int x)
{
this.x=x;
}
3、方法的限定public protected 默认 +static:实例方法与静态方法
4、实例属性的访问与实例方法的调用
实例属性的访问与实例方法的调用都是通过对象实例来实现的,格式:对象名.属性名 对象名.方法名()
(1)在当前类内部使用
用this代表当前对象【this可以省略,但如果形参与成员变量重名时,必须使用this】
public class B {
private int a;
public int x;
public int sum()
{
return a+x;
}
public void setX(int x)
{
this.x=x;
}
public void callSum()
{
System.out.println("和为:"+this.sum());
}
}
(2)在其它类中调用
先实例化对象后才能用
5、静态属性的访问与静态方法的调用
静态属性的访问与静态方法的调用都要通过类名实现,格式为:类名.属性变量 类名.静态方法()
注意静态方法中成员变量或方法的调用:
在静态方法的方法体内,只能访问自身的静态属性和调用自身为中其它静态方法。
public class D {
private static int x;
private int y;
public static void callSum()
{
int z=D.x+this.y; //错误,静态方法中没法调用实例成员
}
}
public class D {
private static int x;
private int y;
public int sum()
{
return D.x+this.y;
}
public static void callSum()
{
setX();
this.sum();//错误,在静态方法中无法调用实例方法
}
public static void setX()
{
D.x=190;
}
}
(1)在当前类内部使用:可以省略类名
public class D {
private static int x;
private int y;
public static void main(String[] args) {
D d=new D(12,14);
System.out.println(d.sum());
}
public D(int x,int y)
{
D.x=x;
this.y=y;
}
public int sum()
{
return D.x+this.y;
}
}
(2)在其它类中调用:类名.方法名()
6、类的构造方法
注意:如果没有定义构造方法,则系统默认创建一个无参构造方法,如果定义了带参数的构造方法,其默认的构造方法最好显式给出。
构造方法中可以调用构造方法,不过要用this方法,且只能放在第一行。
public class Emp {
private String name;
private int age;
public Emp(String name,int age){
this.name=name;
this.age=age;
System.out.println("Emp1 is called");
}
public Emp(String name) {
this(name,20);
System.out.println("Emp2 is called");
}
public Emp() {
this("张三",20);
System.out.println("Emp3 is called");
}
public static void main(String[] args) {
new Emp("zhang");
}
}
其运行结果为: