首页 > 其他分享 >static和继承概述

static和继承概述

时间:2024-11-22 22:19:02浏览次数:3  
标签:name 继承 子类 void 概述 static 父类 public String

1. static(静态)

1.1静态变量

static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。

被static修饰的成员变量,叫做静态变量

特点:1. 被该类所有对象共享。

static修饰的,静态变量是随着类(类加载到方法区)的加载而加载(在堆空间开辟一块地址存储静态变量)的,优先于对象出现的。

静态变量:存储在静态存储区,静态区(在堆内存中)。

2.静态变量不属于对象,属于类。

3 随着类的加载而加载,优于对象存在。

调用方式:类名调用(推荐),对象名调用

1.2 静态方法

被static修饰的成员方法,叫做静态方法

特点:

多用在测试类和工具类中

javabean类中很少会用

工具类:帮助我们做一些事情,但是不描述任何事物的类。

类名见名知意

私有化构造方法。不可以创建对象

方法定义为静态。

调用方式:

类名调用(推荐)

对象名调用

类的分类
Javabean类:用来描述一些事物的类,如Student、Cat等。
测试类:用来检查其他的类是否书写正确,带有main方法的类,是程序的入口。
工具类:不是用来描述一类事物的,而是帮助我们做一些事情的类。

工具类举例

package staticDemo;

public class ArrayUtil {
    //私有化构造方法
    //目的:为了不让外界创建他的对象
    private ArrayUtil(){}

    //定义静态方法
    public static String printArr(int[] arr){
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for(int i=0;i<arr.length;i++){
            if(i == arr.length-1){
                sb.append(arr[i]);
            }else{
                sb.append(arr[i]+",");
            }
        }
        sb.append("]");
        return sb.toString();
    }
    //返回平均分
    public static Double getAverage(double[] arr){
        double sum = 0;
        for(int i=0;i<arr.length;i++){
            sum += arr[i];
        }
        return sum/arr.length;
    }
}

练习:

需求:定义一个集合,用于存储三个学生对象

学生类的属性为:name、age、gender

定义一个工具类,用于获取集合中最大学生的年龄

JavaBean类:

package staticDemo;

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

    public Student() {
    }

    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

工具类:

package staticDemo;

import java.util.ArrayList;

public class StudentUtil {
    private StudentUtil(){}
    public static int getMaxAge(ArrayList<Student> stu){
        int maxAge = stu.get(0).getAge();
        for (int i = 1; i < stu.size(); i++) {
            int age = stu.get(i).getAge();
            if (age > maxAge) {
                maxAge = age;
            }
        }
        return maxAge;
    }
}

测试类:

package staticDemo;

import java.util.ArrayList;

public class TestDem01 {
    public static void main(String[] args) {
         /*需求:定义一个集合,用于存储三个学生对象
        学生类的属性为:name、age、gender
        定义一个工具类,用于获取集合中最大学生的年龄
         */
        //1.定义一个学生集合
        ArrayList<Student> list = new ArrayList<>();
        //2.定义三个学生对象
        Student s1 = new Student("name",12,"man");
        Student s2 = new Student("name1",13,"man");
        Student s3 = new Student("name2",14,"man");
        //3.将创建对象加入到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);

        int maxAge = StudentUtil.getMaxAge(list);
        System.out.println(maxAge);


    }
}

1.3 static的注意事项

静态方法只能访问静态变量和静态方法

非静态方法可以访问静态变量和静态方法,也可以访问非静态的成员变量和非静态的成员方法。

静态方法中是没有this关键字。

this表示当前调用者的地址值

这个this:是由虚拟机赋值的.

总结:

静态方法中,只能访问静态

非静态方法中可以访问所有

静态方法中没有this关键字

1.4 重新认识main方法。

461ffaba8b10407092fd769cf32283a1.jpeg

2 继承

2.1 继承概述

回顾

封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

继承

继承是面向对象三大特征之一,可以让类跟类之间产生子父的关系。

java中提供一个关键字extends,用这个关键字,我们就可以让一个类和另一个类建立起继承关系。

pubilc class Student extends Person{}

Student称为字类(派生类),Person称为父类(基类或超类)

使用继承的好处:

可以把多个子类中重复的代码抽取到父类中,提高代码的复用性。

子类可以在父类的基础上,增加其他的功能,使子类更强大。

继承需要学习的点:
自己设计:

什么时候使用继承?
当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种,就可以考虑使用继承,来优化代码

使用别人的

2.2 继承的特点

Java只支持单继承,不支持多继承,但支持多层继承。

单继承:一个子类只能继承一个父类。

不支持多继承:子类不能同时继承多个父类

多层继承:子类A继承父类B,父类B可以继承父类C

注意:每一个类都直接或间接的继承于Object

继承的练习

e5024ab164954b60ae418b88d38555b1.png

