一文搞清楚Java中的包、类、接口

写在开头

包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。

Java中的包

Java 定义了一种名字空间,称之为包:package。一个类总是属于某个包,类名(比如Person)只是一个简写,真正的完整类名是包名.类名,这才是唯一确定一个类路径的写法,不同包中的类名允许重复。包名推荐使用倒置的域名,例如org.apache

包的定义

//包名
package hello;

public class Person {
    // 包作用域:
    public void hello() {
        System.out.println("Hello!");
    }
}

包的作用域

通过访问修饰符,可以确认类中方法与属性相对于包的作用域,这在前面的文章中已经提过了,不再赘言,直接贴图。

Java中包的引入通过import关键字实现,在写import的时候,可以使用*,表示把这个包下面的所有class都导入进来(但不包括子包的class):

import java.util.ArrayList;
public class test {
    public static void main(String[] args) {
        ArrayList<Object> objects = new ArrayList<>();
    }
}

当然处理import导入外,也可以通过完成的包名.类名的方式进行引入,但太麻烦了,很少用到。

Java中的类

Java中有个从1995年就喊出的口号“一切皆对象”,而对象在程序中的具象就是通过类(class)来实现!

类的创建

比如有这样一个Person对象,拥有姓名,性别,年龄等特性,行为方式有吃饭,睡觉和跑步,那我们就可以在Java中如下定义:

public class Person {
	//姓名
    private String name;
    //年龄
    private int age;
    //性别
    private int sex;
	/**
	* 吃饭
	*/
    private void eat() {
    }
	/**
	* 睡觉
	*/
    private void sleep() {
    }
	/**
	* 跑步
	*/
    private void run() {
    }
}

类创建好了,如何用呢?这时候需要通过new关键字去创建一个类对应的对象Person person = new Person();

类的初始化赋值

这行代码创建了一个Person对象,并在堆内存中分配一定的空间,person被称为对象Person的引用,通过这个引用可以对对象进行初始化赋值操作

通过引用变量赋值示例代码:

public class Person {
    private String name;
    private int age;
    private int sex;

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "JavaBuild";
        person.age = 18;
        person.sex = 1;
        
        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

通过构造方法赋值

示例代码:

public class Person {
    private String name;
    private int age;
    private int sex;

    public Person(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public static void main(String[] args) {
        Person person = new Person("JavaBuild", 18, 1);

        System.out.println(person.name);
        System.out.println(person.age);
        System.out.println(person.sex);
    }
}

内部类

根据上面的内容,我们已经熟悉了Java中的类,实际上在类的内部依旧可以创建一个类,这样的类就被称之为:内部类,内部类根据创建的位置,关键字等修饰符分为如下几类:

1、成员内部类

编译之后会生成两个class文件:OuterClass.class和OuterClass$InnerClass.class

class OuterClass {
    class InnerClass {} //成员内部类
}

2、方法内部类

编译之后会生成两个class文件:OuterClass.class和OuterClass$1InnerClass.class只能在定义该内部类的方法内实例化,方法内部类对象不能使用该内部类所在方法的非final局部变量当一个方法结束,其栈结构被删除,局部变量成为历史。但该方法结束后,在方法内创建的内部类对象可能仍然存在于堆中

class OuterClass {
    public void doSomething(){
        class Inner{
        }
    }
}

3、匿名内部类

编译后生成两个class文件:Fish.class和Fish$1.class

public class Fish {
    /**
     * 游泳方法
     */
    public void swim() {
        System.out.println("我在游泳!");
    }

