zoukankan      html  css  js  c++  java
  • Java源程序结构

    完整的java源程序应该包括下列部分

    1.package语句

    l java编译器为每个类生成一个字节码文件,且文件名与类名相同,这就会带来一个问题:同名的类会发生冲突。

    所以package的两个主要作用就呼之欲出了:管理类,解决命名冲突。

      例如:package com;public class Test{}

            package cn;public class Test{}

        虽然以上两个类同名,但是并不会出现命名冲突;也可以理解为其实包名就相当于一个人的姓氏,而类名就相当于一个人的名;而一个人的姓名是姓+名;所以以上两个类

      的全称分别是:com.Test、cn.Test;当然就不会出现命名冲突了;

    l 一般地,我们将具有相同功能的类放在一个package中。

    2.import语句

    l import 代表此类中需要引入和封装的包,一般置顶。

    1,加载已定义好的类或包
    2,导入支持类(可以是JDK基础类或者自己编写的类),可以供本类调用方法和属性。

    l import导入声明可分为两种: 
        1,单类型导入(single-type-import) 例:import java.util.ArrayList;  
        2,按需类型导入(type-import-on-demand)   :import java.util.*;

    l Import的使用主要是为了偷懒。Java为了解决命名冲突使用了package来管理类,那么问题就来了,如果在写代码的时候都使用类的全称,例如一下这样: 

    java.io.InputStream is = java.lang.System.in;
    java.io.InputStreamReader isr= new java.io.InputStreamReader(is);
    java.io.BufferedReader br = new java.io.BufferedReader(isr);

    这样的代码看起来确实不是那么舒服,写起来更不舒服;所以我们使用了import,只需要在类声明前导入相关包:

       import java.lang.System;
       import java.io.InputStream;
       import java.io.InputStreamReader;
       import java.io.BufferedReader 

    代码就清爽多了:

         InputStream = System.in;
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader br = new BufferedReader(isr);

    所以有人说import的使用就是一种偷懒的做法,这一点,我并不否认;

    l Import后出现命名冲突,在使用Import偷懒的时候也会出一些问题;例如:有人在同时import java.awt.*;import java.util.*后,在代码里面使用List,这个时候就炸锅了,因为这两个下面都有List,编译器就蒙圈了,它不知道,你要使用哪一个List;所以这个时候就要指定清楚,你具体使用哪一个。比如Java.util.List;这样编译器就知道了。

    l import可以使用通配符*,*代表某package下所有的class,不包括子目录。看到了吧,就是说*只能导入类不能导入子目录,比如 import java.awt.*之后,你还是不能使用 java.awt.event下面的类,因为event是个子包啊,这个子包下面的类,*就无能为力了。现在知道为什么不能,直接import Java.*了吧。

     

    总之,在使用import的时候,最好还是使用单类型导入,总结起来好处有两个:(1)编译速度:虽然无论是哪种导入都不影响Java代码执行效率,但是在一个很大的项目中,它们会极大的影响编译速度. (2)命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定. 

    3./接口定义部分

    类或者定义部分就是Java源程序的主体了:

    l 类定义

    [修饰符]class 类名[extends 父类] [implements 接口名]{[各种属性][各种方法]} 

    例如:

    public class SearchDaoImpl extends BaseSearchDaoImpl implements SearchDao {
       protected final Log LOGGER = LogFactory.getLog(getClass());
       SearchConfigService searchConfigService;
       public SearchPage findPage(SearchPageable searchPageable) {
           return null;
       }  

    l 接口定义

    [修饰符]  interface 接口名 [ extends 父接口]  {[各种常量][各种方法的声明]}

    例如:

    public interface TipDao extends BaseDao<Tip, Long> {
        boolean termExists(String term);
    }

    注:

      一个java源程序至多只能有一个公共类的定义。

      若java源程序有一个公共类的定义,则该源文件名字必须与该公共类的名字完全相同。

      若源程序中不包含公共类的定义,则该文件名可以任意取名。

      若一个源程序中有多个类定义,则在编译时将为每个类生成一个。class文件。

  • 相关阅读:
    a gcc 4.2.4 bug(被stos指令累加后%edi作为参数的)
    gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i'
    gcc优化引起get_free_page比__get_free_page返回值多4096
    gcc请不要优化
    change_bit 按位取反
    IBM messed up *AGAIN* in their thinkpad: 0xA0000 -> 0x9F000
    python正则实例
    详解volatile 关键字与内存可见性
    并发基础知识
    Spring通过注释配置Bean2 关联关系
  • 原文地址:https://www.cnblogs.com/Li-Wei/p/6196753.html
Copyright © 2011-2022 走看看