day12-static

面向对象进阶部分学习方法:

特点:

​ 逻辑性没有那么强,但是概念会比较多。

​ 记忆部分重要的概念,理解课堂上讲解的需要大家掌握的概念,多多练习代码。

今日内容

  • 复习回顾
  • static关键字
  • 继承

教学目标

  • 能够掌握static关键字修饰的变量调用方式

  • 能够掌握static关键字修饰的方法调用方式

  • 知道静态代码块的格式和应用场景

  • 能够写出类的继承格式

  • 能够说出继承的特点

  • 能够区分this和super的作用

  • 能够说出方法重写的概念

  • 能够说出方法重写的注意事项

第一章 复习回顾

1.1 如何定义类

类的定义格式如下:

修饰符 class 类名 {
    // 1.成员变量(属性)
    // 2.成员方法 (行为) 
    // 3.构造方法 (初始化类的对象数据的)
}

例如:

public class Student {
    // 1.成员变量
    public String name ;
    public char sex ; // '男'  '女'
    public int age;
}

1.2 如何通过类创建对象

类名 对象名称 = new 类名();

例如:

Student stu = new Student();

1.3 封装

1.3.1 封装的步骤

1.使用 private 关键字来修饰成员变量。

2.使用public修饰getter和setter方法。

1.3.2 封装的步骤实现
  1. private修饰成员变量
public class Student {
    private String name;
    private int age;
}
  1. public修饰getter和setter方法
public class Student {
    private String name;
    private int age;

    public void setName(String n) {
      	name = n;
    }

    public String getName() {
      	return name;
    }

    public void setAge(int a) {
        if (a > 0 && a <200) {
            age = a;
        } else {
            System.out.println("年龄非法!");
        }
    }

    public int getAge() {
      	return age;
    }
}

1.4 构造方法

1.4.1 构造方法的作用

在创建对象的时候,给成员变量进行初始化。

初始化即赋值的意思。

1.4.2 构造方法的格式

修饰符 类名(形参列表) {
    // 构造体代码,执行代码
}

1.4.3 构造方法的应用

首先定义一个学生类,代码如下:

public class Student {
    // 1.成员变量
    public String name;
    public int age;

    // 2.构造方法
    public Student() {
		System.out.println("无参数构造方法被调用")}
}

接下来通过调用构造方法得到两个学生对象。

public class CreateStu02 {
    public static void main(String[] args) {
        // 创建一个学生对象
        // 类名 变量名称 = new 类名();
        Student s1 = new Student();
        // 使用对象访问成员变量,赋值
        s1.name = "张三";
        s1.age = 20 ;

        // 使用对象访问成员变量 输出值
        System.out.println(s1.name);
        System.out.println(s1.age); 

        Student s2 = new Student();
        // 使用对象访问成员变量 赋值
        s2.name = "李四";
        s2.age = 18 ;
        System.out.println(s2.name);
        System.out.println(s2.age);
    }
}

1.5 this关键字的作用

1.5.1 this关键字的作用

this代表所在类的当前对象的引用(地址值),即代表当前对象。

1.5.2 this关键字的应用

1.5.2.1 用于普通的gettter与setter方法

this出现在实例方法中,谁调用这个方法(哪个对象调用这个方法),this就代表谁(this就代表哪个对象)。

public class Student {
    private String name;
    private int age;

    public void setName(String name) {
      	this.name = name;
    }

    public String getName() {
      	return name;
    }

    public void setAge(int age) {
        if (age > 0 && age < 200) {
            this.age = age;
        } else {
            System.out.println("年龄非法!");
        }
    }

    public int getAge() {
      	return age;
    }
}
1.5.2.2 用于构造方法中

this出现在构造方法中,代表构造方法正在初始化的那个对象。

public class Student {
    private String name;
    private int age;
    
    // 无参数构造方法
    public Student() {} 
    
    // 有参数构造方法
    public Student(String name,int age) {
    	this.name = name;
    	this.age = age; 
    }
}

