0
点赞
收藏
分享

微信扫一扫

【java】实例成员和静态成员

颜娘娘的碎碎念 2022-03-26 阅读 59
java

实例成员

  • 不用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");
	}
}

其运行结果为:
在这里插入图片描述

举报

相关推荐

0 条评论