本章目标
封装的应用static关键字用法权限修饰符Java中的修饰符分类
权限修饰符
public --公共的
可以访问同项目下任何一个包下的类和接口
protected–受保护的
它的主要作用是保护继承子类的,他的含义在于子类使用他修饰的成员,但是其他不可以,它相当于传递给子类的一种继承的东西
default
本包下的类、接口、异常都可以互相访问
private
访问权限仅在类的内部,是一种封装的体现例如,大多数成员变量都用private修饰,他们不希望被外部类访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCw4aGdu-1603278326251)(C:\Users\11587\AppData\Roaming\Typora\typora-user-images\1603252575583.png)]
状态修饰符
static final
抽象修饰符
abstrac
封装概念
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处
只能通过规定方法访问数据隐藏类的实现细节方便加入控制语句方便实现修改封装的步骤
修改属性的可见性(改为private)创建公有的set/get方法(alt+shift+s)在get/set中加入控制语句 package javalearning.kkb7oob3; /** * @author chenxu * @date 2020/10/20 - 19:37 */ public class Car { //①封装第一步,修改变量的可见性,将其私有化 private String color; private String name; private String price; private String type; private int age; //将类的细节隐藏,让我们只能通过特定方式操作类中的变量,限制不合理操作 //②书写get/set方法 //set 赋值方法,需要参数,但不需要返回值,所以采用有参无返回值,set是为每个属性赋值,所以一个属性一个set方法 public int getAge() { return age; } public void setAge(int age) {//年龄不能小于0才能赋值 if (age>0) { this.age = age; } } public void setColor(String color){ this.color=color; } //get方法 并不需要赋值,但是需要返回值,所以采用无参有返回值的方法 public String getColor(){ return color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getType() { return type; } public void setType(String type) { this.type = type; } } 调用封装的方法 public static void main(String []args){ Car cc= new Car(); cc.setType = "red"; System.out.println(cc.getType) }static 可以用来修饰属性、 方法、代码块,还可以静态导包
JVM内存
堆区heap提供所有类实例和数组对象储存区域,jvm只有一个堆区heap被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身(个人理解:例如a=6 此处的存储区域的地址上只放6)
栈区stack每个线程包含一个栈区,栈区只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中,每个栈中的数据都是私有的没其他栈不能访问
方法区method又叫静态区,被所有的线程共享,方法区包含所有的class和static变量,方法区中包含的都是在整个程序中永远唯一的元素,如class static变量,运行时常量池的分配在Java虚拟机的方法去中
静态的变量和方法,不再属于对象,而是类,可以通过类名直接调用 package javalearning.kkb7oob3; /** * @author chenxu * @date 2020/10/21 - 11:11 */ public class StaticDemo { static int age; public static int num; //静态的变量和方法不属于对象而是属于类 public static void show(){ System.out.println("StaticDemo.show"); } public static void main(String[] args) { //在本类中引用对象有三种途径 //直接引用 age=13; //通过类名引用 StaticDemo.age=33; //通过对象引用 StaticDemo demo = new StaticDemo(); demo.age = 334; System.out.println(age); } }静态变量只有一份,被该类下所有实例对象共享
public class DemoStatic{ static int age; public static void main(String []args){ DemoStatic.age=339; DemoStatic ds = new DemoStatic(); DemoStatic ds2 = new DemoStatic(); DemoStatic ds3 = new DemoStatic(); System.out.println(ds.age); System.out.println(ds2.age); System.out.println(ds3.age); //此时输出的三个数据应该为同一个值 } } 例子2: public class Student { static int count=0; int id; public Student() { id = count++; } public static void main(String[] args) { Student s1 = new Student(); Student s2 = new Student(); System.out.println("s1的id为:"+s1.id+",学生个数为: "+s1.count); System.out.println("s2的id为:"+s2.id+",学生个数为: "+s2.count); } } 执行结果(打印的内容): 学生s1的id为:0,学生个数为:2 学生s2的id为:1,学生个数为:2 如果count不是static变量,那么结果应该是 学生s1的id为:0,学生个数为:1 学生s2的id为:1,学生个数为:2静态变量与方法
不能在静态方法中调用非静态成员,但是可以在非静态方法中调用静态成员
package javalearning.kkb7oob3; /** * @author chenxu * @date 2020/10/21 - 12:22 */ public class Add1 { String name="3242"; static int age=324; public static void show(){ // System.out.println(name);//error:Non-static 字段 'name' cannot be referenced from a static context //不能在静态方法中调用非静态成员,但是可以在非静态方法中调用静态成员 } public void show2(){ System.out.println(age); } public static void main(String[] args) { } }代码块与静态代码块
静态代码块在加载类的时候只执行一次,并且执行在非静态代码块之前
代码块在每创建一个对象的时候,都会执行一次
一个程序可以有多个静态非静态代码区域
public class Demo{ static{ System.out.println("statci code"); } { System.out.println(”code“); } public statci void main(String []args){ Demo demo = new Demo(); Demo demo2 = new Demo(); //输出语句为 static code code code } }静态导包
格式:import static
例如 import static java.lang.Math.max
假如在未使用静态导包时,如果使用max()方法
需要在函数中书写的是Math.max(参数)
假如直接采用了静态导包,则直接可以写为max(参数);即可
补充内容:
静态方法与非静态方法
静态方法属于类本身,非静态方法属于该类生成的每个对象
如果方法的执行不依赖类的各个变量和方法,将其设置为静态方法。将会使程序占用的空间更小
在外部调用静态方法时,可以使用类名.方法名,也可以用对象名.方法名
而实例方法(非静态方法)只有后面这种方法,也就是说 在调用静态方法时,可以不创建对象
静态方法在调用本类成员时,只能调用静态成员,而非静态则都可以调用变量两种:静态变量(类变量) 非静态变量(实例变量)方法三种:静态方法(类方法)、实例方法、构造方法(无返回值,名字和类名一样)实例变量储存在堆区,而静态变量储存在方法区的静态区中静态方法不能使用this 和super关键字主函数是静态的