首页 > 编程语言 >Java类和对象详解(下)

Java类和对象详解(下)

时间:2024-10-24 19:46:44浏览次数:3  
标签:Java 成员 对象 子类 代码 int 详解 static public

目录

前言:

一.static关键字 

1.static修饰成员变量

2..static修饰成员方法

3.静态代码块 

二.代码块 

1. 普通代码块

2.静态代码块

3.静态代码块

三.继承

1.什么是继承

2.为什么要继承

3.继承的使用 

4.父类的访问(super关键字)

5. 子类构造方法

6.代码执行顺序 

7.组合

四.小结


前言:

书接上文Java类和对象详解(上)-CSDN博客

 

类和对象的组成成分大致如下:

一.static关键字 

1.static修饰成员变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。也就是说所有对象都可以调用。我们知道对象存储在堆中,而对象变量并不存储在栈中,而在方法区中。

静态成员变量特性:

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

 

 如果这个num变量被修饰为static之后,此时每个对象当中的成员就不包含这个属性了。

2..static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。例如:

 class Student {

    private String name;
    private int age;
    private static String classrooom = "Java101";

    public static String getClassrooom(){
        return classrooom;
    }

}
public class TestStudent{
    public static void main(String[] args) {
        System.out.println(Student.getClassrooom());
    }
}

输出结果:

静态方法特性:

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
  4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

3.静态代码块 

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量 。一般是static开头,例如下图方框内:

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。 静态成员变量的初始化分为两种:就地初始化 静态代码块初始化。 这就引出我们的代码块—>静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。

注意事项:

  • 静态代码块不管生成多少个对象,其只会执行一次
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行
  • 实例代码块只有在创建对象时才会执行

二.代码块 

使用 {} 定义的一段代码称为代码块。

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块(属于后面部分的,暂时不提及)

1. 普通代码块

如图中红圈所示:

这就是一个普通代码块。

2.静态代码块

构造块:定义在中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。如下图红圈内所示

3.静态代码块

在上文中有提到,这里就不多说啦!

三.继承

1.什么是继承

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

2.为什么要继承

请看下面代码:

class Cat{
    public String name;
    public int age;
    public void mao(){
        System.out.println(name+"正在喵喵喵!");
    }
}
class Dog{
    public String name;
    public int age;
    public void bark(){
        System.out.println(name+"正在汪汪汪! ");
    }
}

Cat类和Dog类有很多相同的成员变量,假如有100种这样的动物的话,那么就需要写几百行的代码,那我们有没有一个方法可以让一个东西来管理这两个类呢?当然有的,这就是继承

3.继承的使用 

我们一般将需要继承的类如Animal称为父类/超类/基类,而Dog称为子类/派生类。继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。

继承格式:需要使用关键extends(注意不要漏掉s)

使用继承之后的代码:

public class Animal {
    public String name;
    public int age;
}
class Cat extends Animal{
    public void mao(){
        System.out.println(name+"正在喵喵喵!");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println(name+"正在汪汪汪! ");
    }
}

小tips:子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承 

4.父类的访问(super关键字)

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员

请看如下代码:

class Animal {
    public String name;
    public String color;
    public int age;
    public int a = 222;
    public int b = 333;
}

class Cat extends Animal {
    public int a = 111;
    public String var;

    public void test(){
        System.out.println("1:"+a);
        System.out.println("2:"+this.a);
        System.out.println("3:"+super.a);
        System.out.println("4:"+this.b);
        System.out.println("5:"+super.b);
    }

}
public class Main{
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.test();
    }
}

运行结果:

一些小细节分享:

  • 当父类不存在与子类同名的成员时,子类直接访问父类成员。
  • 如果父类与子类成员同名时,优先访问子类自己的。
  • 朋友们此时如果使用this,会发现也是访问当前对象也就是子类成员。
  • 而使用super关键字,就可以访问父类成员,成员方法也是如此。

5. 子类构造方法

子类也会默认初始化无参构造方法,但当我们在构造子类构造器时会报错,这就是传说中的"救急不救穷",系统不会再初始化无参构造器,所以我们要为父类添加构造器。可以记为:没有父哪有子?

  • 在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法
  • 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。  super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。

6.代码执行顺序 

静态代码块----->实例代码块----->构造方法

请看下面代码,看看输出顺序是什么

class Animal {
    public String name;
    public int age;
    static {
        System.out.println("Animal::static {}   4");//4
    }

