system.out.println(perA.getInfo());
system.out.println(perB.getInfo()) ;
system.out.println(perc.getInfo()) ;
}
}
那么这个时候最好的解决方案就是将country修改为公共属性,而这种情况下就必须使用static进行标注。
举例:
修改Person类定义,使用static定义公共属性
//定义一个程序类
class Person{ //创建所有同一个国家的类
private String name;
private int age;
static String country = “中华民国”;//国家,暂时不封装
public Person(String name ,int age) {
this.name = name ;
this.age = age ;
}
//setter、 getter略
public String getInfo(){
return “姓名:” +this.name + “、年龄: " + this.age+”、国家:"+this.country;
}
}
public class JavaDemo {
public static void main(String args []) {
Person perA = new Person(“张三”,10);
Person perB = new Person(“李四”,10);
Person perC = new Person(“王五”,11);
perA.country =“中华人民共和国”;
system.out.println(perA.getInfo());
system.out.println(perB.getInfo()) ;
system.out.println(perc.getInfo()) ;
}
}
只是在country 加了个static关键字,此时会发现所有对象中的country属性的内容都发生了改变,所以这是一个公共属性。
而此时的内存关系图如下:
但是对于static属性的访问需要注意一点:由于其本身是一个公共的属性,虽然可以通过对象进行访问,但是最好的做法应该是通过所以对象的最高代表(类)来进行访问,所以static属性可以由类名称直接调用
。
所以可以用类名称调用如下;
Person.country =“中华人民共和国”;
static属性虽然定义在类之中,但是其并不受到类实例化对象的控制,所以static属性可以在没有实例化对象的时候使用。
实例:
public class JavaDemo {
public static void main(String args []) {
system.out.println(Person.country);
Person.country =“中华人民共和国”;
Person per =new Person(“张三”,10);
system.out.println(per.getInfo()) ;
}
}
在以后进行类设计的时候首选的一定是非static属性,而考虑到公共信息存储的时候才会使用到static属性。非static属性必须在实例化对象产生之后才可以使用,而static属性可以在没有实例化对象产生的情况下直接通过类名称进行调用。
=========================================================================
static关键字也可以进行方法的定义,static方法的主要特点在于,其可以直接由类名称在没有实例化对象的情况下进行调用。
举例:
//定义一个程序类
class Person{ //创建所有同一个国家的类
private String name;
private int age;
private static String country = “中华民国”;//封装国家
public Person(String name ,int age) {
this.name = name ;
this.age = age ;
}
//setter、 getter略
public static void setCountry(String c){ //static方法
country =c;
}
public String getInfo(){
return “姓名:” +this.name + “、年龄: " + this.age+”、国家:"+this.country;
}
}
public class JavaDemo {
public static void main(String args []) {
Person.setCountry(“中华人民共和国”);
Person per =new Person(“张三”,10);
system.out.println(per.getInfo()) ;
}
}
这个时候对于程序而言方法就有了两种: static方法、非 static方法,这两个方法之间在调用上就有了限制:
-
static方法只允许调用static属性或static方法;
-
非static方法允许调用static属性或static方法;
所有的static定义的属性和方法都可以在没有实例化对象的前提下使用,而所有的非static定义的属性和方法必须要有实例化对象的情况下才可以使用。
如果说现在可以理解这个限制,那么对于之前的方法定义就可以得出新的结论:
方法定义的时候强调过,“当前的方法都是在主类中定义的,并且由主方法调用的”
举例
public class JavaDemo {
public static void main(String args []) {//static方法
new JavaDemo().print();//通过对象调用
}
public void print(){//非static方法
system.out.println(‘酸狗’) ;
}
}
static定义的方法或者是属性都不是你代码编写之初所需要考虑的内容,只有在回避实例化对象调用并且描述公共属性的情况下才会考虑使用static定义的方法或者是属性。
=======================================================================
为了加强理解,下面做两个简单的程序来进行static应用的提示。
范例:
编写一个程序类,这个类可以实现实例化对象个数的统计,每一次创建新的实例化对象都可以实现一个统计操作。
- 此时可以单独创建一个static属性,因为所有对象都共享同一个static属性,那么在构造方法中可以实现数据的统计处理。
class Book{
private String title;
private static int count =0;
public Book(string title){
this.title = title;
count++;
system.out.println(“第” + count +“本图书创建出来。”);
}
}
public class JavaDemo{
public static void main(string args []){
new Book(“Java”);
new Book(“JSP”);
new Book(“Spring”);
}
}
范例:
实现属性的自动命名处理
- 如果现在传递了title属性,而如果没有传递title属性,则自动采用“NOTITLE-编号”的形式进行该属性内容的定义。
class Book{
private String title;
private static int count =0;
public Book(){
this("NOTITLE - "+count++ )
}
public Book(string title){
this.title = title;
}
private String getTitle() {
return this.title;
}
}
public class JavaDemo{
public static void main(string args []){
system.out.println(new Book(“Java”).getTitle()) ;
system.out.println(new Book(“JSP”).getTitle()) ;
system.out.println(new Book(“Spring”).getTitle()) ;
}
}
这样处理的好处是可以避免在没有设置title属性时内容为null的重复问题。
=================================================================
静态变量:
静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
轻大家的负担。**
[外链图片转存中…(img-KfczZt9h-1714814847097)]
[外链图片转存中…(img-sJgGn74w-1714814847097)]
[外链图片转存中…(img-h9DxvZQl-1714814847097)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!