第二章 static关键字

2.1 概述

以前我们定义过如下类:

public class Student {
    // 成员变量
    public String name;
    public char sex; // '男'  '女'
    public int age;

    // 无参数构造方法
    public Student() {

    }
    
    // 有参数构造方法
    public Student(String  a) {

    }
}

我们已经知道面向对象中,存在类和对象的概念,我们在类中定义了一些成员变量,例如name,age,sex ,结果发现这些成员变量,每个对象都存在(因为每个对象都可以访问)。

而像name ,age , sex确实是每个学生对象都应该有的属性,应该属于每个对象。

所以Java中成员(变量和方法)等是存在所属性的,Java是通过static关键字来区分的。static关键字在Java开发非常的重要,对于理解面向对象非常关键。

关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的是放在静态区中,没有static修饰的成员变量和方法则是属于对象的。我们上面案例中的成员变量都是没有static修饰的,所以属于每个对象。

2.2 定义格式和使用

static是静态的意思。 static可以修饰成员变量或者修饰方法。

2.2.1 静态变量及其访问

有static修饰成员变量,说明这个成员变量是属于类的,这个成员变量称为类变量或者静态成员变量。 直接用 类名访问即可。因为类只有一个,所以静态成员变量在内存区域中也只存在一份。所有的对象都可以共享这个变量。

如何使用呢

例如现在我们需要定义传智全部的学生类,那么这些学生类的对象的学校属性应该都是“传智”,这个时候我们可以把这个属性定义成static修饰的静态成员变量。

定义格式

修饰符 static 数据类型 变量名 = 初始值;    

举例

public class Student {
    public static String schoolName = "传智播客"// 属于类,只有一份。
    // .....
}

静态成员变量的访问:

格式:类名.静态变量

public static void  main(String[] args){
    System.out.println(Student.schoolName); // 传智播客
    Student.schoolName = "黑马程序员";
    System.out.println(Student.schoolName); // 黑马程序员
}

2.2.2 实例变量及其访问

无static修饰的成员变量属于每个对象的, 这个成员变量叫实例变量,之前我们写成员变量就是实例成员变量。

需要注意的是:实例成员变量属于每个对象,必须创建类的对象才可以访问。

格式:对象.实例成员变量

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2.3 静态方法及其访问

有static修饰成员方法,说明这个成员方法是属于类的,这个成员方法称为类方法或者静态方法。 直接用 类名访问即可。因为类只有一个,所以静态方法在内存区域中也只存在一份。所有的对象都可以共享这个方法。

与静态成员变量一样,静态方法也是直接通过类名.方法名称即可访问。

举例

public class Student{
    public static String schoolName = "传智播客"// 属于类,只有一份。
    // .....
    public static void study(){
    	System.out.println("我们都在黑马程序员学习");   
    }
}

静态成员变量的访问:

格式:类名.静态方法

public static void  main(String[] args){
    Student.study();
}
静态方法常用场景:

2.2.4 实例方法及其访问

无static修饰的成员方法属于每个对象的,这个成员方法也叫做实例方法

需要注意的是:实例方法是属于每个对象,必须创建类的对象才可以访问。

格式:对象.实例方法

示例

public class Student {
    // 实例变量
    private String name ;
    // 2.方法:行为
    // 无 static修饰,实例方法。属于每个对象,必须创建对象调用
    public void run(){
        System.out.println("学生可以跑步");
    }
	// 无 static修饰,实例方法
    public  void sleep(){
        System.out.println("学生睡觉");
    }
    public static void study(){
        
    }
}
public static void main(String[] args){
    // 创建对象 
    Student stu = new Student ;
    stu.name = "徐干";
    // Student.sleep();// 报错,必须用对象访问。
    stu.sleep();
    stu.run();
}

2.3 小结

