java,静态方法为什么不能调用类成员?楼主想问的应该是不用调用成员变量吧
首先,这涉及到代码执行优先级的问题,在一个Java类中,存在的代码形式有静态代码块(花括号{}包裹住的代码片段),静态方法,构造函数,成员方法 。不同形式的代码执行顺序不同:
1、静态代码块:当类被载入时 , 静态代码块被执行,且只被执行一次,静态代码块常用来执行类属性的初始化 。
2、静态方法(也叫类方法):在类加载的时候,在不创建对象的情况下执行,可以直接用类名调用 。
两者的区别是静态代码块是主动执行的,静态方法是被动执行,只有被调用时才执行 。
3、构造函数在创建对象的时候执行 。
4、成员方法在被调用的时候执行 。
总结:Java代码执行先后顺序:静态代码块静态方法构造函数=非静态代码块 。
在了解执行顺序后,楼主的问题就很容易解答了 。
从层级上看,静态方法属于类级别,成员变量属于对象级别 。同时静态方法也先于构造函数执行,内存也没给类成员分配空间,说白就是都不存在,你静态方法调用一个不存在的变量肯定不行的呀 。
java中main方法里面调用非静态方法 。静态方法只能直接访问静态成员,无法访问非静态成员,如果想要访问非静态方法,则实例化该类对象,使用对象名.非静态方法()的方式来访问!
static是一种访问修饰符 , 在java中可以修饰代码块、方法和属性
1、静态块:用于在类加载之前完成一些初始化操作 , 仅会执行一次
2、静态方法:可以使用类名和对象调用,只能直接访问静态成员 , 无法访问非静态成员
3、静态属性:可以使用类名和对象名调用,多个对象共享
Java的静态块和初始化块分别何时执行?有什么区别?静态初始化块:当类第一次加载时执行 。
非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行 。
区别如下:
1、执行次数不同
静态块只执行一次,初始化块可以执行多次 。
【java非静态代码快 java静态和非静态】2、作用不同
静态初始化块仅能初始化类变量,即static修饰的数据成员 。
非静态初始化块可以初始化类的实例变量 。
扩展资料:
使用Java静态代码块注意事项:
1、它是随着类的加载而执行,只执行一次 , 并优先于主函数 。具体说 , 静态代码块是由类调用的 。类调用时,先执行静态代码块 , 然后才执行主函数的 。
2、静态代码块其实就是给类初始化的 , 而构造代码块是给对象初始化的 。
3、静态代码块中的变量是局部变量 , 与普通函数中的局部变量性质没有区别 。
4、一个类中可以有多个静态代码块 。
5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)(变量、初始化块)构造器 。
java 中静态代码和非静态代码块的区别!相同点:都是在JVM加载类时且在构造方法执行之前执行java非静态代码快,在类中都可以定义多个java非静态代码快,
一般在代码块中对一些static变量进行赋值 。
不同点:静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法) 。
静态代码块只在第一次new执行一次 , 之后不再执行,而非静态代码块在每new
一次就执行一次 。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行 。
例:
//普通类
public class PuTong {
public PuTong(){
System.out.print("默认构造方法!--");
}
//非静态代码块
{
System.out.print("非静态代码块!--");
}
//静态代码块
static{
System.out.print("静态代码块!--");
}
public static void test(){
{
System.out.println("普通方法中java非静态代码快的代码块!");
}
}
}
//测试类
public class TestClass {
/**
* 区别两次new静态与非静态代码块执行情况
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
运行输出结果是:
静态代码块!--非静态代码块!--默认构造方法!--普通方法中的代码块!
非静态代码块!--默认构造方法!--普通方法中的代码块!
*/
java 调用静态方法和构造函数和静态块执行的先后顺序java中首先是静态块先执行,静态方法,最后是构造函数 。示例如下:
public class ExA {
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
那里出错了Java你可以将
{
Point p=new Point();
p.x=4;
System.out.println(p.x);
p.y=5;
System.out.println(p.y);
}
代码块,做为非静态代码块,放到Rectangle类或者Main类或者Point类中,编译就能通过了,但是依据题意,还是应该放到Rectangle类或者Main类中为好,因为可以调用它,放到Point类中,没有类调用它这段代码了 。完整的Java程序如下
public class Main {
public static void main(String[] args) {
Rectangle rect=new Rectangle();
rect.width=100;
System.out.println(rect.width);
rect.height=200;
System.out.println(rect.height);
Rectangle rect2=new Rectangle();
rect2.width=10;
System.out.println(rect2.width);
rect2.height=20;
System.out.println(rect2.height);
}
}
class Rectangle
{
int width;
int height;
{
Point p=new Point();
p.x=4;
System.out.println(p.x);
p.y=5;
System.out.println(p.y);
}
}
class Point
{
int x;
int y;
}
运行结果
4
5
100
200
4
5
10
20
因为是非静态代码块在Rectangle类中,所以每建一个Rectangle对象,都会执行一次非静态代码块,所以Point类的打印被执行了两次 。
关于java非静态代码快和java静态和非静态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 怎么开发下一代电脑软件,如何开发一个新系统
- 新媒体如何加强党支部建设,新媒体 党建
- 微信摇一摇游戏开发,微信摇一摇程序
- 关于python函数参数是点的信息
- 头条上都用什么拍视频,头条上都用什么拍视频软件
- thinkphp分页参数p,php分页思路
- 申请抖音直播要几条视频,申请抖音直播要几条视频呢
- 数据库怎么连mysql 数据库怎么连接idea
- jquery类型,jquery常用方法及作用