反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。 2 为什么需要反射?...如果想创建对象,我们直接new User(); 不是很方便嘛,为什么要去通过反射创建对象呢? 那我要先问你个问题了,你为什么要去餐馆吃饭呢?...//1.创建程序的入口函数main()--不用 /*单元测试方法:是Java中最小的测试单位,使用灵活,推荐指数:5颗星 * 语法要求:@Test + public + void...属性 } } //4.通过单元测试方法,获取Student类中的成员变量 @Test public void getFie() throws ClassNotFoundException...需要使用的常见方法如下: 5.1 创建 : 测试物料类 创建包: cn.tedu. reflection 创建类: Person.java* package cn.tedu.review; /*
1.3.1 为什么局部变量存在于栈中而不是堆中 1.4 访问权限修饰符 public、private、protected, 以及不写(默认)时的区别 1.5 类在初始化的时候做了些什么?...),都需要自己各自的存储空间,所以类的成员变量会随着对象存储在堆中,而由于类的方法是所有对象通用的,所以创建对象时,方法还未出现,只有声明,方法里面的局部变量也并没有被创建,只有等到对象使用方法的时候才会被压入栈...StudenTest 是一个测试类,测试类一般只创建对象,调用方法,所以这个判断应该定义在Student类中。需要使用逻辑语句,而逻辑语句应该定义在方法中。...oi.show(); } } B:创建对象时: // 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名.new 内部类名(); // 成员内部类是静态的...简单理解:即使没有外部类对象,也可以创建静态内部类对象,而外部类的非static成员必须依赖于对象的调用,静态成员则可以直接使用类调用,不必依赖于外部类的对象,所以静态内部类只能访问静态的外部属性和方法
Java为准动态语言的主要的一个关键性质,这个机制允许程序在运行时透过反射取得任何一个已知名称的class的内部信息,包括: 正在运行中的类的属性信息,正在运行中的类的方法信息,正在运行中的类的构造信息...什么是反射: 定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java...关于为什么要使用private访问权限的构造器,使用这个构造器不就不能外部访问了嘛,不也就无法进行实例化对象了吗?...不知你是否发现,从类的创建的方法的使用,所有的一切都是用的字符串,那么也就是说,我可以通过读入数据,或者配置文件的方式,创建类,调用方法。...不用反射,是做不到用字符串创建类,和运行方法(别抬杠,写个if-else 或者 switch啥的)。 举例可能不太恰当,一般不会使用txt,一般使用XML或者java配置文件。 ?
正文 构造函数 为成员变量赋初值,分配资源,设置对象的初始状态 可以理解为类的初始化函数 构造函数的使用 #include using namespace std; class STU...,没有返回类型 对象创建时自动调用且只调用一次 如果没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作 一般访问属性为public,除非我们不允许外部创建对象...一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数 #include using namespace std; class STU { char...析构函数没有参数,不能被重载,因此一个类只能有一个析构函数 关于delete[] 为什么释放多个内存要加[] 为了测试这一情况,定义一个类 class test { public: test()...构造析构顺序 在构造析构顺序之前先看一下 对象创建过程(以堆区为例) 为整个对象分配内存 构造基类部分(如果存在基类) 构造成员变量 执行构造函数代码 对象的销毁过程 执行析构函数代码 析构成员变量
我想想挺简单的,就是一个饿汉,一个懒汉模式,单元测试就一个判断NULL和2个Instance的比较就好。结果被大师劈头盖脸一顿数落,比如我写的懒汉单例(双锁),为什么使用volatile?...饿汉式 对于一般的业务开发来说饿汉式已经足够,而且Spring框架的单例默认就是饿汉模式,绝大部分的提供各类服务的类都不是很占有内存空间,以此在项目启动时进行预加载对于系统影响不大,即使始终不被使用也没有太大的关系...,但并不是很适合大范围的使用。...其通过static修饰,可以包含static数据和属性,且其无需创建外部类和内部类即可被使用。...成员内部类是最基本的一种内部类类型,其可以访问外部类的所有成员和方法,但不能含有static的变量和方法,因为成员内部类需要先创建外部类,之后才能创建自己,特别的,其可以通过外部类.this.属性的方式访问外部类同名属性
因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用,它引用了实例化该内部对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。...2 由于Java规定静态内部类不能用使用外在类的非静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态内部类的时候,不需要外部类对象的引用。...,而是利用自身的构造器对传入的参数进行备份,自己内部方法调用的实际上时自己的属性而不是外部方法传递进来的参数。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...你可能认为既然创建了BigEgg 的对象,那么所使用的应该是被“重载”过的Yolk,但你可以从输出中看到实际情况并不是这样的。
很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次 这个时候我们就可以使用内部类了。...内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。 我们可以把外边的类称为外部类,在其内部编写的类称为内部类。 ...属性名称,所以需要显示的用Outer.this来调用外部类的属性,平常如果属性名不重复,那么我们在内部类中调用外部类的属性和方法时,前面就隐式的调用了Outer.this。...所以局部内部类想要调用局部变量时,需要使用final修饰,不使用,编译度通不过。...1)匿名内部类需要依托于其他类或者接口来创建 如果依托的是类,那么创建出来的匿名内部类就默认是这个类的子类 如果依托的是接口,那么创建出来的匿名内部类就默认是这个接口的实现类
内部类本身就是类的一个属性,与其他属性 定义方式一致。...成员内部类 定义在类内部,成员位置上的非静态类,就是成员内部类。...匿名内部类创建方式: new 类/接口{ //匿名内部类实现部分 } 三、内部类的优点 我们为什么要使用内部类呢?...因为它有以下优点: 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据! 内部类不为同一包的其他类所见,具有很好的封装性; 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。...内部类不为同一包的其他类所见,具有很好的封装性 当内部类使用 private修饰时,这个类就对外隐藏了。
值得注意的是: • class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略 • 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数...在C++命运石之门代码抉择:C++入门(上)中我们详细介绍了域的概念 类定义了一个新的作用域,叫类域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域...如果要把所有成员都包括在类的存储中,按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?...⌨️所以在存储方式上类只保存成员变量,成员函数存放在公共的代码段,这就有效的减少了空间浪费,每个对象中成员变量是不同的,但是调用同一份函数,函数只在使用的使用的时候去公共部分调用 通过对下面的不同对象分别获取大小来分析...(A3) : 1 值得注意的是:类的大小计算也遵循内存对齐规则;为什么类中仅有成员函数或空类的内存为大小为 1 byte,内存计算不是只考虑变量吗?
this关键字 对象创建的过程和this的本质 构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。...创建一个对象分为如下四步: 1. 分配对象空间,并将对象成员变量初始化为0或空 2. 执行属性值的显示初始化 3. 执行构造方法 4....返回对象的地址给相关的变量 this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。 ...类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点: 1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。 2....对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!! 3. 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。) 4.
类与对象 ① 类 * 类是一组相关属性和行为的集合,是对一类事物的抽象描述。 ② 对象 * 对象是一类事物的具体实现,对象是类的实例。 3....对象的使用 ① 创建对象格式 * 类名 对象名 = new 类名(); ② 对象访问类中的成员 * 对象名.成员变量; * 对象名.成员方法(); ③ 示例 //测试类 public...,随着对象的创建而创建,随着对象的消失而消失。...封装概述 ① 为什么要封装 * 外界直接调用类中的数据等无法控制,容易造成非法操作,为了防止外界随意访问类中的数据,需要在类上加一层防护。...② 封装的原则 * 将属性隐藏起来,外部需要访问则提供公共方法对其访问。 2. 封装的步骤 ① private * 使用 private 关键字修饰成员变量,使其私有化。
在 Java 程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是用 static 修饰的成员可以通过类名加...# 通过类调用 static 声明的属性 但是基于上面的代码,我们发现如果是其中的一个类对象就改变了所有的对象的属性,这样子操作是不是感觉不是特别好?...若把一个 Class 文件中的外部类设为static,那目的何在呢?难道让这个类随着应用的启动而加载吗?如果我在这次使用过程中根本没有使用过这个类,那么是不是就会浪费内存。...为什么内部类可以使用 static 修饰呢,因为内部类算是类的成员了,如果我们没有使用静态来修饰,那么我们在创建内部类的时候就需要先有一个外部类的对象,如果我们一直在使用内部类,那么内存中就会一直存在外部类的引用...使用 static修饰内部类之后,内部类在创建对象时就不需要有外部类对象的引用了。
那么具体行为的发生,也就是方法的调用要靠对象来完成,同时属性值也要附着在对象上才有意义。创建对象的过程被叫做类的实例化,或者称为对象的初始化,在这个过程中需要使用的就是new关键字和类的构造器。...这是因为当一个类被定义后,如果没有手动的创建任何的构造方法,会默认提供一个空的构造器,供初始化使用,这个过程是编译时完成的。...所以这就能够解释,为什么明明我们在.java文件中没有定义构造器,但是在创建对象时却可以使用new调用到。...我们在进行变量命名时,一直强调见名知意,那么问题就来了:在类中定义的成员变量名称已经确定了,而构造器中传入的参数就是为了给这些属性赋值的,那么参数的名称是不是应该和类成员变量一样才更能表达意思呢?...│ Test.java 以上为实体类与测试类所在的目录结构,Person实体类所在包:edu.sandtower.bean,Test测试类所在包:edu.sandtower.test,则代码如下:
当我们想要去描述一系列的关系时我们要用到的最基本结构就是类,其中存在着成员变量和方法,用于记录属性和表达行为。...private:私有权限,只能在定义的类中访问,在其他类中创建的实例均无法访问 默认:同包可访问权限,在没有声明权限修饰符时为默认权限,允许在同包的其他类访问 protected:受保护权限,允许有继承关系的子类访问...│ Test.java 以上为实体类与测试类所在的目录结构,Person实体类所在包:edu.sandtower.bean,Test测试类所在包:edu.sandtower.test,相应代码如下...Test{ public static void main(String[] args){ // 在test包中的Test类中创建Person实例 Person...封装有什么用 通过使用权限修饰符,我们可以限定类的成员的被访问权限,那为什么要这样做呢?在很多场景下,我们需要确保我们对属性值的操作均是有效操作,不能违背某些规则。
并且可以直接使用非私有的父类成员。 从类与类之间的设计关系来看,子类必须属于父类的一种时,才会继承。...而实际生产中不会创建动物、犬科、猫科的对象,而会使用更为具体的实现类对象。 定义抽象类动物、犬科、猫科。 定义该三种类型的具体子类。 在测试类中,测试子类属性与子类方法。...继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。...(3)定义一个测试类,测试类定义一个main方法 分别创建 门对象 和 木头门对象, 为创建的木头门对象属性赋值, 调用开门和关门两个方法。...* 测试类 */public class Test {public static void main(String[] args) {//1、分别创建猫对象和狗对象,并分别给父类对象中的名称和年龄属性赋值
;总结一下内部类访问成员的特点既可以访问内部类成员、也可以访问外部类成员如果内部类成员和外部类成员同名,可以使用类名.this.成员区分1.2 静态内部类静态内部类,其实就是在成员内部类的前面加了一个static...); //99 //System.out.println(age); //报错 } }}静态内部类创建对象时,需要使用外部类的类名调用。...当别人使用ArrayList集合创建对象时,new ArrayList就表示元素为String类型,new ArrayList表示元素为Integer类型。...,来测试自定义的泛型类MyArrayList是否能够正常使用public class Test{ public static void main(String[] args){ //...创建包装类对象我们先来学习,创建包装类对象的方法,以及包装类的一个特性叫自动装箱和自动拆箱。
为什么@Autowired不能注入static成员属性 间接实现static成员注入的N种方式 高级实现方式 使用建议 思考题 总结 关注A哥 ? 前言 各位小伙伴大家好,我是A哥。...说明:虽然Spring官方现在并不推荐字段/属性注入的方式,但它的便捷性仍无可取代,因此在做业务开发时它仍旧是主流的使用方式 ---- 场景描述 假如有这样一个场景需求:创建一个教室(Room),需要传入一批学生和一个老师...,此时我需要对这些用户按照规则(如名字中含有test字样的示为测试帐号)进行数据合法性校验和过滤,然后才能正常走创建逻辑。...是测试用户,已过滤 id=4 name=YourBatman_test是测试用户,已过滤 id=6 name=YourBatman_test是测试用户,已过滤 教室创建成功 一切都这么美好,相安无事的,...---- 为什么@Autowired不能注入static成员属性 静态变量是属于类本身的信息,当类加载器加载静态变量时,Spring的上下文环境还没有被加载,所以不可能为静态变量绑定值(这只是最表象原因