`
yyzhpq
  • 浏览: 290038 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

声明和访问控制

阅读更多

数组  

 

在 Java 代码中数组是动态创建的对象。一个数组可以包含若干个同类型的变量。这些变量可以是基本类型或者对象引用,一个数组甚至可以包含其他数组。

声明数组变量
声明数组变量时,代码创建一个变量用于包含对数组对象的引用。它不创建数组对象或者为数组元素分配空间。在声明时指定数组大小是非法的。方括号可以作为类型的一部分出现在声明的开始处,也可以作为数组标识符的一部分:


  int[] i;          // array of int
  byte b[];         // array of byte
  Object[] o,       // array of Object
  short s[][];      // array of arrays of short


构建数组
可以用 new 操作符构建一个数组。需要包括数组的大小和它所包含的元素的类型。对于多维数组,可以只指定第一维大小:


  int [] marks = new int[100]; 
  String[][] s = new String[3][];


初始化数组
数组的初始化值可以写成花括号中的一列由逗号分隔的表达式:


  String s[] = { new String("apple"),new String("mango") };
  int i[][] = { {1, 2}, {3,4} };


也可以用循环来初始化数组:


  int i[] = new int[5];
  for(int j = 0; j < i.length;j++)
  {
    i[j] = j;
  }


访问数组元素
数组索引是从 0 开始的,到 n-1 结束,其中 n 是数组大小。要得到数组大小,需要使用名为 length 的数组实例变量。如果试图访问 0 到 n-1 范围之外的索引值,那么就会抛出一个 ArrayIndexOutOfBoundsException。

声明类、变量和方法  

 

现在我们来看一下用于修饰类、方法和变量的方法。有两种修饰符 -- 访问修饰符和非访问修饰符。访问修饰符让我们可以对代码限制访问或者提供更多的访问。

类修饰符
可用的访问修饰符有 public、 private 和 protected。不过,一个顶级类只能有 public 和默认的访问级别。如果没有指定访问修饰符,那么这个类将具有默认访问。只有在同一包中的类可以看到具有默认访问的类。如果一个类被声明为 public,那么其他包中的类也可以访问它。

让我们看看一些类的非访问修饰符的效果。 final 关键词(关于关键词的更多内容请参阅 Java 关键词和标识符 ) 不允许对类进行扩展。 abstract 类不能实例化,但是可以被子类扩展:


  public final class Apple {..}
  class GreenApple extends Apple {}    // Not allowed, compile time error


方法修饰符和变量修饰符
所有访问修饰符都可以用于类的成员。私有成员只能从类内部访问。被保护的成员只能被同一包中的类或者该类的子类访问。公有成员可以被所有其他类访问。

如果没有指定访问修饰符,那么这些成员将具有默认访问,只有在同一包中的其他类可以访问它们。

现在我们来探讨可以用于成员声明的其他修饰符。其中一些只能用于方法,另一些只能用于变量,如下图所示:

图 1. 方法和变量的修饰符


synchronized 方法在某一时刻只能被一个线程访问。 Transient 变量不能被序列化。 abstract 方法不具有实现,它必须通过其包含类的第一个具体子类来实现。起码包含一个 abstract 方法的类必须声明为 abstract。不过, abstract 类不一定需要包含 abstract 方法:


  public abstract class MyAbstractClass
  {
    public abstract void test(); 
  }


native 修饰符表明这个方法不是用 Java 语言而是由一种本机语言编写的。 strictfp 关键词(关于关键词的更多内容请参阅 Java 关键词和标识符 )只用于方法和类,它强制使浮点符合 IEE754 标准。变量可以声明为 volatile,这种情况下,线程必须在每次访问这个变量时协调字段的工作副本与主副本。

Static 变量被类的所有实例所共享。可以在该类根本就没有任何实例的情况下使用 Static 方法和变量:


  class StaticTest
  {
    static int i = 0;
    static void getVar() 
      {
        i++;
        System.out.println(i);
      }  
  }
 
  class Test
  {
    public static void main(String args[])
      {
        StaticTest.getVar();
      }
  }

构造函数   在用类创建对象时使用构造函数。构造函数名必须与类名相匹配并且必须没有返回类型。它们可以被重载,但是不被子类继承。 调用构造函数 只能从其他构造函数中调用构造函数。要调用同一个类中的构造函数,用匹配的参数调用 this() 函数。要调用超类中的构造函数,用匹配的参数调用 super() 函数。创建子类对象时,按层次结构中从上到下的顺序调用所有超类的构造函数。 默认构造函数 如果没有在类中提供任何其他构造函数,编译器将创建默认构造函数。它没有任何参数。默认构造函数调用超类的无参数构造函数。它与类有同样的访问修饰符。 不过,哪怕在类中编写了一个构造函数,编译器就不会提供默认构造函数。例如,下面的类具有一个定义了两个参数的构造函数。这里如果我们试图不传递参数就实例化这个类,那么编译器将给出错误,因为没有默认构造函数:
  class Dot
  {
    int x, y;
    Dot(int x, int y)
    {
      this.x = x;
      this.y = y;
    }
  }

如果调用类的默认构造函数,而超类没有不带参数的构造函数,那么您的代码将不能编译。原因是子类的默认构造函数隐式地调用其超类的无参数构造函数。例如:
  class Dot
  {
    int x, y;
    Dot(int x, int y)
    {
      this.x = x;
      this.y = y;
    }
  }
  class MyDot extends Dot { }
  class Test
  {
    public static void main(String args[])
    {
      MyDot dot=new MyDot();
    }
  }
 小结   本节我们讨论了第一项目标中的重要概念。我们讨论了声明和构建一维及多维数组的有效方法。在了解方法和类的修饰符的效果时,一定要掌握修饰符的合法组合。例如,不能将一个 final 方法声明为 abstract。我们还学习了有关构造函数的内容。记住,编译器只有在您没有编写任何构造函数的情况下才会提供默认的无参数构造函数

练习 

 


问题:

编译和运行以下程序的结果是什么?


  class Box 
  {
    int b,w;
    void Box(int b,int w) 
    {
      this.b = b;
      this.w = w;
    }
  }
  
  public class MyBox extends Box
  {
    MyBox() 
    {
      super(10,15);
      System.out.println(b + "," + w);  
    }
    static public void main(String args[])
    { 
      MyBox box = new MyBox();
    }
  }


选项:

A. 不能编译,main 方法没有正确声明
B. 输出 10,15
C. 输出 0,0
D. 以上都不是
正确答案:

D
说明:

这个程序不能编译,因为对于子类构造函数中的 super(10,15) 调用,在基类中没有匹配的构造函数。 void Box(int b, int w) 不是构造函数,因为它给出了返回类型。如果它是一个构造函数,那么变量 w 和 h 将被初始化为 10 和 15。这个程序就可以正确编译并输出 10,15 。 在 main() 方法的声明中没有错误, static 和 public 可以以任何顺序出现。
 

分享到:
评论

相关推荐

    Windows Server 2012功能手册-动态访问控制

    从本质上讲,动态访问控制通过在Active Directory用户和计算机增加“声明”属性,集成到 Windows 授权模式当中。如果您已经在使用Active Directory域服务,Windows Server 2012当中的动态访问控制功能,将会给您提供...

    SCJP_认证考试指南(中文版).zip

     本书主要内容包括:声明和访问控制、面向对象、赋值和初始化、运算符、流程控制、异常和断言、I/O、格式化和解析、泛型、集合、内部类、线程和Java开发。书中在介绍考试要点时针对每个考试目标,使用了大量的插图...

    SCJP学习指南(chap1.pdf-----chap6.pdf)

     本书主要内容包括:声明和访问控制、面向对象、赋值和初始化、运算符、流程控制、异常和断言、I/O、格式化和解析、泛型、集合、内部类、线程和Java开发。书中在介绍考试要点时针对每个考试目标,使用了大量的插图...

    SCJP学习指南(chap7.pdf---chap9.pdf)

     本书主要内容包括:声明和访问控制、面向对象、赋值和初始化、运算符、流程控制、异常和断言、I/O、格式化和解析、泛型、集合、内部类、线程和Java开发。书中在介绍考试要点时针对每个考试目标,使用了大量的插图...

    SCJP学习指南完整版pdf共18章

     本书主要内容包括:声明和访问控制、面向对象、赋值和初始化、运算符、流程控制、异常和断言、I/O、格式化和解析、泛型、集合、内部类、线程和Java开发。书中在介绍考试要点时针对每个考试目标,使用了大量的...

    java认证考试资料

    .. &lt;br&gt;【目录信息】 第一部分 准备程序员考试 第1章 程序员考试指南 1 1.1 程序员考试的形式是什么 2 1.2 考试包含哪些内容 2 1.2.1 声明和访问控制 2 1.2.2 流控制和异常处理 2 ...

    Java2认证考试辅导资料

    .. &lt;br&gt;【目录信息】 第一部分 准备程序员考试 第1章 程序员考试指南 1 1.1 程序员考试的形式是什么 2 1.2 考试包含哪些内容 2 1.2.1 声明和访问控制 2 1.2.2 流控制和异常处理 2 ...

    java认证考试辅导资料

    .. &lt;br&gt;【目录信息】 第一部分 准备程序员考试 第1章 程序员考试指南 1 1.1 程序员考试的形式是什么 2 1.2 考试包含哪些内容 2 1.2.1 声明和访问控制 2 1.2.2 流控制和异常处理 2 ...

    J2EE学习笔记

    3.2:声明和访问控制 120 3.3:运算符和赋值 121 3.4:流程控制、异常处理和断言 121 3.5:面向对象、重载和重写、构造函数和返回类型 121 3.6:Java.lang-----Math类、字符串和封装类 121 3.7:对象和集合 121 3.8...

    【后端】java基础(5.3)java高级基础之java的修饰符——访问控制符

    访问控制符:访问控制符的作用是说明被声明的内容(类、属性、方法和构造方法)的访问权限 我们的访问控制符有四种: public protected 不修饰 private 这里有一张经典的表可以说明他们的作用范围: 访问控制符 同一类...

    论文研究-一种灵活的访问控制策略及其应用研究.pdf

    提出了一种声明式的、面向对象的、灵活访问控制策略的形式化描述、决策算法和实施框架。与传统访问控制策略相比,它包含授权类型、主体、权限、限制、影响等策略元素,能够更加精确地描述各类控制需求;同时,提出的...

    SCJP 中文大纲sun JAVA2认证程序员 平台1.4

    第一部分:声明和访问控制 第二部分:流程控制,断言和异常处理 ........ 第九部分:集合类框架

    Java类的修饰符、访问控制符

    实验目的 理解掌握Java类修饰符、访问控制符等;理解熟悉String类的equals方法和= =运算符;进一步熟悉面向对象基本概念;熟悉Java中对象声明、创建、访问、参数传值等基本语法;

    action_access, 面向 Ruby on Rails的访问控制系统.zip

    action_access, 面向 Ruby on Rails的访问控制系统 操作访问 动作存取为模块,concise concise,真正收费使用访问控制系统的Access 。 它允许安全地保护应用程序和处理权限。关注当前用户可以访问的操作,而不是干扰...

    网格服务中基于XACML和SAML的安全访问控制

    为了解决网格环境下资源访问控制存在的安全性问题,通过分析可扩展访问标记语言XACML、安全声明标记语言SAML及其相关技术,提出了一个基于XACML和SAML的访问控制模型。模型采用可扩展访问标记语言XACML描述访问控制...

    role-acl:使用操作,属性以及同步和异步条件的基于角色的访问控制

    基于角色,属性和条件的Node.js访问控制 npm i role-acl --save 许多 (基于角色的访问控制)实现方式不同,但是由于它模拟了现实中的角色(工作)分配,因此已广泛采用了基础知识。 但是,尽管数据变得越来越复杂...

    论文研究-基于XACML的Web服务访问控制模型.pdf

    采用基于用户、资源和环境属性而不是用户身份的授权机制,可提供更细粒度的访问控制和保护隐私;采用XACML、SAML标准,既可满足分布式环境下的互操作性,又特别适合于Web服务的动态性、异构性等特点。

    SimonSays::guard:用于Rails和Ruby的简单,基于声明的基于角色的访问控制系统

    这个gem是Rails的一个简单的,基于声明的,基于角色的访问控制系统,可以很好地配合设计!安装可以通过您的Gemfile安装SimonSays。 gem 'simon_says'用法SimonSays包含两个部分: 模块mixin,它提供一种方法来定义...

    Java关键字及其作用

    private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。 只能在声明private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 所有类...

    Linux高级路由和流量控制

    2.5. 访问,CVS和提交更新 4 2.6. 邮件列表 4 2.7. 本文档的布局 4 第3章 介绍 IPROUTE2 6 3.1 为什么使用 IPROUTE2 6 3.2 IPROUTE2 概览 6 3.3 先决条件 6 3.4 浏览你的当前配置 7 3.4.1. 让ip显示我们的...

Global site tag (gtag.js) - Google Analytics