    public static void main(String[] args) {
        //创建鱼对象
        Fish fish = new Fish() {
            //重写swim方法
            public void swim() {
                System.out.println("我在游泳,突然发生海啸,我撤了!");
            }
        };
        
        fish.swim();
    }
}

4、静态内部类

静态嵌套类,并没有对实例的共享关系,仅仅是代码块在外部类内部静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它静态嵌套类仅能访问外部类的静态成员和方法在静态方法中定义的内部类也是静态嵌套类,这时候不能在类前面加static关键字

class OuterFish {
    static class InnerFish {
    }
}

class TestStaticFish { 
    public static void main(String[] args) {
        //创建静态内部类对象
        OuterFish.InnerFish iFish = new OuterFish.InnerFish();
    }
}

内部类的特点

1、内部类提供了某种进入其继承的类或实现的接口的窗口
2、与外部类无关,独立继承其他类或实现接口
3、内部类提供了Java的"多重继承"的解决方案,弥补了Java类是单继承的不足
4、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
5、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的
6、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

Java中的接口

在讲OOP时,我们提到过面向对象的四大特性,其中抽象就是那个第四大特性,而抽象的体现在Java中主要为抽象类和接口!接口是通过interface 关键字修饰的,用来对一类具有共性对象的一种抽象,通过不同的类进行实现,来满足各自需求。

接口的特性

1、接口中允许定义变量
2、接口中允许定义抽象方法
3、接口中允许定义静态方法(Java 8 之后)
4、接口中允许定义默认方法(Java 8 之后)
5、接口不允许直接实例化
6、接口可以是空的
7、不要在定义接口的时候使用 final 关键字
8、接口的抽象方法不能是 private、protected 或者 final
9、接口的变量是隐式 public static final(常量)

接口的典型案例

我们在之前聊到对象的浅拷贝与深拷贝时提到过Cloneable接口,这就是一个典型的接口应用案例,Cloneable 和 Serializable 一样,都属于标记型接口,它们内部都是空的。实现了 Cloneable 接口的类可以使用 Object.clone() 方法,否则会抛出 CloneNotSupportedException。

接口与抽象类的区别

1、抽象类可以有构造方法;接口中不能有构造方法(因为不允许直接实例化)。
2、抽象类中可以有普通成员变量;接口中没有普通成员变量。
3、抽象类中可以包含非抽象普通方法;JDK1.8 以前接口中的所有方法默认都是抽象的,JDK1.8 开始方法可以有 default 实现和 static 方法。
4、抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5、抽象类中可以包含静态方法;JDK1.8 前接口中不能包含静态方法,JDK1.8 及以后可以包含已实现的静态方法。
6、抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。
7、一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。
接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

文章转载自:JavaBuild

原文链接:https://www.cnblogs.com/JavaBuild/p/17977509

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python __repr__()方法:显示属性

先看下面程序&#xff1a; class Item:def __init__ (self, name, price):self.name nameself.price price # 创建一个Item对象&#xff0c;将之赋给im变量 im Item(鼠标, 29.8) # 打印im所引用的Item对象 print(im) 上面程序创建了一个 Item 对象&#xff0c;然后使用 prin…

数据库原理及应用期末复习汇总(附某高校期末真题试卷)

文章目录 《数据库原理及应用》试题1一、选择题二、填空三、简答题四、T-SQL综合题五、综合应用题 《数据库原理及应用》试题2一、选择题二、填空三、简答题四、T-SQL综合题五、综合应用题 《数据库原理及应用》试题3一、选择题二、填空三、简答题四、T&#xff0d;SQL语言编程…

性能优化-高通的Hexagon DSP和NPU

原文来自【 Qualcomm’s Hexagon DSP, and now, NPU 】 本文主要介绍Qualcomm Hexagon DSP和NPU&#xff0c;这些为处理简单大量运算而设计的硬件。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xf…

如何在阿里云提交使用工单

有时候大家在使用阿里云的服务时候&#xff0c;可能会遇到一些问题&#xff0c;或许是云服务器如何升级了如何改套餐啊之类的&#xff0c;亦或者是域名ICP备案啊看进度啊等等问题&#xff0c;遇到问题怎么办不要慌。我们可以使用阿里云的工单系统&#xff0c;阿里云工单系统可以…

【UEFI基础】EDK网络框架(MTFTP4)

MTFTP4 在TCP/IP网络协议族中有FTP协议&#xff0c;但是UEFI下的MTFTP4并不是对FTP协议的实现&#xff0c;两者虽然功能上差不多&#xff0c;但是实现却是不同的。FTP下层使用TCP来连接&#xff1a; 而MTFTP4下层却是UDP4。 MTFTP4代码综述 MTFTP4的实现在NetworkPkg\Mtftp4…

AssertionError: Torch not compiled with CUDA enabled

目录 报错查看已安装的torch的版本卸载安装GPU版本的torch查看cuda版本手工安装通过pip命令手工安装。 结果更新cuda到12.1大功告成 报错 经查阅&#xff0c;这个问题是因为conda默认安装的是CPU版本的torch&#xff0c;应该使用GPU版本的。 查看已安装的torch的版本 pip li…

UI设计师主要是做什么的?

由于用户体验越来越受到重视&#xff0c;UI 设计师也成为现代互联网行业不可或缺的职业。他们通过美化和优化软件界面&#xff0c;为用户带来舒适的使用体验&#xff0c;目标是提高用户满意度。本文将对 UI 进行深入分析设计人员的工作职责和 UI 设计人员的工作内容&#xff0c…

云架构师学习------腾讯云通识-网络与安全

云架构师学习------腾讯云通识-存储与数据库 云架构师学习------腾讯云通识-网络与安全云上网络负载均衡工作原理产品优势使用场景技术原理基础架构转发路径 私有网络产品概述VIP核心组成部分私有网络连接私有网络安全 产品优势应用场景访问公网对公网提供服务应用容灾部署混合…

【办公类-19-02】20240122图书EXCEL插入列并删除空行

作品展示 背景需求 上次23个班级班主任统计图书&#xff0c;写在EXCEL内 【办公类-19-01】20240108图书统计登记表制作&#xff08;23个班级&#xff09;EXCEL复制表格并合并表格-CSDN博客文章浏览阅读693次&#xff0c;点赞12次&#xff0c;收藏7次。【办公类-19-01】202401…

webrtc线程代码研究

webrtc线程类的实现集成了socket的收发&#xff0c;消息队列&#xff0c;值得研究&#xff0c;基于webrtc75版本。 主要类介绍 Thread类 虚线&#xff1a;继承 实线&#xff1a;调用 橙色&#xff1a;接口 Thread继承MessageQueueThread提供两个静态方法,分别用来创建带socke…

Asp.net core 框架入门

概述 appsettings.json&#xff1a;配置文件&#xff0c;数据库连接字符串配置信息 Program.cs&#xff1a;程序入口文件&#xff08;里面有个Main方法&#xff09; Startup.cs&#xff1a;启动配置文件 依赖项&#xff1a;管理项目所依赖的第三方组件的安装&#xff0c;配…

数字图像处理(实践篇)二十六 使用cvlib进行人脸检测、性别检测和目标检测

目录 1 安装cvlib 2 涉及的函数 3 实践 4 其他 cvlib一个简单,高级,易于使用的开源Python计算机视觉库。 1 安装cvlib # 安装依赖pip install opencv-python tensorflow# 安装cvlibpip install cvlib</

你不知道的git如何撤销回退版本

简言之&#xff1a;从1 回退到 3&#xff0c;在3版本通过回退记录(git reflog)找到它的上一条回退记录的hash值&#xff0c;复制1的hash值进行回退&#xff0c;执行git reset --hard 粘贴1的hash值进来&#xff0c;此时就回到1的版本了&#xff0c;执行git log即可看到1、2、3、…

HCIA——25FTP 的工作原理、功能、TFTP、控制连接、数据连接的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Oracle 高级网络压缩 白皮书

英文版白皮书在这里 或 这里。 本文包括了对英文白皮书的翻译&#xff0c;和我觉得较重要的要点总结。 执行概述 Oracle Database 12 引入了一项新功能&#xff1a;高级网络压缩&#xff0c;作为高级压缩选项的一部分。 本文概述了高级网络压缩、其优点、配置细节和性能分析…

C# 线程本地存储 为什么线程间值不一样

一&#xff1a;背景 1. 讲故事 有朋友在微信里面问我&#xff0c;为什么用 ThreadStatic 标记的字段&#xff0c;只有第一个线程拿到了初始值&#xff0c;其他线程都是默认值&#xff0c;让我能不能帮他解答一下&#xff0c;尼玛&#xff0c;我也不是神仙什么都懂&#xff0c…

Dockerfile中CMD命令的用法,你了解几个?

文章目录 1.问题描述2.解决方法3.问题原因分析4.CMD常见的用法4.1 执行应用程序4.2 使用 Shell 执行命令4.3 定义环境变量 5.最佳实践 1.问题描述 今天在进行业务调试时, 发现调试的java应用所在的容器无限重启&#xff0c;经过排查发现问题出在Dockerfile 文件中的CMD命令上&…

设计模式下

一、代理模式 一、概念 代理模式就是给一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引 用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表&#xff0c; 其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。 例如&#xff1a;去…

安装 nvm

前言&#xff1a; nvm 即 node 版本管理工具 (node version manager)&#xff0c;好处是方便切换 node.js 版本。 通过将多个 node 版本安装在指定路径&#xff0c;然后通过 nvm 命令切换时&#xff0c;就会切换我们环境变量中 node 命令指定的实际执行的软件路径。 使用场景…

Selenium自动化测试之学会元素定位

这是我经常被问到的一个问题&#xff0c;也是我很讨厌回答的问题&#xff0c;因为要想回答这个问题需要知道上下文。什么样式的元素&#xff0c;有哪些属性&#xff0c;是否有表单嵌套&#xff0c;都尝试了哪些定位方法。。。而且没几个提问者能事先详细的说明这些。哪儿像提bu…