那个网站可以做学历认证/b2b平台营销

那个网站可以做学历认证,b2b平台营销,网站的流量怎么赚钱,怎样做网站刷qq会员永久Java 类与对象篇 1.上期面试题解析: 上文链接:https://blog.csdn.net/weixin_73492487/article/details/146607026 创建对象时的内存分配过程? ① 加载类 ② 堆内存分配空间 ③ 默认初始化 ④ 显式初始化 ⑤ 构造器执行 this和super能否同时…

Java 类与对象篇

1.上期面试题解析:


上文链接:https://blog.csdn.net/weixin_73492487/article/details/146607026


  1. 创建对象时的内存分配过程?

① 加载类 ② 堆内存分配空间 ③ 默认初始化 ④ 显式初始化 ⑤ 构造器执行

  1. this和super能否同时出现?

不能,二者都必须位于构造器首行

  1. 以下代码输出什么?
    class A {int i = 10;void print() { System.out.println(i); }
    }class B extends A {int i = 20;public static void main(String[] args) {new B().print(); }
    }
    

输出10(方法看运行时类型,字段看编译时类型)
方法看运行时类型:在 Java 中,方法的调用是动态绑定的,这意味着方法的调用是基于实际对象的类型来决定的,而不是对象的声明类型。
字段看编译时类型:而字段的访问是静态绑定的,即编译时绑定。即使对象的实际类型发生了变化,编译时类型决定了我们访问的是哪个字段。也就是说,字段的访问与对象的声明类型相关,而与实际类型无关,不受运行时类型影响。

2.多态(Polymorphism)

2.1 实现条件

  • 继承体系:存在父子类关系
  • 方法重写:子类重写父类方法
  • 向上转型:父类引用指向子类对象(向上转型:低转高,自动转换)
    Animal animal = new Dog(); // 向上转型
    

2.2 动态绑定机制

