6.2.1  权限修饰符

  面向对象的三大特性就有封装,封装隐藏了对象的属性和实现细节,仅对外提供公共访问方式,而这个访问方式就是由权限修饰符控制的。Java中的权限修饰符主要包括private、public、protected和默认(default),及一些其他权限修饰符,这些修饰符控制着对类和类的变量及函数的访问,下面我们来看一下具体的访问权限:

private

protected

public

default

本类

可见

可见

可见

可见

同包其他类或子类

不可见

可见

可见

可见

其他包的类或子类

不可见

不可见

可见

不可见

  1. package cn.yourick.permissionmodifier;
  2.  
  3. import judge.object.Test;
  4.  
  5. public class PermissionTest extends ModifierTest{
  6. public static void main(String[] args) {
  7. PermissionTest permissionTest = new PermissionTest();
  8. permissionTest.test();
  9. PermissionTestDemo.ii = 90;
  10. System.out.println(PermissionTestDemo.ii);
  11. }
  12. //只能访问非私有的函数
  13. public void test(){
  14. PermissionDemo demo = new PermissionDemo();
  15. demo.test2();;
  16. }
  17. final public static class PermissionTestDemo{
  18. static int ii = 89;
  19. protected void test(){
  20. System.out.println("static只能用于类只能是内部类!");
  21. }
  22. }
  23. @Override
  24. public void test6() {
  25. super.test6();
  26. }
  27. }
  1. package cn.yourick.permissionmodifier;
  2.  
  3. class PermissionDemo {
  4. public static void main(String[] args) {
  5. /**
  6. * private只能被自己使用,哪怕是内部类,也是只能被内部类自己使用,
  7. * 私有类不能被其他类实例化[提示不能实例化],私有静态类可以
  8. * 私有静态类只能被自己的外部类实例化,不能被除了这个外部类意外的其它类实例化
  9. */
  10. PermissionDemoTest demoTest = new PermissionDemoTest();
  11. demoTest.fun();
  12. String name = PermissionDemoTest.test();//静态私有类调用静态函数,
  13. System.out.println(name);
  14. //protected的使用
  15. ModifierTest.ModifierTestDemo demo = new ModifierTest().new ModifierTestDemo();
  16. System.out.println("访问protected的成员字段:"+demo.ii);
  17. demo.test();
  18. }
  19. private static class PermissionDemoTest{
  20. /**如果私有函数中存在静态,那么类也应该被声明静态,否则报出下面错误
  21. * The method main cannot be declared static;
  22. * static methods can only be declared in a static or top level type
  23. * 这句话的意思是,静态函数只能被应用于静态类或者是在一个顶级类[外部类中,外部类不能被声明private,自然也就能够通过类名调用]
  24. * @param args
  25. */
  26. public static void main(String[] args) {
  27. System.out.println("私有化函数中如果存在静态的话,那么类也要被声明为静态!");
  28. }
  29. private void fun() {
  30. System.out.println("私有只能应用于内部类或方法及字段,不能应用于外部类!");
  31. }
  32. private static String test() {
  33. return "name";
  34. }
  35. }
  36. private String test() {
  37. return "username";
  38. }
  39. void test2(){
  40. System.out.println("方法可以没有修饰符,即默认修饰符!");
  41. }
  42. }
  1. package cn.yourick.permissionmodifier;
  2.  
  3. class ModifierTest{
  4. protected class ModifierTestDemo extends PermissionTest{
  5. // static int i = 90;如果内部类中有静态,那么这个内部类是一定要背声明为静态的,不在于这个内部类被怎么修饰
  6. protected int ii = 90;
  7. //重写了方法
  8. public void test(){
  9. System.out.println("事实证明,类的继承不受限与权限修饰符的等级,但肯定不能继承私有了!");
  10. System.out.println("事实也证明权限修饰符不约束他的其它类元素!");
  11. }
  12. protected void fun(){
  13. System.out.println("外部类只能被修饰为public和default!");
  14. }
  15. }
  16. public void test6(){
  17. System.out.println("default类,能被继承!");
  18. }
  19. }

解读:

  • 外部类只能被声明为public和default,只有内部类可以被声明为private和protected;
  • 不可见的理解是看不到这个类,更不用说继承和实例化对象了。举例A包中有一个default的类AA,那么在B中是看不到这个类的,既不能继承,也不能实例化。
  • 当声明类时不使用public、protected和private修饰符设置类的权限,则这个类为默认访问权限。
  • 类的权限设定会约束类成员的权限设定(即假如类修饰protected,方法修饰符是public,那么类的权限会约束方法的权限到protected)。因为程序的最小单元是类,所以访问的权限首先由类决定,然后才是方法。
  • Default修饰的类不能被外包访问,只能在本包使用,可以被本包其它类继承。Default只是形容一个类的修饰符,它并不是一个实际存在的修饰符,我们反编译一个默认修饰符的类发现,并没有添加什么标识:下面是反编译PermissionDemo类后的情形,并没有什么标识符
  1. class PermissionDemo

