java 中自定义类位置以及修饰符等引发的问题

本文详细解析了Java中类的定义规则,包括与文件名相同类的public修饰要求及限制,自定义类的位置规范,以及内部类的使用场景与注意事项。通过具体的代码示例,阐述了静态方法调用动态内部类时可能出现的问题及其解决办法。

1:正确的形式

Text.java文件:

package lei.com.cn;

 public class Test {
  
     void fun(Mytype j)
    {
        j.a=2;
        System.out.println("fun函数后复杂数据类型参数j的值:"+j.a);
    }    
    
    public static void main(String[] args) {
        Mytype type=new Mytype();
        System.out.println("初始阶段复杂数据类型type的值:"+type.a);
        Test test=new Test();
        test.fun(type);
        System.out.println("调用函数后type的值:"+type.a);
        
    }
}

 class Mytype{
    public int a;
    public Mytype(){
        a=1;
    }
}

说明与文件名相同的类必须定义为Public 如上图public class Test,如果没有public虽不会报错,但一般系统默认自动生成public修饰符。

 

而自定义的类,注意位置不是内部类。不能是public,不然会报错“The public type Mytype must be defined in its own file”。

所以说一个Java文件中至多有一个public类。当有一个public类时,源文件名必须与之一致,否则无法编。

2.这种情况

package lei.com.cn;

 class Test {

     void fun(Mytype j)
    {
        j.a=2;
        System.out.println("fun函数后复杂数据类型参数j的值:"+j.a);
    }    
    
    public static void main(String[] args) {
        Mytype type=new Mytype();
        System.out.println("初始阶段复杂数据类型type的值:"+type.a);
        Test test=new Test();
        test.fun(type);
        System.out.println("调用函数后type的值:"+type.a);
    }
    class Mytype{
        public int a;
        public Mytype(){
            a=1;
        }
}

 
}

绿色背景的地方会报错:

“No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosing instance of type Test (e.g. x.new A() where x is an instance of Test).”

此时自定义的Mytype类型属于Text的内部类

而main()方法是静态的,当

因为myType是一个动态的内部类,创建这样的对象必须有实例与之对应,程序是在静态方法中直接调用动态内部类会报这样错误。 

这样的错误好比类中的静态方法不能直接调用动态方法。可以把该内部类声明为static。或者不要在静态方法中调用。

至于为什么静态方法只能访问静态变量?我的理解是:

这与静态数据的存放位置和绑定机制有关,JAVA是动态绑定的,只有到运行的时候才真正知道要去找哪个成员的实现,
而把数据成员声明成静态的则是实现"静态绑定"的一种方法,这就是为什么声明成静态的可以提高速度的原因了.
因为静态函数也归署于静态绑定(事先就知道我要用的变量在哪),所以他只能访问静态变量!

 

 

 

转载于:https://www.cnblogs.com/Yogurshine/archive/2013/04/11/3014195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值