那里出错了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静态代码块和非静态代码块】关于java中的非静态代码块和java静态代码块和非静态代码块的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 包含js动态更新数据库数据类型的词条
- 游戏键位模拟,手机游戏按键模拟
- 包含368棋牌游戏中心的词条
- java背景移动代码 java设置背景图片代码
- 下载的的打车,下载打车软件哪个好
- excel如何重复命名,怎样将excel重复的名字汇总名字
- 西瓜直播录屏,西瓜视频直播怎么录屏
- 怎么连上mysql数据库 mysql怎样连接数据库
- oracle的安装注意事项,oracle安装总结