Java基础-面向对象2
本章目标
- 封装的应用
- 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概述
static可以用来修饰什么?
static 可以用来修饰属性、 方法、代码块,还可以静态导包
使用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关键字
- 主函数是静态的