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 ...
随机推荐
- RedisTemplate RedisConfig 序列化方式 fastjson2
目录 Fastjson2 序列化 Redis.config RedisUtil.java fastjson和fastjson2的区别 Spring Data Redis 为我们提供了下面的Serial ...
- Eclipse JDT--AST入门
最近做program analysis,需要解析Java的源代码,于是就去看了看Abstract Syntax Tree(AST,中文为抽象语法树).有点无奈的是,网上关于这方面的资料比我想象中的少, ...
- ServiceMesh 5:异常重试和超时保护提升服务可用性
★ ServiceMesh系列 1 背景 在复杂的互联网场景中,不可避免的会出现请求失败或者超时的情况. 从程序的的响应结果来看,一般是Response返回5xx状态的错误:从用户的角度去看,一般是请 ...
- 小程序 + node koa2 session存储验证码碰到最大的坑,(喜极而泣 /狗头)
问题:session存验证码.本地拿postman测试了半天,都没有问题. 但到了小程序,服务端再获取(ctx.session.verifyCode)就一直提示不存在.undefined 小程序会 ...
- 中电金信通过KCSP认证 云原生能力获权威认可
中电金信通过KCSP(Kubernetes Certified Service Provider)认证,正式成为CNCF(云原生计算基金会)官方认证的 Kubernetes 服务提供商. Ku ...
- [SpringBoot]浏览器输出中文乱码问题解决
问题情境: IDEA.Springboot.浏览器访问接口查看返回的JSON数据,发现中文乱码 解决方案: server: servlet: encoding: charset: UTF-8 enab ...
- Ubuntu 下安装oh-my-zsh
Ubuntu系统默认状况下的终端样式如下: Ubuntu default terminal's style 有个知名的神奇:Oh-My-Zsh 可以让终端及美观又实用: Oh-My-Zsh agnos ...
- 【网络安全】Shell 脚本学习
声明:学习视频来自 b 站 up 主 泷羽 sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考.任何使用或依赖于本文信息所造成的法律后果均与本人无关.请读者自行判断风险,并遵 ...
- re模块:核心函数和方法
1.compile(pattren,flages=0) 使用任何可选的标记来编译正则表达式的模式然后返回一个正则表达式对象 2.match(pattern,string,flags=0) 尝 ...
- Qt开发经验小技巧271-275
编程的过程中经常遇到需要将QString转成char *或者const char *的情况,在转换成QByteArray后调用.data()或者.constData()函数进行转换,这里需要注意的是, ...