class Animal {void sound() { System.out.println("Animal sound"); }
}class Dog extends Animal {@Overridevoid sound() { System.out.println("Woof!"); }
}public class Test {public static void main(String[] args) {Animal a = new Dog();a.sound(); // 输出"Woof!"(运行时类型决定方法调用)}
}

核心特性

  • 编译看左边(检查父类是否存在该方法,声明/引用决定可以调用的方法,若不存在该方法,则编译错误)
  • 运行看右边(实际执行子类重写方法,引用指向的对象具体决定调用的方法)
  • 成员变量无多态(编译运行都看左边)

3. instanceof 与类型转换

3.1 类型检查

Object obj = new String("Hello");
if(obj instanceof String) { // 返回trueSystem.out.println("是字符串类型");
}

分析:instanceof 用于判断一个对象是否是某个类的实例,或者是否实现了某个接口,并且返回一个布尔值

2.2 类型转换规则

转换类型语法风险
向上转型自动转换无风险
向下转型强制转换 + 类型检查可能抛出ClassCastException

分析:在进行类型转换之前,可以使用 instanceof 来判断是否可以安全地进行转换,从而避免 ClassCastException。

安全转换模式

if(animal instanceof Dog) {Dog dog = (Dog)animal; // 安全转换
}

父类与子类间的类型转换:

//父类Animal
class Animal {public void eat() {System.out.println("Animal is eating");}
}//子类Dog继承了父类的eat方法
class Dog extends Animal {public void bark() {System.out.println("Dog is barking");}
}public class Test {public static void main(String[] args) {//一个对象的实际类型是确定的,但可以指向的引用类型就不确定了//父类引用指向了子类Animal animal = new Dog();animal.eat();  // 可以调用 Animal 类中的方法// animal.bark();  // 编译错误,Animal 类型没有 bark 方法if (animal instanceof Dog) {Dog dog = (Dog) animal;  // 强制类型转换dog.bark();  // 可以调用 Dog 类中的 bark 方法}}
}

4. static 关键字详解

4.1 静态成员 vs 实例成员

维度静态成员实例成员
所属层级类级别对象级别
内存分配类加载时初始化对象创建时分配
访问方式类名.成员 或 对象.成员必须通过对象访问
生命周期与类共存亡随对象回收而销毁
线程安全需额外同步控制实例隔离更安全

4.2 静态代码块与初始化顺序

class MyClass {static int staticVar;	//静态变量int instanceVar;// 静态代码块(类加载时执行一次,只执行一次)static {staticVar = 100;System.out.println("静态代码块");}// 实例代码块(每次new对象时执行,用于赋初始值){instanceVar = 50;System.out.println("实例代码块");}public MyClass(){System.out.println("构造方法");}
}public class Test{public static void main(String[] args){MyClass mc=new MyClass();System.out.println("==========");MyClass ms=new MyClass();}
}

初始化顺序
静态变量/代码块 → 实例变量/代码块 → 构造器

输出:
静态代码块
实例代码块
构造方法
==========
实例代码块
构造方法

4.3 static修饰特性

静态变量:
  • 静态变量被所有实例共享
  • 静态变量在内存中只有一份副本
  • 静态变量的生命周期与类的生命周期相同,即在类加载时分配内存,直到程序结束时才释放(从属于类)
静态方法:
  • 静态方法只能访问静态变量和调用其他静态方法
  • 可以通过类名直接调用,且不能直接访问实例变量和实例方法
  • 不能使用this/super关键字
  • 不能被重写(但可隐藏)
class Parent {static void staticMethod() {System.out.println("Parent static method");}
}class Child extends Parent {//与父类方法相独立static void staticMethod() {System.out.println("Child static method");}
}public class Test {public static void main(String[] args) {Parent p = new Parent();Parent c = new Child();Child d = new Child();p.staticMethod();  // 输出 "Parent static method"c.staticMethod();  // 输出 "Parent static method" (静态方法调用是根据引用类型来决定的)d.staticMethod();  // 输出 "Child static method" (静态方法调用是根据引用类型来决定的)//静态方法是属于类的,而不是对象的。所以,当你调用静态方法时,它是通过类名来解析的,而不是通过对象引用来解析//当子类定义了一个与父类中静态方法相同的方法时,在子类中的静态方法不会被真正地“重写”,父类和子类的静态方法仍然是相互独立的。}
}
静态代码块:
  • 静态代码块在类加载时自动执行,且只执行一次。
  • 通常用于静态变量的初始化。
静态导入:
  • 使用 import static 语句导入类的静态成员,可以直接访问类的静态方法或静态变量。
import static java.lang.Math.*;public class Test {public static void main(String[] args) {double result = sqrt(25);  // 直接使用 Math 类中的 sqrt 方法,无需写类名(Math.sqrt())System.out.println(result);  // 输出 5.0}
}
静态内部类(由 static 修饰的内部类):
  • 静态内部类不依赖外部类的实例,可以直接创建
  • 可以访问外部类的静态成员,但不能访问外部类的实例成员和实例方法
class Outer {static int staticVar = 10;int var; 	//静态内部类不可访问//由static修饰的内部类(静态内部类)static class Inner {void display() {System.out.println("Static Inner class, staticVar: " + staticVar);}}
}public class Test {public static void main(String[] args) {Outer.Inner inner = new Outer.Inner();  // 直接通过外部类创建静态内部类的实例inner.display();  }
}

输出:
Static Inner class, staticVar: 10


5. 抽象类(Abstract Class)

5.1 定义与特征

abstract class Animal {// 抽象方法abstract void sound();// 非抽象方法/具体方法(子类会继承)void sleep() {System.out.println("Sleeping...");}
}class Dog extends Animal {// 实现抽象方法@Overridevoid sound() {System.out.println("Bark");}
}public class Test {public static void main(String[] args) {Animal animal = new Dog();animal.sound(); // 输出 "Bark"animal.sleep(); // 输出 "Sleeping..."}
}

定义:
抽象类是一种不能直接实例化的类。它可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,只有方法的声明,没有方法体,子类需要实现这些抽象方法。抽象类通常用于定义一种通用的模板或接口,子类继承它并提供具体的实现。

核心特性

  • abstract关键字修饰
  • 不能实例化(只能被继承
  • 可以包含抽象方法和具体方法(抽象方法必须在抽象类中)
    • 抽象方法:没有方法体,必须在子类中实现。
    • 非抽象方法:有方法体,子类可以继承并使用,也可以覆盖(重写)
  • 子类必须实现(重写)所有抽象方法(除非子类也是抽象类,那么就需要子类的子类去实现这些抽象方法)
  • 可以包含构造方法:抽象类可以有构造方法,子类通过super()调用父类的构造方法。
  • 可以包含成员变量(任意访问修饰符)
abstract class Shape {//成员变量int x, y;// 抽象类的构造方法,初始化共同的属性public Shape(int x, int y) {this.x = x;this.y = y;}//抽象方法,必须实现abstract void draw();
}class Circle extends Shape {int radius;public Circle(int x, int y, int radius) {super(x, y);  // 调用父类构造方法this.radius = radius;}@Overridevoid draw() {System.out.println("Drawing a circle at (" + x + ", " + y + ") with radius " + radius);}
}public class Test {public static void main(String[] args) {Circle circle = new Circle(5, 10, 7);circle.draw();  // 输出: Drawing a circle at (5, 10) with radius 7}
}

5.2 使用场景

  • 代码复用:多个子类共享部分实现
  • 模板方法模式:定义算法框架,具体步骤由子类实现
  • 强制规范:要求子类必须实现特定功能

6. 接口(Interface)

6.1 定义与演进

// Java 8+ 接口(是一种约束,只有抽象方法)
public interface Flyable {// 常量(默认 public static final)double MAX_SPEED = 1000.0;// 抽象方法(默认 public abstract)void fly();// 默认方法(Java 8+)默认方法有方法体,可以提供默认实现。//默认方法是 可选 的,接口的实现类可以选择覆盖它,也可以使用接口提供的默认实现。default void land() {System.out.println("Landing...");}// 静态方法(Java 8+),可以通过接口直接调用,而不需要依赖于接口的实现类。//静态方法 不能被实现类重写,因为它属于接口本身。static void showMaxSpeed() {System.out.println("Max speed: " + MAX_SPEED);}// 私有方法(Java 9+)只能在接口内部使用,不能被接口的实现类直接访问。private void checkSpeed() {// 内部复用代码}
}

定义:
接口是一个抽象类型,它是类与类之间的一种协议,用来指定类必须实现的方法。接口只包含 抽象方法(没有方法体)和 常量,从 Java 8 开始,接口也可以包含 默认方法(有实现)和 静态方法。

核心特性

  • 不能直接实例化: 你不能创建接口的对象,必须通过实现接口的类来实例化对象
  • 没有构造方法: 接口没有构造方法,因此不能创建接口实例
  • implements实现,支持多继承多实现(一个类可实现多个接口)
  • 所有方法默认public abstract(Java 8前)
  • 变量默认public static final
  • Java 8+ 支持默认方法和静态方法
  • Java 9+ 支持私有方法

示例:

interface Logger {private void log(String message) {System.out.println("Logging message: " + message);}default void info(String message) {log(message);  // 接口调用自身私有方法}default void warn(String message) {log(message);  // 接口调用自身私有方法}
}class MyLogger implements Logger {// 不需要实现 log() 方法,只需要调用 info() 或 warn() 方法,来提示登陆信息
}public class Test {public static void main(String[] args) {MyLogger logger = new MyLogger();logger.info("Info message");logger.warn("Warning message");// 输出:// Logging message: Info message// Logging message: Warning message}
}

6.2 使用场景

  • 多继承行为:定义多个能力(Flyable, Runnable等)
  • 策略模式:通过不同实现类改变算法
  • API定义:解耦接口与实现(面向接口编程)
  • 函数式接口(@FunctionalInterface):Lambda表达式基础

7. 抽象类 vs 接口对比

维度抽象类接口(Java 8+)
实例化不能不能
方法实现可包含具体方法默认方法/静态方法/私有方法
成员变量任意类型和修饰符只能是public static final常量
继承/实现单继承(extends)多实现(implements)
构造器
设计目的代码复用 + 规范约束行为规范定义
访问控制支持各种访问修饰符默认public(Java 9支持private)

⚡ 高频面试题

  1. 以下代码输出什么?

    class A {static { System.out.print("1"); }{ System.out.print("2"); }public A() { System.out.print("3"); }
    }class B extends A {static { System.out.print("4"); }{ System.out.print("5"); }public B() { System.out.print("6"); }
    }public class Test {public static void main(String[] args) {new B(); }
    }
    
  2. 静态方法能否调用非静态方法?为什么?

  3. 如何实现线程安全的单例模式?

  4. 以下代码是否合法?

    class Test {static int a = b; static int b = 10;
    }
    
  5. 何时选择抽象类?何时选择接口?

  6. 以下代码是否合法?为什么?

    abstract class A {abstract void method1();final void method2() {}
    }interface B {default void method3() {}static void method4() {}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习在测距模型中的应用

一、单目视觉测距和双目视觉测距简介 1、单目视觉测距 模型:深度估计(Depth Estimation) 原理:通过深度学习模型(如MonoDepth2、MiDaS)或传统的计算机视觉方法(如单目相机结合物体大小推断&am…

Lag-Llama时间序列模型简单实现数据预测

前言: 最近在大模型预测,简单了解了lag-llama开源项目,网上也有很多讲解原理的,这里就将如何快速上手使用说一下,只懂得一点点皮毛,有错误的地方欢迎大佬指出。 简单介绍: Lag-Llama 是一个开…

Plastiform复制胶泥:高精度表面复制与测量的高效工具

在工业制造和质量检测领域,表面复制和测量是确保产品质量的关键环节。Plastiform复制胶泥作为一种创新材料,凭借其出色的性能和多样化的应用,为用户提供了可靠的解决方案。它能够快速捕捉复杂表面的细节,确保测量结果的准确性&…

AI大模型、机器学习以及AI Agent开源社区和博客

以下梳理了适合学习 AI大模型、机器学习、AI Agent和多模态技术 的英文网站、社区、官网和博客,按类别分类整理: 一、官方网站与开源平台 1. AI大模型 (Large Language Models) • OpenAI • 官网: openai.com • 内容: GPT系列模型文档、研究论文、AP…

python 上下文管理器with

with 上下文管理器 上下文管理器示例如下:若想不使用with关键字 上下文管理器 任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。 必须同时具有__enter__和__exit__,就可以使用with语句…

CesiumJS 本地数据瓦片加载南北两极出现圆点问题

const imageryProvider new UrlTemplateImageryProvider({url: "/gisimg/{z}/{x}/{reverseY}.png",minimumLevel: 0,maximumLevel: 19})上面这段代码是加载本地切片,但是有个致命问题就是会出现南北两极显示蓝色圆点 解决方案: 加上这句话&am…

Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接

一、gcc/g基础认知 在Linux开发环境中,gcc和g是我们最常用的编译器工具: gcc:GNU C Compiler,专门用于编译C语言程序g:GNU C Compiler,用于编译C程序(也可编译C语言) &#x1f4cc…

飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号

2025年3月24日,阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量,飞致云(即杭州飞致云信息科技有限公司)凭借旗下MaxKB开源知识库问答系统、1Panel开源面板、Halo开…

Vue如何利用Postman和Axios制作小米商城购物车----简版

实现功能:全选、单选、购物数量显示、合计价格显示 实现效果如下: 思路: 1.数据要利用写在Postman里面,通过地址来调用Postman里面的数据。 2.写完数据后,给写的数据一个名字,然后加上一个空数组&#xf…

第一篇:系统分析师首篇

目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复…

CSS学习笔记4——盒子模型

目录 盒子模型是什么? 盒子模型的组成 一、div标签 二、边框属性 1、border-style:边框样式 2、border-width:边框宽度 3、border-color:边框颜色、border:综合设置 4、border-radius:圆角边框 5、border-image:图像边框 三、边距属性…

stable diffusion 本地部署教程 2025最新版

前提: 需要环境 git git下载地址Git - Downloading Package ​ 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org ​ 记得python环境一定要3.10.6!!! 第一个版本 项目地址https://github.…

【二刷代码随想录】螺旋矩阵求解方法、推荐习题

一、求解方法 (1)按点模拟路径 在原有坐标的基准上,叠加 横纵坐标 的变化值,求出下一位置,并按题完成要求。但需注意转角的时机判断,特别是最后即将返回上一出发点的位置。 (2)按层…

从Manus到OpenManus:AI智能体技术如何重塑未来生活场景?

从Manus到OpenManus:AI智能体技术如何重塑未来生活场景? 一、现状:AI智能体技术面临的三大核心矛盾 (通过分析用户高频痛点与市场反馈提炼) 能力与门槛的失衡 Manus展示的复杂任务处理能力(如股票分析、代…

Mybatis源码 插件机制

简介 插件是一种常见的扩展方式,大多数开源框架也都支持用户通过添加自定义插件的方式来扩展或者改变原有的功能,MyBatis中也提供的有插件,虽然叫插件,但是实际上是通过拦截器(Interceptor)实现的,在MyBatis的插件模块…

全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践

2025年3月21日,云轴科技ZStack在香港成功举办了主题为“ZStack AIOS 智塔与 DeepSeek 私有化方案介绍及企业应用落地实践”的 Partner Day 活动。此次活动吸引了众多海外合作伙伴,共同探讨 AI Infra 平台在企业私有化 AI 中的应用与价值闭环。 ZStack CT…

【C++初阶】第12课—list

文章目录 1. list的构造2. list迭代器的常见接口2.1 list遍历的迭代器接口2.2 list修改数据的迭代器接口2.3 list排序、逆序、合并相关操作的成员函数 3. 模拟实现list3.1 模拟实现list的构造3.2 模拟实现list的尾插3.3 模拟实现迭代器iterator3.4 模拟实现list的插入删除3.5 模…

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…

Windows学习笔记(4)关于MITRE

基本术语 APT(威胁组,高级持续威胁) TTP(攻击目的技术过程,战术技术和程序) ATT&CK框架 网站 https://attack.mitre.org/ CAR知识库 MITRE Engage MITRE D3FEND 网址 https://d3fend.mitre.org/

Share01-WinCC文件越用越大?

为什么你们的经典WinCC项目在客户电脑上运行的越来越慢?为什么查询一个历史曲线慢的要死?为什么重启一下电脑画面都要怀疑人生?具体原因可能多种多样,但是极大可能是您的数据管理设置欠佳,那么闲话少叙,和小…