java内部类与单例模式
java中不允许外部类使用 private,protected 修饰
所谓的外部类:就是在源码中直接声明的类
所谓的内部类: 就是类中声明的类,内部类可以使用 public, private, protected 来修饰。
内部类
package goodStudy;
public class goodStudy{
public static void main(String[] args) {
}
// 这个就是内部类,在类中声明的类
class InnerClass{
}
}
有的小伙伴可能就会问了,我如何使用内部类呢?
答:内部类就当成外部类的属性。从这一句我们也能够得到:
内部类可以使用 public, private, protected 来修饰。
在继续说如何使用? 内部类就当成外部类的属性,因此,需要构建外部类对象才可以使用
这一种也是内部类
package goodStudy;
public class goodStudy{
public static void main(String[] args) {
}
// 这个就是内部类,在类中声明的类
class InnerClass{
}
}
// 外部类
class OutClass{
// 也是内部类
class InnerClass {
}
}
内部类中也是可以使用static
有的小伙伴可能会说,之前我们有一个static,我们可以在内部类中使用static?
可以的,如果在内部类中使用static,我们叫做静态内部类
package goodStudy;
public class goodStudy{
public static void main(String[] args) {
}
// 这个就是内部类,在类中声明的类
class InnerClass{
}
}
class OutClass{
// 静态内部类
static class InnerClass {
}
}

内部类就当成外部类的属性,所以需要构建外部类对象才可以使用
public class study01 {
public static void main(String[] args) {
System.out.println("main");
// 内部类就当成外部类的属性,所以需要构建外部类对象才可以使用
Person p = new Person();
Person.PersonGrid PersonGrid = p.new PersonGrid();
}
}
// 外部类 Person
class Person {
// 内部类 PersonGrid
public class PersonGrid {
}
}
私有构造,new的时候会报错
public class study01 {
public static void main(String[] args) {
System.out.println("main");
// 因为下面的是私有的。所以new的时候会报错
User p = new User(); // 报错
}
}
class User{
// 私有的,是有在当前类中才可以被访问
private User (){
}
}
protected 受保护的。在同类,同包(包路径相同),子类中可以访问
package studyDemo9yue;
public class study01 {
public static void main(String[] args) {
System.out.println("main");
// 受保护的。在同类,同包(包路径相同),子类中可以访问
User p = new User(); // 正常的
}
}
class User{
// 受保护的。在同类,同包(包路径相同),子类中可以访问
protected User (){
}
}
JVM默认给类提供的构造方法,就是公共的public,无参的构造方法
类的创建过程复杂
类的对象消耗资源
成员对象,方法需要被new 才可以使用
静态方法不能直接访问成员属性,但是成员方法是可以访问静态属性。

类的对象消耗资源
package studyDemo9yue;
public class study01 {
public static void main(String[] args) {
System.out.println("main");
// 创建多个实例对象, 现在这样创建的实例对象仍然是消耗内存的
User u1 = User.getUser();
User u2 = User.getUser();
}
}
class User{
// 成员方法
private User () {
};
// 静态方法
public static User getUser() {
return new User();
}
}
单例模式
我们知道像上面那样去创建很多对象的时候;是非常消耗资源的。
现在我们希望去解决这个问题。
单例模式就出来了
package studyDemo9yue;
public class study01 {
public static void main(String[] args) {
// 创建多个实例对象, 现在这样创建的实例对象仍然是消耗内存的
User u1 = User.getUser();
User u2 = User.getUser();
// == 比较的是内存中的地址哈
System.out.println(u1 == u2); // true
}
}
class User{
// 静态属性,为什么这里写静态属性?因为静态方法中不能获取成员属性
private static User User = null;
//成员方法
private User () {
};
// 静态方法
public static User getUser() {
if(User == null){
User= new User();
}
return User;
}
}
java内部类与单例模式的更多相关文章
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- [java设计模式]之单例模式
-------------------此部分比較深入地解说了单例模式,原文链接已给出.兴许将涉及一些常见面试问题--------------------------- 原文地址:http://www. ...
- 夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
随机推荐
- TAMAYA
TAMAYA 挺有意思的维护题. 题面 n个小夫坐成一排,每个小夫有一个真实值vi.小夫们有m场聚会,第i次聚会会在编号为 [li, ri] 的小夫中举办. 聚会之后,这些小夫的真实值会变为他们之中的 ...
- 黑盒视角下的RESTful API安全测试
目录 前言 关于OWASP API TOP 10 REST API接口测试思路 接口权限测试 接口校验测试 接口滥用测试 总结 前言 RESTful API(或称RESTful Web API)在线开 ...
- 一个包含了 50+ C#/.NET编程技巧实战练习教程
DotNetExercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程技巧练习集:C#/.NET/.NET Core编程常用语法.算法.技巧.中间件.类库.工作业务实操练 ...
- 秒懂Redis
一.redis简介 Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库.缓存.消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 二.Re ...
- PHP编译安装之常见问题
正式服的PHP环境,一般都会进行编译安装,汇总一下经常遇到的一些问题 1.Call to undefined function crmeb\utils\imagecreate 解决:需要安装gd库 1 ...
- Vue实现记住账号密码功能
实现思路: 用户登录时若勾选"记住我"功能选项,则将登录名和密码(加密后)存入本地缓存,下次登录页面加载时自动获取保存好的账号和密码(需解密),回显到登录输入框中. 说到存入本地缓 ...
- Reviewbot 开源 | 这些写 Go 代码的小技巧,你都知道吗?
Reviewbot 是七牛云开源的一个项目,旨在提供一个自托管的代码审查服务, 方便做 code review/静态检查, 以及自定义工程规范的落地. 自从上了 Reviewbot 之后,我发现有些 ...
- VTK 设置面片背面颜色
在上一篇文章切开了零件,发现零件内部和外部颜色一样,当需要不一样时,可以通过actor的SetBackfaceProperty方法设置背面属性. 代码跟上一篇几乎一样,只是给actor设置了SetBa ...
- 使用 ASP.NET Core 5 Web API 创建可发现的 HTTP API
使用 ASP.NET Core 5 Web API 创建可发现的 HTTP API https://devblogs.microsoft.com/aspnet/creating-discoverabl ...
- maven打jar包运行main方法
pom文件添加上这段 <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</ ...