理清思路:画图,从下往上画

书写代码:从上向下写

动物类
package oopExtends.demo1;

public class Animal {
    public void eat(){
        System.out.println("吃东西");
    }
    public void drink(){
        System.out.println("喝水");
    }
}

猫类:

package oopExtends.demo1;

public class Cat extends Animal {
    public void catchMouse(){
        System.out.println("cat catch mouse");
    }
}

狗类:

package oopExtends.demo1;

public class Dog extends Animal{
    public void lookHone(){
        System.out.println("Dog looks hone");
    }
}

布偶猫:

package oopExtends.demo1;

public class Ragdoll extends Cat{
}

狸花猫:

package oopExtends.demo1;

public class LiHua extends Cat{
}

哈士奇:

package oopExtends.demo1;

public class Husky extends Dog{
    public void breakHome(){
        System.out.println("Husky is breaking home.");
    }
}

泰迪:

package oopExtends.demo1;

public class Teddy extends Dog {
    public void touch(){
        System.out.println("Teddy is touching my leg.");
    }
}

测试类:

package oopExtends.demo1;

public class Test {
    public static void main(String[] args) {
        //创建对象并调用方法
        Ragdoll rd = new Ragdoll();
        rd.eat();
        rd.drink();
        rd.catchMouse();
        Husky h = new Husky();
        h.eat();
        h.drink();
        h.lookHone();
        h.breakHome();
    }
}

注意:private(权限修饰符):此时子类就无法访问了。

2.3 子类能继承父类中的哪些内容(内存图/内存分析工具)

39c35d61881f412083a703d3b4273c48.jpeg

00b420e3732b406294e7994205408f27.jpeg

2.4 继承中成员变量和成员方法的访问特点

2.4.1 继承中:成员变量的访问特点

就近原则:谁离我近,我就用谁 

继承中成员变量访问特点:就近原则

先在局部位置找,本类成员位置找,父类成员位置找,逐级往上。

如果成员变量重名怎么办?

System.out.println(name);在局部位置往上找
System.out.println(this.name);本类成员位置往上找
System.out.println(super.name);父类成员位置往上找

2.4.2 继承中:成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁

super调用,直接访问父类

方法的重写:

当父类的方法不能满足子类现在的需求时,需要进行方法重写。

书写格式:

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注解

1.@Override是放在重写后的方法上,检验子类重写时语法是否正确。

2.加上注解后如果有红色波浪线,表示语法错误。

3建议重写方法都加@Override注解,代码安全,优雅!

方法重写注意事项和要求: 1.重写方法的名称、形参列表必须与父类中的一致。

2.子类重写父类方法时,访问权限子类必须大于等于父类。

3.子类重写父类方法时,返回值类型必须小于等于父类。

建议:重写的方法尽量和父类保持一致

5.私有方法不能被重写。(只有被添加到虚方法表中的方法才能被重写)

6.子类不能重写父类的静态方法,如果重写会报错

练习:

9425ac76ed874e80b0dd3e6749f71638.jpeg

父类:

package oopExtends.demo2;

public class Dog {
    public void eat(){
        System.out.println("Dog eats food");
    }
    public void drink(){
        System.out.println("Dog drinks water");
    }
    public void lookHome(){
        System.out.println("Dog looks home");
    }

}

 子类:

package oopExtends.demo2;

public class Husky extends Dog {
    public  void breakHome(){
        System.out.println("Husky is breaking home.");
    }
}
package oopExtends.demo2;

public class SharPei extends Dog {
    //沙皮狗吃饭不一样,需要重写
    @Override
    public void eat() {
        super.eat();//吃狗粮
        System.out.println("SharPei is gnawing a bone");
    }
}
package oopExtends.demo2;

public class ChineseDog extends Dog{
    @Override
    public void eat() {
        System.out.println("ChineseDog is eating the leftovers.");
    }

}
package oopExtends.demo2;

public class Testdemo {
    public static void main(String[] args) {
        Husky h = new Husky();
        h.eat();
        h.drink();
        h.lookHome();
        h.breakHome();

        ChineseDog cd = new ChineseDog();
        cd.eat();
        cd.drink();
        cd.lookHome();

        SharPei sp = new SharPei();
        sp.eat();
        sp.drink();
        sp.lookHome();

    }

}

 

2.4.3 继承中:构造方法的访问特点

父类中的构造方法不会被子类继承。

子类中所有的构造房啊默认会先访问父类中的无参构造,再执行自己。

为什么?

1.子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。

2.子类在初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。

怎么调用父类构造方法?

子类构造方法的第一行默认语句都是:super(),不写也存在,且必须在第一行。

如果想调用父类有参构造,必须手动写super进行调用。

