面向对象2

本文详细探讨了Java中的封装概念及其好处,包括如何通过修改属性可见性和创建getter/setter方法来实现封装。此外,还深入解析了static关键字的用法,它可以修饰属性、方法和代码块,以及static成员的内存分配。文章还提到了静态导包的使用,以及静态方法与非静态方法的区别。
摘要由CSDN通过智能技术生成

Java基础-面向对象2

本章目标

  • 封装的应用
  • static关键字用法
  • 权限修饰符

Java中的修饰符分类

  1. 权限修饰符

    • public --公共的

      可以访问同项目下任何一个包下的类和接口

    • protected–受保护的

      它的主要作用是保护继承子类的,他的含义在于子类使用他修饰的成员,但是其他不可以,它相当于传递给子类的一种继承的东西

    • default

      本包下的类、接口、异常都可以互相访问

    • private

      访问权限仅在类的内部,是一种封装的体现例如,大多数成员变量都用private修饰,他们不希望被外部类访问

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCw4aGdu-1603278326251)(C:\Users\11587\AppData\Roaming\Typora\typora-user-images\1603252575583.png)]

  2. 状态修饰符

    static final

  3. 抽象修饰符

    abstrac

封装

封装概念

将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

封装的好处

  1. 只能通过规定方法访问数据
  2. 隐藏类的实现细节
  3. 方便加入控制语句
  4. 方便实现修改

封装的步骤

  1. 修改属性的可见性(改为private)
  2. 创建公有的set/get方法(alt+shift+s)
  3. 在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);
    	//此时输出的三个数据应该为同一个值
    	
    	}
    
    }
    
    
    例子2public 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(参数);即可

补充内容:

静态方法与非静态方法

  1. 静态方法属于类本身,非静态方法属于该类生成的每个对象

  2. 如果方法的执行不依赖类的各个变量和方法,将其设置为静态方法。将会使程序占用的空间更小

  3. 在外部调用静态方法时,可以使用类名.方法名,也可以用对象名.方法名

而实例方法(非静态方法)只有后面这种方法,也就是说 在调用静态方法时,可以不创建对象

  1. 静态方法在调用本类成员时,只能调用静态成员,而非静态则都可以调用
  2. 变量两种:静态变量(类变量) 非静态变量(实例变量)
  3. 方法三种:静态方法(类方法)、实例方法、构造方法(无返回值,名字和类名一样)
  4. 实例变量储存在堆区,而静态变量储存在方法区的静态区中
  5. 静态方法不能使用this 和super关键字
  6. 主函数是静态的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值