jjzjj

包及访问控制权限

e路有你 2023-03-28 原文

包及访问控制权限

1.主要内容

  1. 包的定义与使用
  2. Java新特性--静态导入
  3. java常用系统包
  4. jar命令使用
  5. Java中的四种访问权限
  6. Java语言命名规范

2.包的定义与使用

为什么要使用包:

包实际上就是一个文件夹,在需要定义多个类或接口时,为了避免名称重复而采用的一种措施。

为一个程序打包:

使用:

直接在程序中加入package关键字。

定义格式: package 包名称.子包名称;

案例:

package kw.com;

class Demo{
    public String getInfo(){
        return "Hello World";
    }
}

public class ClassDemo01 {
    public static void main(String[] args){
        System.out.println(new Demo().getInfo());
    }
}

此时,程序是在包中的,所以完整的类名称应该是"包.类名称"即为 kw.com.ClassDemo01

编译时需要加入参数: javac -d . ClassDemo01.java

  1. -d:表示生成目录。
  2. .:表示当前目录。

编译完成之后,会自动生成相应的文件夹(包)。

执行类:(需要完整类名) java kw.com.ClassDemo01

3.import语句

作用:

在一个包中需要使用其他包中的类就需要通过import语句导入。

导入格式:

  1. import 包名称.子包名称.类名称; --> 手工导入所需要的包
  2. import 包名称.子包名称.*; --> 由JVM自动加载所需要的类

案例:

定义包kw.com.a和包kw.com.b,并在包w.com.b中调用包kw.com.a中的类。

package kw.com.a;

public class Demo {
    public String getInfo(){
        return "Hello World!!!";
    }
}

package kw.com.b;

import kw.com.a.Demo;

public class PackageDemo02 {
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println(demo.getInfo());
    }
}

注意:手动编译时:应该先编译Demo.java,在编译PackageDemo02.java

如果一个类想要外包访问,则此类一定要定义成 public class⭐⭐⭐

public class 与 class 声明类的区别:

  1. 一个类声明为public class,则文件名称必须与类名称一致,并且一个类文件中只能有一个 public class
  2. 使用 class声明一个类,则文件名称可以与类名称不一致,但是执行时必须执行生成的class文件名称。
  3. 在包访问上存在限制
    1. 如果一个类只在本包中访问,不需要被外包访问,则可以直接声明为class
    2. 如果一个类需要被外包访问,则必须声明为 public class

分别导入与使用 "*" 导入哪种性能更高?

这两种导入方式的性能是一样的。因为使用 "*" 时程序也是自动加载所需要的类,而不需要的类根本不会被加载进来。

注意:

在一个程序中同时导入两个包的同名类时,需要明确的写出完整的类名称: "包.类名称"

4.常见系统包

序号 包名称 作用
1 java.lang 此包为基本的包,String、Inter等常用类都保存在此包中,在JDK1.0中如果想要编写程序,则必须手动导入此包,但是随后的JDK解决了此问题,所以此包现在是自动导入。
2 java.lang.reflect 此包为反射机制的包,是java.lang的子包,在Java反射机制中介绍。
3 java.util 此包为工具包,一些常用的类库、日期操作等都在此包中、如果把此包掌握精通,则各种设计思路都可以很好的理解。
4 java.text 提供一些国际化显示的处理类库。
5 java.sql 数据库操作包,提供了各种数据库操作的类和接口。
6 java.net 完成网络编程
7 java.io 输入、输出处理
8 java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形界面(GUI)
9 javax.swing 此包用于构建图形用户界面,此包中的组件相对于java.awt包而言是轻量级组件。

5.Java新特性--静态导入

什么是静态导入:

如果一个类中的方法全部是使用static声明的静态方法,则在导入时就可以直接使用import static的方式导入。

导入格式: import static 包.类.*;

案例:

package kw.com.a;

public class Demo {
    public static int add(int i, int j){
        return i + j;
    }
    
    public static int sub(int i, int j){
        return i - j;
    }
    
    public static int mul(int i, int j){
        return i * j;
    }
    
