接口和包--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和interface对比
abstract
- 定义实例字段
- 定义抽象方法
- 定义非抽象方法
- but,只能extends一个class
interface
- 可以implements多个interface
- 定义抽象方法
- 定义default方法
- but,不能定义实例字段
default方法
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.util和java.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
}
}
import
在一个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();
}
}
import static
此方法可以导入一个类的静态字段和静态方法,此语法比较少用
//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.logcom.jayden.sample
子包就可以根据功能自行命名
注意不要和java.lang的包的类重名
StringSystemRuntime- ...
也不要和jdk常用的类重名
java.util.Listjava.text.Formatjava.math.BigInteger- ...
接口和包--Java学习笔记的更多相关文章
- Java学习笔记之---比较接口与抽象类
Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- java学习笔记13--比较器(Comparable、Comparator)
java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
随机推荐
- Linux | 搜索命令
grep grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式:grep[选项][文本] grep命令的参数及其作用 参数 作用 -b 将可执行文件当作文本文件对待 -c 公显示找到的行数 ...
- python03篇 字符串常用方法和文件操作(一)
一.字符串常用方法 s1 = ' abcsfsfaadfdd ' s = s1.strip() print(s) print(len(s.strip())) print(s.count('a')) # ...
- final修饰符(3)-基本类型变量和引用类型变量的区别
final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...
- 前端js重组树形结构数据方法封装
不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...
- 学习总结 NCRE二级和三级
NCRE二级C语言 证书 考试感想 2016年考的认证,5年过去了,"光阴荏苒真容易".趁着心有余力有余的时候,把一些个人的体会分享给大家,希望后来人能平稳前行. Windows ...
- deepin使用synergy鼠标越界软件实现和另一台windows系统共享鼠标
1,搜索synergy就能找到很多安装和配置的博客文章. 2,我遇到的问题: 1,在linux(deepin)上安装1.8.8版本报出找不到依赖libssl.so.1.0.0的错误,导致无法成功启动软 ...
- PAT乙级:1094 谷歌的招聘 (20分)
PAT乙级:1094 谷歌的招聘 (20分) 题干 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面 ...
- 最近被旷视的YOLOX刷屏了!
目录 论文主要信息 文章概要 背景 YOLOX-DarkNet53 实现细节 YOLOv3 baseline Decoupled head 实验 思路 story Strong data augmen ...
- FastDFS是使用c语言编写的开源高性能分布式文件系统
FastDFS是什么 FastDFS是使用c语言编写的开源高性能分布式文件系统 是由淘宝开发平台部资深架构师余庆开发,FastDFS孵化平台板块 他对文件进行管理,功能包括文件存储,文件同步,文件访问 ...
- python序列化proto时对repeated修饰数据进行赋值(常用类型和其他类型)
说一下对proto文件中数据使用时的书写方法,因为笔者也经常弄混淆 一.repeated修饰符,该列表是常用类型,比如int message C2GS_GoodsList { repeated int ...