正文
java中的非静态代码块 java静态代码块和非静态代码块
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
那里出错了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中main方法里面调用非静态方法。
静态方法只能直接访问静态成员java中的非静态代码块,无法访问非静态成员java中的非静态代码块,如果想要访问非静态方法,则实例化该类对象,使用对象名.非静态方法()java中的非静态代码块的方式来访问java中的非静态代码块!
static是一种访问修饰符,在java中可以修饰代码块、方法和属性
1、静态块java中的非静态代码块:用于在类加载之前完成一些初始化操作,仅会执行一次
2、静态方法:可以使用类名和对象调用,只能直接访问静态成员,无法访问非静态成员
3、静态属性:可以使用类名和对象名调用,多个对象共享
Java的静态块和初始化块分别何时执行?有什么区别?
静态初始化块:当类第一次加载时执行。
非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。
区别如下:
1、执行次数不同
静态块只执行一次,初始化块可以执行多次。
2、作用不同
静态初始化块仅能初始化类变量,即static修饰的数据成员。
非静态初始化块可以初始化类的实例变量。
扩展资料:
使用Java静态代码块注意事项:
1、它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
2、静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
3、静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
4、一个类中可以有多个静态代码块。
5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)(变量、初始化块)构造器。
java 中静态代码和非静态代码块的区别!
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
一般在代码块中对一些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("普通方法中的代码块!");
}
}
}
//测试类
public class TestClass {
/**
* 区别两次new静态与非静态代码块执行情况
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
运行输出结果是:
静态代码块!--非静态代码块!--默认构造方法!--普通方法中的代码块!
非静态代码块!--默认构造方法!--普通方法中的代码块!
*/
java 继承父类 是会先执行父类吗
java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。
public class FatherTest {
private String name;
FatherTest(){
System.out.println("--父类的无参构造函数--");
}
FatherTest(String name){
this.name=name;
System.out.println("--父类的有参构造函数--"+this.name);
}
static{
System.out.println("--父类的静态代码块--");
}
{
System.out.println("--父类的非静态代码块--");
}
public void speak(){
System.out.println("--父类的方法--");
}
}
加入一个main程序后
public static void main(String[] args) {
System.out.println("--父类主程序--");
FatherTest father=new FatherTest("父亲的名字");
father.speak();
}
执行结果为:
--父类的静态代码块--
--父类主程序--
--父类的非静态代码块--
--父类的有参构造函数--父亲的名字
--父类的方法—
可以很明显的看出来执行顺序:静态代码块—主程序—非静态代码块—构造函数—一般方法。
如果加入子类的继承以后,情况就会变得复杂些。比如我们再新建一个测试子类。
public class SonTest extends FatherTest {
private String name;
static{
System.out.println("--子类的静态代码块--");
}
{
System.out.println("--子类的非静态代码块--");
}
SonTest(){
System.out.println("--子类的无参构造函数--");
}
SonTest(String name){
this.name=name;
System.out.println("--子类的有参构造函数--"+this.name);
}
@Override
public void speak(){
System.out.println("--子类Override了父类的方法--");
}
}
然后再加入一个main函数
public static void main(String[] args) {
System.out.println("--子类主程序--");
FatherTest father=new FatherTest("父亲的名字");
father.speak();
SonTest son=new SonTest("儿子的名字");
son.speak();
}
执行结果为:
--父类的静态代码块--
--子类的静态代码块--
--子类主程序--
--父类的非静态代码块--
--父类的有参构造函数--父亲的名字
--父类的方法--
--父类的非静态代码块--
--父类的无参构造函数--
--子类的非静态代码块--
--子类的有参构造函数--儿子的名字
--子类Override了父类的方法--
加入了子类以后,执行顺序有了新的变化,我们可以总结一下。首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。
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中的非静态代码块和java静态代码块和非静态代码块的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。