java中的类为什么只能用public修饰?

首先,类只能使用public修饰是一个伪命题,应该说我们只见到过使用public修饰的类,还有一些类没有访问修饰符,此时访问权限为default。其次,类实际上分为外部类和内部类(inner class),一般的类都是外部类,内部类需要依赖外部类生成,内部类可以用各种访问修饰符修饰。所以问题转化成,为什么不能使用private和protected修饰外部类?

我们知道,在Java中,访问修饰符可以修饰类、方法、变量和构造方法。

访问权限由高到低有以下4种

类内部 本包 子包 外部包
public v v v v
protected v v v x
default v v x x
private v x x x

我们使用访问修饰符去修饰类,就是为了让类之间根据各种权限来访问。

假如外部类使用private修饰,则不能被其它类所访问,这个类也就失去了意义。

假如外部类使用protected修饰,看起来与default相比,在包内可访问的基础上,包外的子类也可访问。但包外想成为子类需要先继承父类,然而无法找到该父类实际上无法继承(先有鸡还是先有蛋的问题),效果与default一致,也就没必要存在了。

关于内部类:

内部类分为成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类是定义在另一个类中的类,是最普通的一种内部类。

class Circle {
  double radius = 0;

  public Circle(double radius) {
    this.radius = radius;
  }

  class Draw {   //内部类
    public void drawSahpe() {
      System.out.println("drawshape");
    }
  }
}

这样看起来,类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

内部类可以用private、protected、default、public修饰,使用private修饰只能在外部类内访问。

关于接口

public interface Comparable<T>{
  int compareTo(T other);
}

接口中的所有方法自动地属于public,在接口中声明方法时不必提供关键字public。

修饰构造方法

在单例设计模式中,我们使用private修饰构造方法,将构造器私有化,表示在类外部不能实例化该类。在类内部实例化后,提供一个可供外部访问的方法,返回实例对象。

public class SingletonTest {
	public static void main(String[] args) {
		//测试
		Singleton instance = Singleton.getInstance();
		Singleton instance2 = Singleton.getInstance();
		System.out.println(instance == instance2); // true
		System.out.println("instance.hashCode=" + instance.hashCode());
		System.out.println("instance2.hashCode=" + instance2.hashCode());
	}
}

//饿汉式
class Singleton {
	//1. 构造器私有化
	private Singleton() {
	}

	//2.本类内部创建对象实例
	private final static Singleton instance = new Singleton();

	//3. 提供一个公有的静态方法,返回实例对象
	public static Singleton getInstance() {
		return instance;
	}

以上就是java中的类为什么只能用public修饰?的详细内容,更多关于java public修饰的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈为什么同一个java文件只能有一个public类

    最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找 在阅读JDK源码时可能会看到在一个public class中"居然"存在另一个public class,似乎跟学习java时提到的"同一个源程序中只能有一个public类"有点矛盾.其实不然,一张图足以完全说明: 补充:问题:一个".java"

  • 简单了解JAVA public class与class区别

    1. 每个编译单元(文件)都只能有一个public类.即每个编译单元都有单一的公共接口,用public类实现.此时,mian()就必须要包含在public类中. 2.public类的名称必须完全与含有该编译单元的文件名称一致,包括大小写.如果不匹配,编译时错误. 3.如果编译单元(文件)中不含有一个public类,此时编译单元文件名称可以与启动类名称可以不一致,即可以随意对文件命名. 这样的话,main()不是必须要放在public类中才能运行程序. 总的来说,一个Java源文件中最多只能有一个

  • Java中的private、protected、public和default的区别(详解)

    (1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)对于protected修饰符,它主要的作用就是用来保护子类的.它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西. (3)对于default来说,有点的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类.接口.异常等,都可以相互访问,即使是父类没有用prote

  • java修饰类的使用方法以及使用技巧(分享)

