Java访问权限控制中,友好变量或方法能在类内部、本包中使用,不能在子类及包外使用,但请看下面代码:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java访问权限控制中,友好变量或方法能在类内部、本包中使用,不能在子类及包外使用,但请看下面代码:相关的知识,希望对你有一定的参考价值。
"此程序在类A中定义了友好变量a,然后Java1类继承类A,在Java中可以使用A的友好变量a”,也就是说友好变量可以在其子类中使用,请问我错在哪里?
class A
int a = 10;
public class Java1 extends A
public static void main(String[] args)
A a = new A();
System.out.println(a.a);
Java1 one = new Java1();
System.out.println(one.a);
首先java关于成员的封装关键字有三个:public、protected和private。
但是成员的封装等级有四种,除了上面三个外,还有一个是没有加“封装”关键字的等级。
就像你在class A中的int a一样。
这个int a可以是 public int a;或者protected int a; 或者private int a;还可以直接int a;
这代表了这个成员的四种封装等级。
程序中的a没有加关键字,则是一种被称为“package”的等级,这种等级的可见度是class和package,但是对于subclass是不可见的。
所以程序中,java1虽然继承了A类,但是父类中的成员a已经在子类中变为不可见的了,所以你在子类中用到A中的a就错了:System.out.println(one.a);
修改的办法是将class A改为:
class A
public int a = 10; //public和protected都可以
追问
非常感谢您的关注,但是在eclipse下,是能够正确输出的,System.out.println(one.a)位置也没有警告或错误提示,就点有点疑问。请指教
参考技术A 首先 在java中没有“友好变量”的感念在A类中声明的int a 前面没有加修饰符,默认为default 相当于
default int a=10;
表示在同一个包下可以被访问,你检查一下A类和Java1类是否在同一个包下
如果只是想要在派生类中被访问,请使用protected修饰符,像这样定义:
protected int a=10;
附:
java的访问权限修饰符:
public:任何地方都能访问
protected:在本类或其派生类中可以访问
default:在同一个包下可以被访问
private:只能在本类中被访问 参考技术B 这段代码是正确的啊,java默认的变量修饰符是default类型的,如果不在同一个包下的子类也不能访问追问
但是java访问控制总结中,都是这样的:
类内部 本包 子类 外部包
default YES YES No No
而且,上面的代码确实是在子类中使用了父类的default变量,非常感谢您的关注,请指教
修饰符 内部类 本包 同一包下的子类 不同包下的子类 外部包
default YES YES YES NO NO
你的这段代码是在同一个类中的,所以正确
java内部类
内部类
指的是在Java中可以将一个类定义在另一个类的内部;
内部类可以定义在 类的内部(与类成员层次一致)
内部类可以定义在 方法/块内部(与类成员相差一个层次 方法的局部变量一个层次)
*1.成员内部类
将一个类直接定义在类的里面,作为成员,与属性或方法层次一致;
成员内部类可以与正常类一样 使用不同的修饰符来修饰;
好处1.省略了一个.java文件;2.成员内部类中可以访问外部类的所有成员 包括私有的;
若想要在内部类中通过对象.调用外部类成员 外部类.this.外部类成员(属性/方法);
创建内部类对象;通过外部类对象创建;
内部类存在后 源代码进行编译 产生一个字节码 Demo$Include.class 外部类$内部类.class
2.局部内部类
将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
局部内部类像是一个局部的变量一样,不能用public protected private 及static
只能用abstract或final
含局部内部类的字节码文件,如, Demo$1InnerTestMethod.class 外部类$1内部类.class(因为局部内部类可以重名,所以加数字)
局部内部类 使用的变量只能是final修饰;编译 字节码定义好啦 由于变量的内容是可以改变
*3.匿名内部类
成员匿名内部类
局部匿名内部类
通常是接口或抽象类的具体子类这样写;
开发中为了省略一个类文件 上述写法比较常见;
匿名内部类很特殊 只有类体 没有类的所有结构 (修饰符 名字 继承 实现)
不能用任何修饰符来修饰 匿名内部类也没有构造方法;
如,做一个按钮 绑定一个时间监听器;
4.静态内部类
成员静态内部类
不需要外部对象,通过正常的方式直接创建内部类;
静态元素不能方法非静态成员(自己类和外部类都不可以)
package innerclass; public class Demo{ private String name="Demo类属性"; { } public void testDemo(){ System.out.println("testDemo类"); } public void testDemoOne(){ String s="abc"; class InnerTestMethod{ String xx=s; }//局部内部类;该方法完,则回收 System.out.println("testDemo类"); } /* public void testDemoTwo(){ class InnerTestMethod{ }//局部内部类;该方法完,则回收 System.out.println("testDemo类"); } */ public class Include{ private String name="内部类属性"; public void testInner(){ System.out.println("testInner中=;;"+Demo.this.name); System.out.println("testInner中-;;"+this.name); Demo.this.testDemo(); testDemo(); } }//成员内部类; public static class InnerDemo{ }//静态成员内部类 }
package innerclass; import innerclass.Demo.Include; import innerclass.Demo.InnerDemo; public class Test{ public static void main(String[] args){ Demo a=new Demo(); //Demo.Include b=a.new Include(); //Include b=a.new Include(); Include b=new Demo().new Include(); b.testInner(); InnerDemo c=new InnerDemo(); } }
以上是关于Java访问权限控制中,友好变量或方法能在类内部、本包中使用,不能在子类及包外使用,但请看下面代码:的主要内容,如果未能解决你的问题,请参考以下文章
在类内部具有 get 和 set 访问权限但在类外部只能在 Swift 中访问的类变量? [复制]