继承中构造方法的访问特点?

  1. 子类不能继承父类的构造方法,但是可以通过super调用。

  2. 子类构造方法的第一行,有一个默认的super

  3. 默认先访问父类中的无参构造方法,再执行自己。

  4. 如果想要访问父类有参构造,必须手动书写。(super(q,w))

2.5 this,super的使用总结

this:理解为一个变量,表示当前方法调用者的地址值。

super:代表父类存储空间。

65e5c2df23bc43069476bc97c8760985.jpeg练习1:

 ff39b03597774b4c83a6116709dfc7b3.jpeg

 

父类: 

package oopExtends.demo3;

public class Employee {
    private String id;
    private String name;
    private double salary;

    public Employee() {
    }

    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    public void work(){
        System.out.println("Employee worked!");
    }
    public void eat(){
        System.out.println("Employee eat mice!");
    }
}

 子类:

package oopExtends.demo3;

public class Manger extends Employee{
    private double bonus;
    //空参构造
    public Manger() {
    }
    //全参构造
    //父类+子类
    public Manger(String id, String name, double salary, double bonus) {
        super(id, name, salary);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
    @Override
    public void work(){
        System.out.println("Manger is working.");
    }
}
package oopExtends.demo3;

public class Cook extends Employee {
    public Cook() {
    }

    public Cook(String id, String name, double salary) {
        super(id, name, salary);
    }
    @Override
    public void work() {
        System.out.println("Cook works");
    }
}

 测试类:

package oopExtends.demo3;

public class Test {
    public static void main(String[] args) {
        Manger m = new Manger("001","qw",15000,8000);
        System.out.println(m.getId() + "," + m.getName() +
                            "," + m.getSalary()+ "," + m.getBonus());
        m.work();
        m.eat();

        Cook c = new Cook("002","er",8000);
        c.setId("002");
        c.setName("yu");
        c.setSalary(8500);
        System.out.println(c.getId() + "," +c.getName() + "," +c.getSalary());
        c.work();
        c.eat();

    }

}

 

标签:name,继承,子类,void,概述,static,父类,public,String
From: https://blog.csdn.net/m0_57132040/article/details/143882096

相关文章

  • css笔记: 继承关系
    这两天写css的时候发现子元素继承了父元素的css样式,不显示它自己的。经过一番搜索,得出以下几个解决方案:检查选择器优先级增加样式的特异性避免不必要的继承使用!important标记(谨慎使用)检查CSS规则的顺序明确样式规则,减少对父元素的依赖考虑使用CSS变量理解CSS的层叠规则......
  • 【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
    个人主页:起名字真南的CSDN博客个人专栏:【数据结构初阶】......
  • 实验四 类的组合、继承、模板类、标准库
    实验任务1:task1-1.cpp和task1-2.cpp以及task1-3.cpp的源码,运行测试结果如下#include<iostream>usingstd::cout;usingstd::endl;//类A的定义classA{public:A(intx0,inty0);voiddisplay()const;private:intx,y;};A::A(intx0,inty0):......
  • 实验4 类的组合、继承、模板类、标准库
    1.实验任务1task1_1.cpp1#include<iostream>2usingnamespacestd;34classA{5public:6A(intx0,inty0);7voiddisplay()const;8private:9intx,y;10};11A::A(intx0,inty0):x{x0},y{y0}{}12voidA::display()con......
  • 计算机网络:概述知识点及习题练习
    网课资源:湖科大教书匠1、因特网网络之间需要路由器进行互联,互联网是网络的网络,因特网是最大的互联网,连接到网络的设备称为主机,一般不叫路由器为主机。因特网发展:ARPNET->三级结构因特网(NSFNET)->多层次ISP结构的因特网。1983,TCP/IP诞生,因特网诞生时间,因为它采用TCP/IP......
  • 鸿蒙5.0南向开发:HiDumper开发概述
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)功能简......
  • Day35--static关键字详解
    Day35--static关键字详解示例:packagecom.liu.oop.demo07;//staticpublicclassStudent{privatestaticintage;//静态的变量privatedoublescore;//非静态的变量publicstaticvoidmain(String[]args){Students1=newS......
  • C++:类的继承
    在C++中,类的继承是一种面向对象编程(OOP)的重要特性,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。通过继承,可以重用现有的代码,减少重复代码,提高代码的可维护性和扩展性。1.基本概念基类(BaseClass或ParentClass):被继承的类。派生类(DerivedClass或Chi......
  • 实验4 类的组合、继承、模板类、标准库
    task2:代码:1#include<iostream>2#include<vector>3#include<string>4#include<algorithm>5#include<numeric>6#include<iomanip>78usingstd::vector;9usingstd::string;10usingstd::c......
  • 实验4 类的组合、继承、模板类、标准库
    实验2GradeCalc.hpp#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingstd::vector;usingstd::string;usingstd::cin;usingstd::cout;usingstd::en......