    {
        System.out.println("Animal::{}   5");//5
    }
    public Animal(String name,int age) {
        this.name=name;
        this.age=age;
        System.out.println("Animal带2个参数的构造方法   6");//6
    }
}

class Cat extends Animal {
    static {
        System.out.println("Cat::static {}  1");//1
    }
    {
        System.out.println("Cat::{}    2");//2
    }
    public Cat(String name,int age) {
        super(name,age);
        System.out.println("Cat带2个参数的构造    3");//3
    }
}
public class Main{
    public static void main(String[] args) {
        Cat cat = new Cat("小花",4);
    }
}

运行结果:   415623   希望你能够理解

7.组合

继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。

例如:

//汽车
class Car {
    private Tire t;
    private Engine e;

}
//轮胎
class Engine {
    public int a;
    public int b;
    public int c;
    public int d;
}
//发动机
public class Tire {
    public int a;
    public int b;
    public int c;
    public int d;
}

但是组合时,整体类不能自动获得局部类同样的接口,需要再创建类对象,不像继承无需再创建。

四.小结

本次分享到此结束,感谢您的阅读,如果您觉得我写的还不错或者对您有帮助,请留下您宝贵的点赞,如果您发现我写的有什么错误,欢迎评论区留言!!!!

标签:Java,成员,对象,子类,代码,int,详解,static,public
From: https://blog.csdn.net/2402_83799883/article/details/143212611

相关文章

  • 基于Java的高校成绩报送系统的设计与实现(11870)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • java启动命令详解
    java-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8002-server-Xms4g-Xmx6g-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/data/data/dump.bin-Dfile.encoding=UTF-8-Djava.awt.headless=true-XX:+UseG1GC-XX:MaxGCPauseMillis=200-XX:G1H......
  • JavaFX+JavaCV实现批量视频处理及批量生成视频开发笔记--003,批量视频混剪功能设计与代
    我要使用JavaFX+JavaCV实现一个桌面应用,可以打包成Windows和Mac的桌面应用。实现的功能是:批量视频混剪。具体操作是:在界面上选择一个文件夹或多个视频文件,对文件夹中的所有视频文件(仅.mp4格式)或者选中的文件进行处理,随机截取原视频中指定长度的视频片段(如5秒),拼接成多个新的......
  • 梯度下降(Gradient Descent)详解
    梯度下降(GradientDescent)详解梯度下降是一种优化算法,广泛应用于机器学习和深度学习中,用于最小化损失函数,即通过调整参数来减少模型错误的方法。梯度下降的核心思想是:通过计算损失函数的梯度(即导数),然后沿着梯度下降的方向更新模型的参数,以达到减少损失的目的。基本原理......
  • 实验2 类和对象_基础编程1
    实验任务1:实验代码:1#include<string>23//类T:声明4classT{5//对象属性、方法6public:7T(intx=0,inty=0);//普通构造函数8T(constT&t);//复制构造函数9T(T&&t);//移动构造函数10~T();......
  • Day10 函数基础+函数三种定义形式 + 函数的返回值、对象和参数 + 可变长参数
    目录0上节课复习0.1文件是什么0.2操作文件的步骤0.3open0.4指针操作0.5文件的复制1函数基础1.1函数的作用1.2函数的定义形式1.3函数定义的两个阶段2定义函数的三种形式2.1无参函数2.2有参函数2.3空函数3函数的返回值4函数对象5函数参数的应用5.1函数定义分为两个......
  • 12万字的java面试题及答案整理(2024新版)
    前言本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***final有哪些用法?final也是很多面试喜欢问的地方,但我觉得这个......
  • 大厂的JAVA经典面试题-初中级
    前言本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***final有哪些用法?final也是很多面试喜欢问的地方,但我觉......
  • BeginnersBook-Java-示例-一-
    BeginnersBookJava示例(一)原文:BeginnersBook协议:CCBY-NC-SA4.0Java程序:计算复合利率原文:https://beginnersbook.com/2019/07/java-program-to-calculate-compound-interest/在本教程中,我们将编写一个java程序来计算复合利率。复利计算公式使用以下公式计算复利:......
  • BeginnersBook-Java-集合教程-一-
    BeginnersBookJava集合教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0如何在Java中对ArrayList进行排序原文:https://beginnersbook.com/2013/12/how-to-sort-arraylist-in-java/在本教程中,我们分享了对ArrayList<String>和ArrayList<Integer>进行排序的示例。另请阅......