    public static int div(int i, int j){
        return i / j;
    }
}
package kw.com.b;

import static kw.com.a.Demo.*;

public class PackageDemo02 {
    public static void main(String[] args) {
//        直接调用静态方法,不需要声明对象之后在调用
        System.out.println("3 + 3 = " + add(3, 3));
        System.out.println("3 - 2 = " + sub(3, 2));
        System.out.println("3 * 3 = " + mul(3, 3));
        System.out.println("3 / 3 = " + div(3, 3));
    }
}

注意:如果程序使用了静态导入,则类中所有的静态方法都可以直接被使用,而不需要在使用"类.静态方法()"的形式调用。

6.jar命令使用

当开发者为客户开发了一套Java类后,需要把这些类交给用户使用,但是如果直接把*.class格式的文件发给用户是比较麻烦的,所以一般情况下会把这些*.class 文件压缩成一个文件交付给客户使用,那么这样的文件就称为jar文件(Java Archive File)。

JDK自带jar.exe文件,可以在命令行中使用jar命令进行打jar包。

7.访问控制权限

Java中一共存在4中访问控制权限:

  1. private
  2. default(默认)
  3. protected
  4. public

1.private

private属于私有访问控制权限,可以用在属性的定义、方法的声明上,一旦使用了private关键字声明,则只能在本类中进行访问。

2.default

如果一个类中的属性和方法没有使用任何的访问权限声明,则就是默认的访问权限,默认的访问权限可以被本包中的其他类所访问,但是不能被其他包的类所访问。

3.protected

protected属于受保护的访问权限。一个类中的成员如果使用了protected访问权限,则只能被本包及不同包的子类所访问。

案例:

在其他包的类中直接访问protected属性

package kw.com.a;

public class Demo {
    protected String name = "Hello";
}
package kw.com.b;
import kw.com.a.Demo;

public class PackageDemo02 {
    public static void main(String[] args) {
        Demo demo = new Demo();
// 错误,不同包的类无法访问protected属性  
        System.out.println(demo.name);
    }
}

案例:

package kw.com.a;

public class Demo {
    protected String name = "Hello";
}
package kw.com.b;
import kw.com.a.Demo;

class HelloDemo extends Demo{
    public void print(){
        // 可以访问protected权限
        System.out.println("访问受保护的属性:" + super.name);
    }
}
public class PackageDemo02 {
    public static void main(String[] args) {
        HelloDemo demo = new HelloDemo();   //实例化子类实例
        demo.print();
    }
}

通过不同包中的子类进行访问。

4.public

public属于公共访问权限。使用public声明的成员,可以在所有类中被访问,不管是否在同一个包中。

5.访问控制权限表

范围 private default protected public
同一类 ✔️ ✔️ ✔️ ✔️
同一包中的类 ✔️ ✔️ ✔️
不同包中的子类 ✔️ ✔️
其他包中的类 ✔️

8.Java命名规范

  1. :所有单词的首字母大写,如 TestJava。(大驼峰)
  2. 方法:第一个单词的首字母小写,之后每个单词的首字母大写,如 getInfo()。【小驼峰】
  3. 属性:第一个单词的首字母小写,之后每个单词的首字母大写,如 studentName。【小驼峰】
  4. :所有单词的字母小写,如 kw.com.demo
  5. 常量:所有单词的字母大写,如 FLAG

有关包及访问控制权限的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  7. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  8. ruby - rbenv 安装权限被拒绝 - 2

    大家好,我正在尝试设置一个开发环境,并且我一直在关注以下教程:Linktotutorial我做得不是很好,除了最基本的版本控制内容外,我对终端命令没有任何实际经验。我点击了第一个链接并尝试运行source~/.bash_profile我得到了错误;mkdir:/usr/local/rbenv/shims:权限被拒绝mkdir:/usr/local/rbenv/versions:权限被拒绝现在每次我加载终端时都会出现错误。bash_profile的内容;exportPATH=/usr/local/rbenv/bin:$PATHexportRBENV_ROOT=/usr/local/rbe

  9. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  10. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

随机推荐