Java知识总结-基础

Java中的访问权限修饰符

Java语言有四个权限访问修饰符,权限从大到小依次为:

1)public :公共权限,可以被任意类访问,不同包不同类依然可以访问,

可修饰:类、成员变量、方法,内部类

2)protected:受保护的权限,可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问

可修饰:成员变量、方法、内部类

3)default:默认的(无),同包权限,只能被同包的类访问

可修饰:类、成员变量、方法,内部类

4)private:私有权限,只能在本类中访问,同包其他类也不能访问

可修饰:成员变量、方法、内部类

补充说明:在Java中,default和friendly是同一个访问级别的两种不同称呼。当一个成员没有被声明为private、protected或public时,它就具有默认访问级别,也被称为friendly访问级别。默认访问级别仅适用于同一个包中的类。这意味着,只有在同一个包内的其他类可以访问默认访问级别的成员,而在其他包中的类无法访问。总结来说,default和friendly修饰符没有区别,它们都表示同一个访问级别,仅适用于同一个包中的类

一个类只能继承 extends 一个类,但可以实现 implements 多个接口。

抽象类 abstract

  • 抽象类不能实例化

  • 可以没有抽象方法,但抽象方法只能存在于抽象类。

  • 抽象方法不能用 private 修饰(抽象方法需要子类覆盖),不能用 static 修饰(如果修饰了,那可以通过类名调用,而抽象方法没有主体)。

  • 抽象类不能用 final 修饰,  因为 final 修饰的类是无法继承的。

  • 一个类继承抽象类,如果不完全覆盖抽象类中的抽象方法,那么这个类必须是抽象类。

  • 抽象类可以有构造方法,可以实体方法实现具体的代码逻辑。

final

final 的使用方式

  • final 修饰的类叫最终类,该类不能被继承。

  • final 修饰的方法不能被重写。

  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

static

如果一个类要被声明为static的,只有一种情况,就是静态内部类。如果在外部类声明为static,程序会编译都不会过。

修饰变量

表示这个变量的生命周期是类的存在周期。可以通过类名去访问,也可以通过对象去访问。

修饰方法

static修饰的方法只能访问 static变量,不能访问非 static 变量。

内部类

可以解决单继承问题,实现多继承。

成员内部类

public class Outer {   public class Inter {       } }

特点:

  • 可以被权限修饰符(public, private等)所修饰

  • 可以访问外部类的所有成员,包括 private 成员、static成员

  • 默认包含了一个指向外部类对象的引用

  • 如同使用 this 一样,当成员或方法名发生覆盖时,可以使用外部类的名字加 .this 制定访问外部成员。如: Outer.this.name

  • 不可用定义 static 成员

  • 内部类创建语法

Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();

局部内部类

定义在方法或者作用域中类,它和成员内部类的区别仅在于访问权限的不同。

public class Outer {   public void test() {     class Inner {           }   } }

特点:

  • 不能有权限访问修饰符

  • 不能被定义为 static

  • 不能定义 static 成员

  • 默认包含了外部类对象的引用

  • 可以使用 Outer.this 语法制定访问外部类成员

  • 想要使用方法或域中的变量,该变量必须是 final 的。(JDK1.8 之后,可以没有final 修饰,但需要具有 effectively final效果)

匿名内部类

匿名内部类与继承合并在一起的没有名字的内部类。

