↓
方法1:通过public setter和getter方法
方法2:使用类的构造方法(目的:为类中的属性进行初始化)
格式
class 类名称{
}
构造方法的特性:
构造方法私有化如何解决?※※※
现状:构造方法私有后,不能用new实例化
解决方法:
1)在类内部实例化一个类的对象
java设计模式 ==>程序设计模式:单例设计模式,不管有多少对象,实际上只有1个实例。
static 关键字
作用范围:1)使用static声明属性:在类中使用static声明属性,则此属性称为全局属性(静态属性)
私有属性加static的好处(加不加static,工作范围都是整个类里面?为什么要加)
①对应JVM来说节省空间
全局数据区(data segment):保存static类型的属性,代码中定义的长量,不释放
栈内存空间:保存所有对象名称(即对内存空间的引用地址),程序执行结束之后即引用结束
堆内存空间:保存每个对象的具体属性内容即new的数据,若堆内存数据无引用,JVM的gc线程依据回收策略则会回收掉
全局代码区(code segment):保存所有方法的二进制代码,而且是多个对象共享一个代码空间区域
(代码编译,即存入代码数据区,类型,属性,方法需要实例化对象之后才能存入对应的全局数据区,堆区及栈区)作用范围:2)使用static声明方法:
static声明的方法称为类方法,可由类名称直接调用==>类名.方法名
//类方法调用
Person.setCountry("nanjing");
System.out.println(Person.getCountry());
非static声明的方法称为普通方法==>对象名.方法名//普通方法调用
Person per1=new Person(“zhangsan”,10);
per1.tell();
面试题:static属性,方法和非static属性,方法总结
1)类中普通方法调用static属性,代码不报错(原因)//普通方法调用
Person per1=new Person(“zhangsan”,10);==>jvm原理工作
per1.tell();
总结:非static声明的方法可以调用static声明的属性或方法
2)类中类方法调用非static属性,代码报错(原因)
//类方法调用
Person.setCountry("nanjing");
System.out.println(Person.getCountry());
总结:static声明的方法不能调用非static类型声明的属性或方法,原因是类中的所有属性和方法必须在对象开辟堆内存后才可调用,而static类型的方法在对象未被实例化时就可被类名调用;故若直接用static方法调用非static操作,则有可能在属性和方法还没有被初始化就被调用了,程序必将出错。
作用范围:3)static相关应用
static-main方法
public static void main(String[] args){
}
public:表示此方法可以被外部调用
static:表示此方法可以由类名称直接调用
void:主方法是程序的起点,不需要任何返回值 *
main:系统规定的默认调用的方法名称 *
面试题:统计类被实例化的次数 *
匿名对象:没有明确给出名称的对象,一般只用一次,而且匿名对象只在堆内存总开辟空间,不存在栈内存的引用 ==>new Person("youceedu",10)
↓
this关键字
作用:
1)表示本类中的属性
2)可以使用this调用本类的构造方法
总结:
1)构造方法在实例化对象时被自动调用,即构造方法优先调用,故this调用构造方法必须也只能在构造方法的首行
2)this调用构造方法时一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。
注:代码开发中建议使用this
3)表示调用的是本类的方法
4)this表示当前的对象
内部类:
类内部可定义成员变量与方法,而且在类内部也可定义一个类
格式:
标识符 class 外部类名称{
外部类成员
标识符 class 内部类名称{
内部类成员
}
}
总结:
1)类是有属性和方法组成的,内部类存在其实已经破坏了类的基本结构(缺点)内部类可访问外部类中的私有属性
2)static内部类不能访问非static属性和方法
3)外部类访问内部类
格式: 外部类 外部类对象=new 外部类();
外部类.内部类 内部类对象=外部类实例.new 内部类();
内部类实例.方法名();
![](https://i-blog.csdnimg.cn/blog_migrate/69b81a5790bbb75615bc1add505eaed1.png)
代码块:
代码块是指用“{}”括起来的一段代码,根据位置和声明的关键字不同,可分为:
普通代码块:直接在方法中定义的{}代码构造块:直接在类中定义的{}代码,构造块优先于构造方法执行,且每次实例化对象时都会执行构造块代码,会执行多次
静态代码块:使用static关键字声明的{}代码,静态代码块优先于主方法执行;类中定义的静态代码块会优先于构造块运行,同事不管有多个对象,静态代码块只执行1次。
![](https://i-blog.csdnimg.cn/blog_migrate/1e4c2758f547cb800e8a5c87b693505d.png)
1.主类
主类中--静态代码块优先主方法运行
![](https://i-blog.csdnimg.cn/blog_migrate/83f2b335d607634b2ac1c623773df8d8.png)
2.普通类
静态代码块--不管实例化几次,静态代码块只执行1次
static{//不管实例化几次,静态代码款只执行1次
System.out.println("类定义的静态代码款");
}
构造快:实例化N次,构造快执行N次
{//实例化N次,构造快执行N次
System.out.println("构造快");
}
代码块执行顺序:静态代码块>构造块>构造方法>普通方法。