接口和包–Java学习笔记

interface定义:没有字段的抽象类

interface person{
    void hello();
    String getName();
}
/*接口本质上就是抽象类
abstract class person{
    public abstract void fun();
    public abstract String getName();
}
*/

如上代码,方法没有具体化,在需要调用的类里面通过覆写来实现具体功能,多个类之间重新覆写的功能相互不影响。继承接口时,一定要覆写接口里的所有方法

class student implements person{
    private String name;
    public student(String name){
        this.name = name;
    }
    @override
    public void hello(){
        System.out.print("hello, " + this.name);
    }
    @override
    public String getName(){
        return this.name;
    }
}
class teacher implements person{
    private String name;
    public student(String name){
        this.name = name;
    }
    @override
    public void hello(){
        System.out.print("hello, Mr/Mrs." + this.name);
    }
    @override
    public String getName(){
        return this.name;
    }
}

普通类继承中,只能继承一个类,而接口可实现多继承

class teacher implements person, parents{/**/}

一个interface可以继承自另一个interface

interface hello{
    void hello();
}
interface person extends hello{
    void fun();
    String getName();
    //此时,person接口实际上有三个抽象方法前面,其中一个继承自hello
}

abstract

  • 定义实例字段
  • 定义抽象方法
  • 定义非抽象方法
  • but,只能extends一个class

interface

  • 可以implements多个interface
  • 定义抽象方法
  • 定义default方法
  • but,不能定义实例字段
public class aa {
    public static void main(String[] args) {
        person p = new student("aaaaa");
        p.fun();
    }
}
interface person {
    String getName();
    default void fun() {
        System.out.println(getName() + " fun()");
    }//default修饰具体方法
}
class student implements person {
    private String name;
    public student(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    //在这个例子中,student类就没有去重新覆写fun()函数
}

当接口新增一个方法时,会涉及到修改全部子类,如果新增的是default方法,子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法

default和抽象类的普通方法是不太一样的,interface没有字段,default无法访问字段,而抽象类的普通方法可以访问实例字段。不过在interface中,default可以修饰具体方法

public class aa {
    public static void main(String[] args) {
        person.setNumber(99);
        System.out.println(person.number);
    }
}
class person {
    public static int number;
    public static void setNumber(int value) {
        number = value;
    }
}

静态方法属于class不属于实例,可以直接通过类名来调用

尽管interface是纯抽象类,但它可以有静态字段,静态字段必须是final类型

//person.java
public interface person{
    public static final int male = 1;
    public static final int female = 2;
}

实际上,因为interface的字段只能是 public static final类型,所以我们可以把int前面的修饰符去掉

//person.java
public interface person{
    int male = 1;
    int female = 2;
    //编译器会自动把该字段变为public static final类型
}

例如,在同一文件夹下,a写了一个person类,b也写了一个person类,c想用a和b的person类,这时候引入包(package)的概念

aa.java

package hello;
class person{}
public class aa{}

bb.java

package hello;
class person{}
public class bb{}

包可以是多层结构,用 .隔开,例如 java.util

:::tip

包没有父子关系, java.utiljava.util.zip是不同的包,两者没有继承关系

:::

例如,如果想要定义包hello,则需要新建一个文件夹并命名为hello,文件夹下存放有hello包的Java文件

hello\person.java

package hello;
public class person{
    void hello(){
        System.out.println("hello");
    }
}

hello\main.java

package hello;
public class main{
    public static void main(String[] args){
        person p = new person();
        p.hello();//result: hello
    }
}

在一个class中,我们会引用其他的class,例如,Jay的 person.jay类,如果要引用jjlin的 hello.jjlin类,需要引入这个包

hello\jjlin.java

//jjlin.java
package hello;
public class jjlin{
    public void fun(){
        System.out.println("hello");
    }
}

person\jay.java

//jay.java
package person;
import hello.jjlin;//表示引入hello文件夹下的jjlin文件
public class jay{
    public void run(){
        jjlin temp = new jjlin();
    }
}

除了引入包下的具体类,也可以使用*,把包下的所有class都导入进来(不辨认子包的class)

package person;
import jay.*;//引入jay文件夹下所有class
public class jay{
    public void run(){
        jjlin temp = new jjlin();
    }
}

此方法可以导入一个类的静态字段和静态方法,此语法比较少用

//package main;
import static java.lang.System.*;
//导入System类的所有静态字段和静态方法
public class main{
    public static void main(String[] args){
        out.println("hello");
        //如果不引用System包,则要写成下面形式
        //System.out.println("hello");
    }
}

Java编译器最终编译出的 .class文件只是用完整类名,因此,在代码中,当编译器遇到一个class名称时:

  • 如果是完整类名,就直接根据完整类名来查找这个class
  • 如果是简单类名,依次按照下面的顺序依次查找
  • 查找当前package是否存在这个class
  • 查找import包是否含有这个class
  • 查找 java.lang包是否含有这个class

如果按照上面规则还无法确定类名,则编译报错

下面是一个例子

//main.java
package test;
import java.text.Format;
public class main{
    public static void main(String[] args){
        java.util.list list;//ok,使用完整类名
        Format format = null;//ok,使用import的类
        String s = "hi";//ok,使用java.lang的包的String
        System.out.println(s);//ok,使用java.lang的包的System
        MessageFormat mf = null;//错误,无法找到MessageFormat
    }
}

因此在编写class时,编译器会自动帮我们做两个import动作