    本次主要说明装饰类的使用方法以及注意点,在java编程中装饰类主要是对已经有的类进行增强其方法.在实际应用中我们不可能更改某个项目的源代码. /*装饰设计模式 * 当想要对已经有的对象进行功能增强时, * 可以定义类,将已有的队形传入,基于已有的功能,并提供加强功能. * 那么自定义的该类称为装饰类 * * * 装饰类只是对已有的某个类进行加强.前提是必须有这个类.*/ import java.util.*; class Chifan{ public void chifan(){ System.

  • 实例分析Java中public static void main(String args[])是什么意思

    本文实例讲述了Java中public static void main(String args[])的来龙去脉.分享给大家供大家参考,具体如下: public static void main(String[] args) 这绝对不是凭空想出来的,也不是没有道理的死规定,而是java程序执行的需要. jvm在试图运行一个类之前,先检查该类是否包含一个特殊方法.这个方法必须是公有的,以便在任何位置都能访问得到.这个方法必须是static的,因为这个方法不能依赖任何该类的实例即可运行,而非stati

  • java中public class与class的区别详解

    在编写类的时候可以使用两种方式定义类:public class定义类:class定义类:如果一个类声明的时候使用了public class进行了声明,则类名称必须与文件名称完全一致.范例:定义一个类(文件名称为:Hello.java) 复制代码 代码如下: public class HelloDemo{    //声明一个类,类名称的命名规范:所有单词的首字母大写    public static void main(String args[]){    //主方法        System.

  • Java的外部类为什么不能使用private和protected进行修饰的讲解

    Java的外部类为什么不能使用private和protected进行修饰 对于这个问题,一直没有仔细思考,今天整理一下: 对于顶级类(外部类)来说,只有两种修饰符:public和默认(default).因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置.因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default). 如果类使用了private修饰符,说明是个内部类.内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(p

  • Java为什么匿名内部类参数引用需要用final进行修饰?

    事实上,除了匿名内部类参数,方法和作用域内的内部类内部使用的外部变量也必须是final 的.原因大致总结一下: 简单解释就是: 方法中的局部变量的生命周期很短,方法结束后变量就要被销毁,加上final是为了延长变量的生命周期. 进一步解释: 内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以

  • java中的类为什么只能用public修饰?

    首先,类只能使用public修饰是一个伪命题,应该说我们只见到过使用public修饰的类,还有一些类没有访问修饰符,此时访问权限为default.其次,类实际上分为外部类和内部类(inner class),一般的类都是外部类,内部类需要依赖外部类生成,内部类可以用各种访问修饰符修饰.所以问题转化成,为什么不能使用private和protected修饰外部类? 我们知道,在Java中,访问修饰符可以修饰类.方法.变量和构造方法. 访问权限由高到低有以下4种 类内部 本包 子包 外部包 public

  • 详解Java中ArrayList类

    ArratList 类:存放同一数据类型容器(只能为引用数据类型,因实际其内部存放的是地址) 1.导入其所在包 import java.util.ArratList 2.创建对象 ArrayList<E> 对象名=new ArrayList<>(); E:泛型数据类型,指定对象名中存放指定类型的数据,不可省略,需为引用数据类型 3.使用 即对象名.方法(参数可能有可能无) 注意:当打印对象名时,非地址,而是一个如同python中列表一般,存放的是各个数据[元素1,元素2],若无数据

  • java中Class类的基础知识点及实例

    1.说明 Class本身也是一个类. Class对象只能由系统确定. JVM中只有一个Class实例可以加载一个类. Class对应于JVM中加载的.class文件. 每一类的实例都会记住它是由哪个Class例子产生的. 通过Class,可以完全获得一个类中所有加载的结构. Class是Reflection的根源.对于任何你想动态加载和运行的类,只有先获得相应的Class对象. 2.实例 package com.volcano.reflection; import java.lang.annot

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

  • 一步步带你入门Java中File类

    目录 概述 构造方法 基本介绍 代码示例 常用方法 获取文件和目录的基本信息 创建和删除功能 目录遍历功能 补充:移动文件 总结 概述 要学习Java中的File类,首先我们要知道,在Java的API中File类的定义,即文件和目录路径的抽象表现形式,不是文件本身.所以在File类中,所涉及到的操作都只是关于文件名称和目录路径的,而不是文件内容,如果想对文件内容进行操作,还得需要学习I/O流(输入/输出流). 构造方法 基本介绍 只有构造了File类,我们后面才能对它进行操作.对于File类的构

  • Java中Thread类的使用和它的属性

    目录 创建线程 方法一:继承Thread类 方法二:实现Runnable接口中的run()方法 方法三:利用内部类 方法四:使用lambmd表达式 使用线程的好处 Thread类的其他属性和方法 给一个线程起名字 判断一个线程是否存活 Thread的其他常见属性 创建线程 线程的中断 线程的等待 获取线程的引用 线程的休眠 在java中可以进行多线程编程,在java标准库中提供了一个Thread类,来表示线程操作.Thread类可以视为java标准库提供的一组解决多线程编程的一组API. 创建好

  • 详解Java中Duration类的使用方法

    目录 简介 Duration和Period 创建方法 通过时间单位创建 通过LocalDateTime或LocalTime 通过已有的Duration 解析方法 用法说明 详解 比较方法 增减方法 转换单位 取值方法 简介 本文用示例介绍java的Duration的用法. Duration和Period 说明 Duration类通过秒和纳秒相结合来描述一个时间量,最高精度是纳秒.时间量可以为正也可以为负,比如1天(86400秒0纳秒).-1天(-86400秒0纳秒).1年(31556952秒0纳

  • 谈谈Java中对象,类和this,super,static关键字的使用

    目录 Java对象究竟是什么 创建对象的过程 创建多个对象时,内存的变化 无处不在的this和super关键字 static关键字 为何如此特殊 Java对象究竟是什么 对象:对象是类的一个实例,有状态和行为. 类:类是一个模板,它描述一类对象的行为和状态.例如 人 是一个类 其状态有:姓名.性别.身高.体重等 其行为:吃饭.睡觉.聊天.运动等     public class Person {         /**          * 状态 or 属性          */       

  • java中Calendar类用法实例详解

    本文实例讲述了java中Calendar类用法.分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助. Calendar常量(field)的作用 Calendar cal = Calendar.getInstance(); cal.get(Calendar.DATE);//-----------------------当天 1-31 cal.get(Calendar.DAY_OF_MONTH);//------

随机推荐