package javaTest; public class Increment { private static int k=0; public static void main(String[] args) { int j=0; int n=0; for(int i=0;i<100 ;i++){ j=j++; k=k++; n=++n; } System.out.println(j); System.out.println(k); System.out.println(n); } } 结果:…
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中被 static 修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.静态成员可以使用类名直接访问,也可以使用对象名进行访问.当然,鉴于他作用的特殊性更推荐用类名访问~~ 使用 static 可以修饰变量.方法和代码块. 本小节,我们先认识一下静态变量. 例…
java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户定义的信息传递给 Java 进程.环境变量产生很多其它的全局效应,由于它们不仅对Java 子进程可见,并且对于定义它们的进程的全部子进程都是可见的.在不同的操作系统上,它们的语义有细微的区别,比方,不区分大写和小写.由于这些原因,环境变量更可能有意料不到的副作用.最好在可能的地方使用系统属性.环境变…
java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的指针. 例如:final StringBuffer sbu = new StringBuffer(“abc”); 在对其进行重新赋值 sbu = new StringBuffer(“”); 会出现编译错误,被final修饰的变量是不能被重新赋值的. sbu.append(“d”); 是…
首先看个例子: package zm.demo; public class Demo { private int Id;//成员变量(字段).实例变量(表示该Id变量既属于成员变量又属于实例变量) private String name;//成员变量(字段).实例变量 public int age;//成员变量(字段).实例变量(这里用来举例子,在实际中一般都会设置为private) public static final String mood = "开心";//成员变量(公共字段)…
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静态变量 static修饰的变量为静态变量 在创建对象时,静态变量位于方法区中,而非像实例变量一样,位于堆内存中 一个类的所有对象共用相同静态变量,通过类名来调用静态变量,通过实例来调用虽然也符合语法,但不推荐 示例:静态变量的一个用法 class Employee{ private static i…
Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 而普通初始化块只要有创建一个实例(即new一次),就执行一次. 我们来看一段代码: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行…
对静态变量的操作存在继承时还是有一些模糊,做了个简单的测试: class Test { private String mName; public Test(String name) { setName(name); } public void setName(String name) { mName = name; } public String getName() { System.out.println(mName); return mName; } } class A { protecte…
java中的this /* this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 */ //定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(…
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量->子类静态变量初始化块->父类变量初始化->父类变量初始化块->父类构造方法->子类变量初始化->子类变量初始化块->子类构造方法 --------------------------------------------------我是copy分割线---------…
看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员之间的相互调用规则. 运行结果如下: 总结如下: 注意: 当如下出现报错:“无法从静态上下文中引用非静态时”,问题在于非静态方法或者非静态变量所属的类可能没有被实列化.因为要使用非静态方法,必须实例化它所属的类. 例如:将第40行代码改成inter2.StaticInter(); 编译: 原因是StaticI…
静态方法与静态变量一样,属于类本身,而不属于哪个类的一个对象.调用一个被定义为static的方法,只有通过在它前面加上这个类的名称.一般定义里说是可以通过实例调用的.其他语言我还没测试,但是在C#中是不行的,只能通过类型名称引用它(静态变量也是哦). class Class1 { public static string No { set; get; } public string Second { set; get; } public static void Wmt() { No = "我是静…
一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二.例子 先举一个简单的例子,就很容易看懂接下来的定义了. int a; //变量 final int b = 10; //b为常量,10为字面量 string str = “hello world!”; // str 为变量,hello world!为字面量 三.各定义以及区分 3.1 变量 有些数据…
SpringBoot配置文件分为.properties和.yml两种格式,根据启动环境的不同获取不同环境的的值. spring中不支持直接注入静态变量值,利用spring的set注入方法注入静态变量 .properties文件 test.no=np5809 .yml文件(要注意冒号后一定要有一个空格,不然会识别不到值) test: no: np5809 使用@Component注解和@Value注解 @Component public class LoadProperties{ public s…
这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? public class FieldOverriding { public static void main(String[] args) { Sub c1 = new Sub(); System.out.println(" c1.s : " + c1.s); System.out.println("…
在Java中,如果启动多个线程对同一个对象或者变量时候,在没有安全保护前提下有可能会抛出并异常 java.util.ConcurrentModificationException 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常(并发异常) 解决方法: 在对象/变量前加上volatile.Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的…
Java文件的注意事项 在同一个Java文件中,可以定义多个类,但是被public修饰的类只能够有一个,并且此类名要与文件名一致. 在同一个类中,可以定义多个方法,但是名字叫做main的方法只能有一个,因为它是程序的入口.逐行执行主方法的中的代码. 备注:Java中若有多个类,则编译之后会生成多个.class文件,由此也可以看出Java是以类为单位的. Java中的注释问题 注释就是解释说明的文字 注释有两个作用 1.对于你的代码进行解释说明 2.便于后期维护 注释的分类   颜色 作用域 嵌套…
@Value("${meeting.private_key}")public static String PRIVATE_KEY;发现没有数据,null 分析 Spring是不能直接在static变量上使用@value为其注入值的,因为Spring的依赖注入是依赖setter方法,setter方法是属于对象的,而static变量是属于类的. 方式一 再声明一个实例变量,将@Value移到该实例变量上,再加一个@PostConstruct注解的方法,方法内将该实例变量的值赋给静态变量.…
可能很多Java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解. 1.在看例子之前,确保你理解以下几个术语: 栈:由JVM分配区域,用于保存线程执行的动作和数据引用.栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应. 堆:由JVM分配的,用于存储对象等数据的区域. 常量池:在编译的阶段,在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.例如String str="abc"; ab…
命名规范(文末附有java命名规范)中指出,属性变量命名应采用驼峰命名的方式,即首字母小写,其他单词首字母大写: 但有时候我们对接三方的接口时,想要封装实体类来接受,但是发现接收到的参数的变量首字母是大写的或者其他, 并没有遵循驼峰命名的规范,这个时候出现的问题就是,用我们封装的对象接收数据时,发现参数并没有赋上值. 脑袋大,那么不符合命名规范的变量怎么赋值呢. 符合java命名规范的驼峰命名,首字母小写 /** * 符合java命名规范的驼峰命名,首字母小写 */ private Intege…
1. 平时用的时候,直接在变量头上加上@Value就能到值(其中path.url是配置文件properties的.). @Value("${path.url}") private String url; 2. 但是当url被static修饰之后,就赋不了值. @Value("${path.url}") private static String url; 这里是因为Spring Boot 不允许/不支持把值注入到静态变量中,但是也给出了解决的方案. 3.把@Valu…
/* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. */ public class Test10 { // final修饰基本类型的变量 public static final char CHAR = '中'; // final修饰引用类型的变量 public static final StringBuffer a = new StringBuf…
最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代理的技术在运行期实现AOP.要使用JDK动态代理,目标类必须实现相应的接口,而CGLib不对目标类做任何限制,它通过动态生成目标子类的方式提供代理.JDK在创建代理对象时性能高于CGLib,而生成的代理对象的性能却比CGLib低,如果是singleton的代理,推荐使用CGLib动态代理.-----…
1.==符号使用 Integer a = 1000,b=1000; Integer c = 100,d=100; System.out.println(a==b); System.out.println(c==d); 大家如果不去思考肯定会直接说为true ,true.这个时候就该去补补基础去了... 首先说一下运行答案是 false,true,我们应该都知道==这个时候比较的是对象的引用,这就应该输出的是false,false,这就是为甚我在这里说这个题的原因!!!!! 大家先看一下Integ…
package org.hanqi.zwxx; public class Test { static int i=47; public void call() { System.out.println("调用call()方法"); for(i=0;i<3;i++) { System.out.print(i+" "); if(i==2){ System.out.println("\n"); } } } public static void m…
在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] args) { int a = 1; int b = 2; System.out.println("交换前:"); System.out.println("a = " + a); System.out.println("b = " + b); a…
//案例: Scanner sc = new Scanner(System.in); System.out.println("你选择了新修改商品功能!"); System.out.println("请输入要修改的商品编号:"); //判断用户输入是否合法: if (sc.hasNextInt()){ //获取用户输入的id,用Integer.parseInt转换类型 int id = Integer.parseInt(sc.nextLine()); //2.查询数据…
博主这段时间在写一些C程序的代码,由于以前对C不是了解很多,故遇到很多瓶颈,当然,其中也有很多有趣的方法可以利用以解决这些难题,下面这个问题就是博主遇到的一个麻烦. 声明了 int ,long 型等局部变量,在利用一些方法给这些变量赋值之后,想判断这些变量是不是真的被赋初值了,怎么办? 当然,如果你不赋值给局部变量,这样会导致整个程序的崩溃,因为,它的内容被系统指向了垃圾内存. 下面我们看一段代码: #include <stdio.h> #include <string.h> #i…
package pack1; public class A { private int i; float f; public double d; public float getF() { return f; } public void setF(float f) { this.f = f; } public double getD() { return d; } public void setD(double d) { this.d = d; } package pack1; public c…
方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优. 因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中. 常量池中已经有字符串常量”aaa” 通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a. 通过方式二创建对象,无论常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间存放新对象. 常量池中没有字符串…