  • 默认自动import当前package的其他class
  • 默认 import java.lang.*

自动导入的是 java.lang的包,但类似 java.lang.reflect这些包还需要手动导入

为避免名字冲突,我们需要确定唯一的包名,推荐使用倒置的域名来确保唯一性

  • org.apache,本质上是 /org/apache/路径下的class,下同
  • org.apache.commons.log
  • com.jayden.sample

子包就可以根据功能自行命名

注意不要和 java.lang的包的类重名

  • String
  • System
  • Runtime

也不要和jdk常用的类重名

  • java.util.List
  • java.text.Format
  • java.math.BigInteger

Original: https://www.cnblogs.com/jaydenchang/p/15064331.html
Author: JaydenChang
Title: 接口和包–Java学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585176/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Tool 4 安装 Thymeleaf 3.0 插件

    参考资料 说在前面 最小要求 步骤 1.下载 Spring Tool 4.7.1 2.下载 thymeleaf 的 eclipse 插件 2.打开 STS – Help…

    Java 2023年6月9日
    094
  • Sql Server 基本概述

    SqlServer用户权限 设置权限用户的意义 数据库是一个应用程序,运行起来对应一个进程,这个进程中,有很多很强大的功能支持,对于开发者或者是数据库管理者,都是充分的来应用这些功…

    Java 2023年6月15日
    064
  • 编写 java 程序,为家用电脑 ipv6 自动更新 goddy dns 记录(ddns)

    家里放了一台旧 acer 笔记本电脑,外挂几个硬盘盒,插上几个硬盘,组成硬盘盒。 因笔记本电脑的耗电较小,硬盘盒有自动休眠省电模式,所以长期开机。此笔记本电脑,使用家庭的移动宽带,…

    Java 2023年6月9日
    0101
  • 高可用架构(上)

    1. 背景 在学习完各种高性能发实现方案后,就需要对三大复杂度一直的高可用进行开刀了,在高可用方面主要有哪些东西是我们需要考虑的呢?接下来将从三个方面逐一分析。 2. 理论 在设计…

    Java 2023年6月15日
    055
  • shell 编程

    shell 编程 Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一…

    Java 2023年6月5日
    077
  • 戏说领域驱动设计(十九)——外验

    内验是针对领域模型自身的验证,其验证规则也是由领域模型自已来完成,只是触发的时机可能在工厂中也可能在构造函数中。与内验对应的当然就是外验了,这是用于对用户的输入和业务流程的前提或得…

    Java 2023年6月7日
    071
  • 关于提问

    A 和 B 对话如下: A: xx 产品,一个月一个版本,只包含一个小功能,培训销售的工作跟不上怎么办?培训工作跟不上,研发做的功能前端都不知道,那做了有什么用?为什么不规划成大版…

    Java 2023年6月16日
    087
  • 怎么判断一个对象已经被回收—虚引用

    虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无…

    Java 2023年6月6日
    061
  • 详细分析Java中断机制-转载

    引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任…

    Java 2023年5月29日
    055
  • javaGUI中下拉列表联动问题

    首先 : 具体解释下 标题 下拉列表联动 就是将两个或两个以上的下拉列表连接(称作连接,后面就明白什么意思了) 简单的 例如 当我们点击别的省或市时 简而言之 就是实现下拉列表的联…

    Java 2023年6月5日
    087
  • netty源码学习之channelHander的组织管理

    当netty server启动时 调用bind方式 时 会开始注册serverChannel 有必要说下 pipeline.addLast 方法 它在添加一个hander的时候 会…

    Java 2023年6月5日
    079
  • nginx location中斜线的位置的区别

    最新在配置nginx时,意外发现location中目录斜线有和没有的区别,百度了找找发现没有几个人说的清楚,最后找到一个兄弟写的还比较实用,再次谢过(https://blog.cs…

    Java 2023年5月30日
    095
  • Shiro中Subject对象的创建与绑定流程分析

    我们在平常使用Shrio进行身份认证时,经常通过获取Subject 对象中保存的Session、Principal等信息,来获取认证用户的信息,也就是说Shiro会把认证后的用户信…

    Java 2023年6月9日
    077
  • Java并发工具类

    在 JDK5 之后的并发包中提供的 CountDownLatch 也可以实现 join 的功能,并且比 join 的功能更多 2.CyclicBarrier CyclicBarri…

    Java 2023年5月29日
    085
  • MongoDB常用命令(2)

    1、创建数据库 use testdb 2、创建集合 db.t_member.insert({name:"zhaomin",age:23}) 3、查询 db.t_…

    Java 2023年6月7日
    066
  • 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部署linux + nginx二:部署windows + tomcat(无nginx)三:解决调用第三方a…

    Java 2023年5月30日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球