Java类修饰符

在Java中,可用于修饰类的修饰符(Modifier)有如下几类:

  • public、protected、(package)、private。这四个为访问修饰符。
  • abstract。 抽象类,不能被实例化。
  • static。静态类,只有一个实例。
  • final。限制类不能被继承。
  • strictfp。控制浮点类型为strict。
  • Annotations。标注。
下面具体介绍上面的前四种情况,strictfp和Annotations在这里不做介绍。

1. 访问控制符
这四个访问控制符用于限制类能被访问的范围,被public修饰的类在任何地方都可以使用。需要注意的是,public只能用于修饰top-level的类和member class。所谓top-level class,从形式上最直观的的理解就是在源代码中,它的生命是顶格开始的,不包含在任何其他类当中。member class也容易理解,我们一般说类的成员包括域和方法,其实在类当中,还可以包含许多其他内容,比如:
静态初始化块(static initialize block):static { ... }
实例初始化(instance): { ... }
再有就是member class,这些都是跟域和方法并列的。

更进一步,为了更清楚地了解Java语言中类有哪几种,我们对类进行一下划分,如下图所示:


top-level和member已经在上面说过,Nested类直观上来说,就是类的源码是在其他类之中的,内嵌在其他类里边。而在内嵌类当中,跟域和方法并列的类称为member class。member有可以分为static和non-static,被static修饰的member 就叫static nested class,而除了static nested class以为的其他所有nested class都称为inner class,包括non static member和其他不与类和方法并列的内嵌类,比如local class和anonymous,这两种类都是在block中声明的,区别在于anonymous没有类名,只能使用一次。

关于各种类型的class一个示例如下:
import java.lang.reflect.Modifier;

/**
 * @author Brandon B. Lin
 * 
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		printAllClassModifiers();

	}

	private static void printAllClassModifiers() {
		System.out.println(Modifier.classModifiers());

	}

	interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
	
	
	public void validatePhoneNumber() {

		// local class
		abstract class PhoneNumber {

		}
		
		// anonymous class
		HelloWorld frenchGreeting = new HelloWorld() {
			String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };
		
		

	}

	// non static member class
	public abstract class NonStaticMember {

	}

	/**
	 * static 修饰class时只能修饰member class
	 */
	// static member class
	public abstract static class StaticMember {

	}
	
	
	/**
	 * protected and private用于修饰类的时候只能修饰member class
	 */
	protected abstract class TT {
		
	}
	
	private abstract class PP {
		
	}

}


看完class的分类,回到访问修饰符来。
protected这一修饰符用于修饰class时,只能修饰member class。所以它的使用范围就包括它的外部类(因为只能修饰member)所在的包以及外部类的子类。
private修饰class时一样只能修饰member class,能使用它的只有它的外部类。当然也包括它本身。
没有访问控制符,也叫包可见。

2. 抽象类
抽象类用abstract修饰,但不是说没有abstract就不是抽象类,比如继承了抽象类但还有某些抽象方法没有实现。抽象类不能被实例化,它是介于接口(全部方法都是抽象的)和类(全部方法都不是抽象的)之间。关于抽象类有许多内容需要掌握,这里不展开。

3. static类
static一般而言表示只有一个副本,属于类而不输于某个实例,所有实例共享静态成员。static修饰类的时候也只能用于修饰member class,表示这一成员属于其外部类所有,外部类的实例共享这一成员类。

4. final类
被final修饰的类不能被继承。所以final和abstract不能同时出现。
另外,如果不想让自己的类被继承,另一种方式是将你的构造器设置为private,需要强调的是必须所有构造器都是private,如果你想彻底杜绝被继承的话。也就是说,必须让外界(除了本类之外的所有源代码中)无法对该类的构造器进行直接的调用(可以通过其他重载的构造器调用private的构造器,实现间接调用.也可以通过这个类的static方法创建对象)。也就是说,将所有构造函数声明为private,意味着只能在本类中实例化该类。但是在这个类之外,一样可以通过静态方法得到一个该类的对象。如果你没有显式提供任何构造器,那么就会使用默认的构造器,默认构造器是public的。总结一下,不让某个类被继承有两种方法,1)使用 final修饰该类 2)使用private的构造器。
对于第二种方式,可以通过如下步骤来达到目的
a. 提供自己的构造器,使得默认构造器消失。
b. 将所有构造器(如果重载的话)设为private。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值