Java语言的权限除了上面四种外还有下面几种常见的,我们一一介绍:

  • abstract修饰符:abstract(抽象)修饰符,可以修饰类和方法。abstract修饰符会使这个类成为一个抽象类,抽象类不能生成对象实例,可以包含抽象方法,抽象方法没有具体功能,只能衍生子类。abstract和private ,abstract和final ,abstract和static一起用是没有意义的,会导致编译错误;【abstract 的东西是还没实现的,用处是让子类去实现。而 final 会禁止子类修改,如果加上 final 则子类无法去实现,所以 final 不能与 abstract 共存。private 同理,private 的东西子类看不到,自然无法去实现它。static.被abstract修饰的方法没有方法体,被static修饰,可以用类名点调用,但是类名点调用抽象方法是没有意义的.】
  • final修饰符:Java关键字final有“这是无法改变”或者“终态的”含义,它可以修饰非抽象类,非抽象类成员方法和变量,final类不能被继承,没有子类,final类中的方法默认是final的,final方法不能被子类的方法重写,但可以被继承,final成员变量表示常量,只能被赋值一次,赋值后值不再改变【一经声明必须赋值】。final不能用于修饰构造方法。Final类中的成员字段是可以被改变的。final修饰引用类型时,该引用类型不能被重新指向其他引用;private类型的方法都默认是final方法,因此也不能被子类重写;私有的不能被其他类访问,就不存在被继承的问题;
  • static修饰符:static是一个修饰符,用于修饰成员(常量、成员变量、成员方法),也可以形成静态代码块。Static用来修饰类,只能修饰静态类。static用来修饰方法和变量,代表静态,如果声明了静态,那么是随着类的加载是被单独放在方法区,因为方法区是一个数据共享区,不管什么变量访问它,都是同一份。静态可以通过类名调用来访问,也可以通过对象来调用,但我们一般不通过对象,那样会造成内存浪费;静态方法中不能直接访问非静态的方法和变量,如果要访问,通过对象调用,非静态方法可以直接访问静态和非静态成员,静态方法中不能使用this和super关键字,静态方法不能被abstract修饰,静态方法和变量可以通过类名调用访问,非静态只能通过对象调用。类被加载时,静态代码块只能被执行一次。类中不同的静态方法代码块按他们在类中出现的顺序被依次执行。

当多个修饰符连用时,修饰符的顺序可以颠倒,不过作为普遍遵守的编码规范,通常把访问控制修饰符放在首位,其次是 static 或 abstact 修饰符,接着就是其他的修饰符

菜鸟笔记 -- Chapter 6.2.1 权限修饰符的更多相关文章

  1. 菜鸟笔记 -- Chapter 6.2 类的构成

    在前面我们讲过高级开发语言大多由7种语法构成,但这是一个很空泛的概述,下,面我们仅就针对Java程序来说一下构成一个Java程序的几大部分,其中类是最小的基本元素.类是封装对象属性和行为的载体,而在J ...

  2. 菜鸟笔记 -- Chapter 6 面向对象

    在Java语言中经常被提到的两个词汇是类与对象,实质上可以将类看作是对象的载体,它定义了对象所具有的功能.学习Java语言必须要掌握类与对象,这样可以从深层次去理解Java这种面向对象语言的开发理念, ...

  3. 菜鸟笔记 -- Chapter 6.4 面向对象的三大特性

    6.4.1  三大特性概述 面向对象的三大特性是Java中一个很重要的基本理念. 封装是面向对象的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的意思.采用 ...

  4. 菜鸟笔记 -- Chapter 4 Java语言基础

    在Chapter3中我们写了第一个Java程序Hello World,并且对此程序进行了分析和常见错误解析.那么我们有没有认真观察一下Java程序的基本结构呢?本节我就来聊一下Java程序的基本结构( ...

  5. Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围

    1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...

  6. 菜鸟笔记 -- Chapter 6.2.4 成员方法

    6.2.4  成员方法 在Java中使用成员方法对应于类对象的行为,在有些地方也会将方法称之为函数,成员方法是定义在类中具有特定功能的一段独立小程序.方法格式如下: 修饰符 返回值类型 成员方法名 ( ...

  7. 菜鸟笔记 -- Chapter 6.2.6 内部类

    6.2.6  内部类 在权限修饰符中,我们已经见过内部类了,但我们看到的只是冰山一角,这节我们详细介绍一下内部类,内部类可以分为成员内部类,局部内部类,匿名内部类,静态内部类.下面我们来讲解一下,在讲 ...

  8. Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类

    一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...

  9. Java中的四种权限修饰符及六种非访问修饰符(简识)

    一.是哪四种访问权限修饰符呢? public > protected > [default] > private (公共的 ) (受保护的) (默认的) (私有的) 二.简单认识四种 ...

随机推荐

  1. SQL Exists 的用法 转载

    比如在Northwind数据库中     有一个查询为 SELECT c.CustomerId, CompanyName FROM Customers c WHERE EXISTS( SELECT O ...

  2. 基于RBAC模式的权限管理系统设计概要

    很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容.  在此以权限管理的使用场景来说明一下完整的权限管理内容.     一是鉴权管理,即权 ...

  3. Java版多人聊天室

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  4. select支持多查询,获取分页count

    在我们使用mybatis 时,当我们根据分页去查询数据集时,需要传入的参数有page(页码)和size(每页的条数),而我们期望获取到的数据有,小于或等于size的list数据集,同时我们还需要得到一 ...

  5. 译:面试投行的20个Java问题

    原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 如果你需要准备面试,可以看一下这篇博客中20个 ...

  6. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  7. Canvas知识点汇总

    本文主要记录Canvas基础知识汇总. 1.Canvas定义 <canvas> 元素是HTML5中的新元素,通过它可以在网页中绘制出所需的图形.<canvas>标签只是图形的容 ...

  8. mysql基本面试题

    1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 2. 从:io线程——在 ...

  9. 关于js 中函数的参数

    var a = 100; function test(a){ a++; //a(形参)是局部变量 console.log(a); } test(a); console.log(a); //结果是 10 ...

  10. 常用DOM结构方法总结

    ---内容开始--- 获取元素的方法: getElementById() 通过ID名获取元素 getElementsByTagName() 通过元素(标签)名称 getElementsByClassN ...