1. 访问修饰符(access modifier)
1)public(公共的):被public所修饰的属性和方法可以被所有类访问。
如一个类:com.test.A ,另外一个类:com.test.hello.B 在类B下面把A的包导入进来就都可以访问了。
2)protected(受保护的):被protected所修饰的属性和方法可以在类内部、相同包以及该类的子类所访问(这个地方注意容易混淆,是在该类的子类内部访问这个属性)
程序一:
程序二:package com.shengsiyuan; public class C{ protected int year = 2012; }
编译执行:package com.shengsiyuan; public class D{ public static void main(String[] args){ C c = new C(); System.out.println(c.year); } }
D:\src>javac -d . C.java
D:\src>javac -d . D.java
D:\src>java com.shengsiyuan.D
2012
【说明】:protected定义属性,同一个包下能被访问。
继续修改以上两个例子
程序一:
package com.shengsiyuan; public class C{ protected int year = 2012; }
程序二:
编译执行:package com.shengsiyuan.test; import com.shengsiyuan.C; public class D{ public static void main(String[] args){ C c = new C(); System.out.println(c.year); } }
D:\src>javac -d . D.java
D.java:7: 错误: year可以在C中访问protected
System.out.println(c.year);
^
1 个错误【说明】:protected定义属性,不同包下不能被访问。
继续修改这两个程序:
程序一:
程序二:package com.shengsiyuan; public class C{ protected int year = 2012; }
编译结果:package com.shengsiyuan.test; import com.shengsiyuan.C; public class D extends C{ public void output(){ System.out.println(year); } public static void main(String[] args){ D d = new D(); System.out.println(d.year); } }
D:\src>javac -d . C.java
D:\src>javac -d . D.java
D:\src>java com.shengsiyuan.test.D
2012
【说明】:protected定义的属性,可以在该类的子类所访问,意思是可以被子类继承下来作为属性来使用。注意此处与下面两个程序进行比较。下面这个程序是在子类中生成父类的对象然后访问父类的属性,这两个是不一样的。
【注意】:被protected所修饰的属性和方法可以被该类的子类所访问的意思是说可以在该类的子类内部所访问,以下程序,虽然是在其子类生成对象,但最终还是调用C类的属性,所以意思是不同,这一点容易出错。
程序一:
程序二:package com.shengsiyuan; public class C{ protected int year = 2012; }
编译结果:package com.shengsiyuan.test; import com.shengsiyuan.C; public class D extends C{ public static void main(String[] args){ C c = new C(); System.out.println(c.year); } }
D:\src>javac -d . C.java
D:\src>javac -d . D.java
D.java:7: 错误: year可以在C中访问protected
System.out.println(c.year);
^
1 个错误
3)private(私有的):被private所修饰的属性和方法只能在该类内部使用,就是属性和方法不能被继承下来。
4)默认的(不加任何访问修饰符):在类内部以及相同包下面的类所使用。
程序一:
package com; public class A{ int a = 10; }
程序二:
package com.shengsiyuan; import com.A; public class B{ public static void main(String[] args){ A a = new A(); System.out.println(a.a); } }
编译结果:
D:\src>javac -d . A.java
D:\src>javac -d . B.java
B.java:7: 错误: a在A中不是公共的; 无法从外部程序包中对其进行访问
System.out.println(a.a);
^
1 个错误
【说明】:a不加任何修饰符,即是默认的,就是在类内部以及相同包下面的类所使用。
2. instanceof: 判断某个对象是否是某个类的实例。语法形式:引用名instanceof类名(接口名),返回一个boolean值。
public class InstanceofTest{
public static void main(String[] args){
People people = new People();
System.out.println(people instanceof People);
}
}
class People{
}
编译结果:
D:\src>java InstanceofTest
true
修改程序如下:
public class InstanceofTest{
public static void main(String[] args){
People people = new Man();
System.out.println(people instanceof People);
}
}
class People{
}
class Man extends People{
}
编译结果:D:\src>java InstanceofTest
true
【说明】:People people = new Man(); System.out.println(people instanceof People); //结果为true,因为Man是People的子类,根据继承,子类就是父类,因此Man也可以看作是People的实例。