1.当 static 修饰成员变量或者成员方法时,该变量称为静态变量,该方法称为静态方法。该类的每个对象都共享同一个类的静态变量和静态方法。任何对象都可以更改该静态变量的值或者访问静态方法。但是不推荐这种方式去访问。因为静态变量或者静态方法直接通过类名访问即可,完全没有必要用对象去访问。

2.无static修饰的成员变量或者成员方法,称为实例变量,实例方法,实例变量和实例方法必须创建类的对象,然后通过对象来访问。

3.static修饰的成员属于类,会存储在静态区,是随着类的加载而加载的,且只加载一次,所以只有一份,节省内存。存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。它优先于对象存在,所以,可以被所有对象共享。

4.无static修饰的成员,是属于对象,对象有多少个,他们就会出现多少份。所以必须由对象调用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ArrayUtil.java

import java.util.StringJoiner;

public class ArrayUtil {
    private ArrayUtil(){

    }

    public static String printArr(int[] arr){
        StringJoiner sj = new StringJoiner(",","[","]");
        for (int i = 0; i < arr.length; i++) {
            sj.add(""+arr[i]);
        }
        return sj.toString();
    }

    public static double getAerage(double[] arr){
        double sum=0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum/arr.length;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        int[] arr={1,2,34,45};
        System.out.println(ArrayUtil.printArr(arr));//[1,2,34,45]

        double[] array ={1.0,2.0,3.0};
        System.out.println(ArrayUtil.getAerage(array));//2.0
    }
}

在这里插入图片描述
Student.java

public class Main {
    public static void main(String[] args) {
        int[] arr={1,2,34,45};
        System.out.println(ArrayUtil.printArr(arr));//[1,2,34,45]

        double[] array ={1.0,2.0,3.0};
        System.out.println(ArrayUtil.getAerage(array));//2.0
    }
}

StudentUtil.java

public class Main {
    public static void main(String[] args) {
        int[] arr={1,2,34,45};
        System.out.println(ArrayUtil.printArr(arr));//[1,2,34,45]

        double[] array ={1.0,2.0,3.0};
        System.out.println(ArrayUtil.getAerage(array));//2.0
    }
}

Main.java

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();

        Student stu1 = new Student("张三",18,"男");
        Student stu2 = new Student("李四",25,"男");
        Student stu3 = new Student("王五",21,"女");

        list.add(stu1);
        list.add(stu2);
        list.add(stu3);

        System.out.println(StudentUtil.getMaxAge(list));//25
    }
}

静态方法注意事项:

在这里插入图片描述

非静态方法第一个参数其实有一个this参数,在调用的时候,虚拟机将调用者对象的地址传给this,从而通过this调用非静态的成员变量和成员方法(以及静态成员变量和成员方法),而静态方法是没有this的,所以无法访问非静态成员变量和成员方法。

在这里插入图片描述
打印地址试一下:
在这里插入图片描述
在这里插入图片描述
调用成员变量的时候,其实前面有个this. 比如:this.name
在这里插入图片描述
调用成员方法的时候,其实前面有个this. 比如:this.show2()
在这里插入图片描述

从内存解释:

静态方法不能访问非静态
  1. 静态方法不能访问实例变量
    下图运行首先首先main方法进栈,运行第一行代码,然后将Student类的字节码文件加载到方法区,然后将静态变量加载到堆内的静态区,并将其赋值为阿伟老师,然后调用静态method方法,就会区静态区寻找name和TeacherName,但是name不在静态区中,导致报错。因此静态方法不能调用实例(实例的意思就是对象)变量
    在这里插入图片描述
  2. 静态方法不能调用非静态成员方法
    假设可以调用show()方法,但是没有调用者。
    在这里插入图片描述
静态方法中只能访问静态
  1. 非静态方法访问静态成员变量
    在这里插入图片描述
  2. 非静态方法调用静态方法
    在这里插入图片描述
    GPT总结:
    在这里插入图片描述

重新认识main方法

在这里插入图片描述
String[] args可以在idea中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值