/** *    外部内、内部类 */ public class Outer {     public static IAnimal getInnerInstance(String speak){         return new IAnimal(){             @Override             public void speak(){                 System.out.println(speak);             }};             //注意上一行的分号必须有     }         public static void main(String[] args){         //调用的speak()是重写后的speak方法。         Outer.getInnerInstance("小狗汪汪汪!").speak();     } }

特点:

  • 使用单独的块表示初始化块{}

  • 想要使用方法或域中的变量,该变量必须是final修饰的,JDK1.8之后effectively final 也可以

  • 默认包含外部类对象的引用

  • 表示继承所依赖的类。如上面的,表示继承 IAnimal 类或者 实现 IAnimal 接口

嵌套类

嵌套类是用 static修饰的成员内部类。

public class Outer{   public static class Inner{   } }

特点:

  • 嵌套类是四种类中唯一一个不包含对外部类对象的引用的内部类

  • 嵌套类可以定义 static 成员

  • 嵌套类能访问外部类任何静态数据成员与方法。

构造函数可以看做静态方法,因此可以访问。

泛型

泛型类

public class Generic<T> {   private T a;   public Generic();   public void set(T a) {     this.a = a;   }   public T get() {     return a;   }   public static void main(String[] args) {     Generic<Integer> g = new Generic<>();     g.set(1);   } }

泛型接口

public interface Generator<T {   pubilc T method(); }

实现泛型接口,不制定类型:

class GeneratorImpl<T> implements Generator<T> {   public T method() {     return null;   } }

实现泛型接口,指定类型:

class GeneratorImpl<T> implements Generator<String> {   public String method() {     return "hello";   } }

泛型方法

如果某个方法是静态的,它便没有访问类的泛型类型参数的权限(需要类实例化才知道具体的参数)。因此如果要用到泛型能力,它就必须是泛型方法。

package com.testclass.generics; public class GenericMethods {   public <T> void f(T x) {     System.out.println(x.getClass().getName());   }   public static void main(String[] args) {     GenericMethods g = new GenericMethods();     g.f("");     g.f(1);     g.f(g);   } }

类型“擦除”

List<String> 和 List<Integer> 在运行时实际上是相同的类型。两者的类型都被“擦除”为它们原始的类型(raw type):List。

类型擦除存在的主要理由就是充当从非泛型代码过渡到泛型化代码的中间过程,以及在不破坏先有库的情况下,将泛型融入 Java 语言中。

泛型边界

package com.testclass.generics; interface HasColor {   java.awt.Color getColor(); } class WithColor<T extends HasColor> {   T item;   WithColor(T item) {     this.item = item;   }   T getItem() {     return item;   }   // 可以调用边界中的方法   java.awt.Color color() {     return item.getColor();   } } class Coord {   public int x, y, z; } // 这样会失败。类(Coord)必须在前面,然后才是接口 (HasColor) // class WithColorCoord<T extends HasColor & Coord> // 多重边界 class WithColorCoord<T extends Coord & HasColor> {   T item;   WithColorCoord(T item) {     this.item = item;   }   T getItem() {     return item;   }   java.awt.Color color() {     return item.getColor();   }   int getX() {     return item.x;   }   int getY() {     return item.y;   }   int getZ() {     return item.z;   } } interface Weight {   int weight(); } // 和使用继承一样,只能继承一个具体类,而可以实现多个接口 class Solid<T extends Coord & HasColor & Weight> {   T item;   Solid(T item) {     this.item = item;   }   T getItem() {     return item;   }   java.awt.Color color() {     return item.getColor();   }   int getX() {     return item.x;   }   int getY() {     return item.y;   }   int getZ() {     return item.z;   }   int weight() {     return item.weight();   } } class Bounded extends Coord implements HasColor, Weight {   @Override   public java.awt.Color getColor() {     return null;   }   @Override   public int weight() {     return 0;   } } public class BasicBounds {   public static void main(String[] args) {     Solid<Bounded> solid = new Solid<>(new Bounded());     solid.color();     solid.getY();     solid.weight();   } }

反射

类在首次使用时才会被动态加载到JVM中。当程序第一次引用该类的静态成员时,就会触发这个类的加载。构造器是类的一个静态方法,尽管没有明确使用 static 关键词。因此,使用 new 操作符创建类的新对象也算作对该类静态成员的引用,构造器的初次使用会导致该类的加载。初始化被延迟到静态方法(构造器是隐式静态的)或非常量静态字段时。

  • 使用 Class.newInstance() 创建的类必须有一个无参的构造器。Java 8以上推荐使用  Constructor.newInstance() 来代替。

  • 在编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法;(如果自己手动添加构造函数,无论有参数或是没参数,默认构造函数都将无效。

加载三个步骤:

  1. 加载。这个由类加载器执行的。该步骤会先找到字节码(通常在类路径中的磁盘上,但也不一定),然后从这些字节码中创建一个 Class 对象。

  2. 链接。链接阶段又分为三个步骤:(1)验证:验证类中的字节码 。(2)准备:为静态字段分配存储空间(3)解析:在必要时解析该类对其他类的所有引用。

  3. 初始化。如果有基类的话,会先初始化基类,执行静态初始化器和静态初始化块。

关键字 instanceof

判断某个类的归属。

if(x instanceof Dog)   ((Dog)x).bark();

动态代理

获取 Class对象的四种方式:

1. 知道具体类的情况下可以使用:

Class alunbarClass = TargetObject.class;

但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化

2. 通过 Class.forName()传入类的全路径获取:

Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

3. 通过对象实例instance.getClass()获取:

TargetObject o = new TargetObject(); Class alunbarClass2 = o.getClass();

4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取:

ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject");

通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行

注解

我们无法对@interface使用extends关键字。注解不能继承。

@Target

  • CONSTRUCTOR----构造器声明

  • FIELD---字段声明(包括枚举常量)

  • LOCAL_VARIABLE---本地变量声明

  • METHOD---方法声明

  • PACKAGE---包声明

  • PARAMETRE---参数声明

  • TYPE---类、接口(包括注解类型)或枚举的声明

@Retention

注解信息可以保存多久。可能的 RetentionPolicy 参数:

  • SOURCE---注解会被编译器丢弃

  • CLASS---注解在类文件中可杯编译器使用,但会被虚拟机丢弃

  • RUNTIME---注解在运行时仍被虚拟机保留,因此可以通过反射读取到注解信息

@DOcumented

在 Javadoc 中引入该注解

@Inherited

允许子类继承父注解

@Repeatable

可以多次应用于同一个声明

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

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

相关文章

大模型+多模态实现

那么如何在预训练LLM的基础上引入跨模态的信息&#xff08;包括图像、语音、视频模态&#xff09;&#xff0c;让其变得更强大、更通用呢&#xff1f;本节将介绍“大模型多模态”的3种实现方法。 以LLM为核心&#xff0c;调用其他多模态组件 微软亚洲研究院&#xff08;MSRA&…

STM32中SPI通信的完整C语言代码范例

SPI (Serial Peripheral Interface) 是一种同步串行通信协议&#xff0c;广泛应用于嵌入式系统中&#xff0c;用于与外设进行数据交换。STM32系列微控制器提供了丰富的SPI外设&#xff0c;支持多种工作模式和配置选项。本文将以STM32F103系列为例&#xff0c;详细介绍SPI通信的…

Java基础(运算符)

运算符 运算符和表达式 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来&#xff0c;符合java语法的式子就可以称为表达式&#xff1b;不同运算符连接的表达式体现的是不同类型的表达式。 算术运算符&#xff08;加…

Linux基础命令[24]-su

文章目录 1. su 命令说明2. su 命令语法3. su 命令示例3.1 不加参数3.2 -&#xff08;登录&#xff09;3.3 -c&#xff08;执行命令&#xff09; 4. 总结 1. su 命令说明 su&#xff1a;以用户身份执行命令&#xff0c;基本信息如下&#xff1a; Usage:su [options] [-] [USE…

一些RabbitMQ面试题

RabbitMQ是什么&#xff0c;它的主要用途是什么 RabbitMQ是一个开源的消息代理软件&#xff0c; 它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c; 主要用于在分布式系统之间进行可靠的异步通信。 它的主要用途包括解耦系统组件、提高系统可扩展性、实现消息…

数据结构四:线性表之带头结点的单向循环循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构&#xff0c;其中链式存储结构为单向链表&#xff08;即一个方向的有限长度、不循环的链表&#xff09;&#xff0c;对于单链表&#xff0c;由于每个节点只存储了向后的结点的地址&#xff0c;到了尾巴结点就停止了向后链的操作。也就…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

Hive主要介绍

Hive介绍 hive是基于 Hadoop平台操作 HDFS 文件的插件工具 可以将结构化的数据文件映射为一张数据库表 可以将 HQL 语句转换为 MapReduce 程序 1.hive 是由驱动器组成&#xff0c;驱动器主要由4个组件组成&#xff08;解析器、编译器、优化器、执行器&#xff09; 2.hive本身不…

什么是Java中的代理模式?

Java中的代理模式&#xff08;Proxy Pattern&#xff09;是一种设计模式&#xff0c;用于在不改变原始对象&#xff08;也称为主题&#xff0c;Subject&#xff09;的代码的情况下&#xff0c;为原始对象提供代理对象&#xff0c;以控制对原始对象的访问。代理模式可以在不改变…

libtorch c10::IValue类解析,从IValue获取值

0. 简介 c10::IValue像一个数据容器&#xff0c;但是它又不用来直接存储数据&#xff0c;只是一层数据的封装。 怎么理解呢&#xff1f;c10::IValue可以存储torchscript里很多类型的数据&#xff0c;比如c10::IValue存储可能是一个Tensor&#xff0c;一组Tensor&#xff0c;或…

【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮

1、需求 屏蔽下拉状态栏谷歌录屏、省电模式、二维码扫描器等快捷按钮。 2、修改路径 普及&#xff1a;安卓的SystemUI包提供了状态栏、导航栏、通知中心等重要的用户界面元素。 状态栏小部件UI显示修改路径&#xff1a;frameworks/base/packages/SystemUI/src/com/android/s…

Java虚拟机(jvm)常见问题总结

1.电脑怎样认识我们编写的Java代码 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不认识 Java文件编译的过程 1. 程…

git lab 2.7版本修改密码命令

1.gitlab-rails console -e production Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux] GitLab: 14.9.0-jh (51fb4a823f6) EE GitLab Shell: 13.24.0 PostgreSQL: 12.7 2根据用户名修改密码 user User.find_by(username: ‘username’) # 替换’use…

无人驾驶(移动机器人)路径规划之RRT与RRTStar算法及其matlab实现

在自动驾驶与移动机器人路径规划时&#xff0c;必定会用到经典的算法RRT与RRT Star。下面是RRT与RRTStar的matlab实现效果。可以发现RRTStar效果明显改善。 目录 一、效果比较 1.1 RRT算法效果&#xff08;黑色为障碍物&#xff0c;红色线为最终路径&#xff0c;蓝色三角形为…

十大经典排序算法之希尔排序。

希尔排序 (Shell Sort) ​ 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;它的基本思想是通过将待排序列表分割成若干个子列表&#xff0c;对每个子列表进行插入排序&#xff0c;然后逐步缩小子列表的间隔&#xff0c;直到间隔为1&#xff…

C++之STL-vector+模拟实现

目录 一、vector的介绍和基本使用的方法 1.1 介绍 1.2 迭代器 1.3 vector的一些基本使用 1.3.1 构造函数 1.3.2 迭代器 1.3.3 有关容量的接口 1.3.4 增删查改 二、模拟实现vector 2.1 成员变量 2.2 迭代器的实现 2.3 容量接口的实现 2.3.1 size函数实现 2.3.2 capa…

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享 阿斯达年代三强争霸这款游戏刚开始公测就获得了玩家们的集体关注&#xff0c;这是一款根据影视剧改编的MMORPG游戏&#xff0c;玩家将置身于名为阿斯大陆的奇幻世界&#xff0c;加入阿斯达、亚高、不法者三大势力…

Prompt之美:如何设计提示词让大模型变“聪明”

目录 一. Prompt关键要素 二. Prompt技巧 三. 实战中的Prompt优化 四. 参考文献 一. Prompt关键要素 Prompt是一个简短的文本输入&#xff0c;用于引导AI模型生成特定的回答或执行特定任务。换句话说&#xff0c;Prompt是你与AI模型沟通的方式。一个好的Prompt可以让AI更准…

从现在开始:让AI写代码,你只负责敲tab键

如果你是一名程序员&#xff0c;你一定有过这样的经历&#xff1a;在编写代码的时候&#xff0c;突然遇到了一个棘手的问题&#xff0c;需要花费大量的时间去查找资料、尝试不同的解决方案&#xff0c;甚至有时候还需要去问同事或者在网上寻求帮助。这样的情况不仅会浪费你的时…

python编解码16进制码流

python编解码16进制码流 目前在做python vue写网站&#xff0c;最近遇到了用python代码编解码16进制的码流&#xff0c;与c语言程序进行交互 自己写了一个简易版的客户端与服务端的python代码&#xff0c;利用到了 struct socket库&#xff0c;因为使用的是udp&#xff0c;所…