java成神之——接口,泛型,类
接口
接口定义
java中的接口也是单独使用一个文件定义,接口的定义相当简单,权限固定为public,变量只能定义为常量,方法只能抽象
接口成员只能是如下几种情况
public interface MyInterface {
public abstract void fn(); // 只能使用public修饰符
abstract void fn1(); // 效果和上面写法一致
public static final int a = 1; // 表示静态常量
String b = "bb"; // 效果和上面写法一致
}
默认方法
interface MyInterface {
default void fn() {
System.out.println( "default implementation" );
}
}
public class Test implements MyInterface {
@Override
public void fn() {
System.out.println( "overridden implementation" );
}
public static void main(String[] args) throws Exception{
MyInterface.super.fn();
fn();
}
}
函数式接口
@FunctionalInterface
public interface MyInterface<T> {
T test(T t);
}
MyInterface<String> test = (t) -> t;
test.test("啦啦啦");
泛型
泛型类
class Test<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Test<Integer> test = new Test<Integer>();
泛型类继承
第一种
class Inheritor extends Test<String> {
}
Inheritor inherit = new Inheritor();
inherit.setValue("只能是字符串");
第二种
class Inheritor<T> extends Test<T> {
}
Inheritor<Integer> inherit = new Inheritor<>();
inherit.setValue(1);
第三种
class Inheritor extends Test {
}
Inheritor inherit = new Inheritor();
inherit.setValue("这里可以传递任何类型的值");
第四种
class Inheritor<T, E> extends Test<E> {
}
Inheritor<String, Integer> inherit = new Inheritor<>();
inherit.setValue(1);
第五种
抽象类
abstract class Test<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Test<String> test = new Test<String>(){};
test.setValue("字符串");
类型限定
? extends T 表示?必须继承自T
? super T 表示?必须是T的父级
class Test<T extends Object>{}
class Test<T extends Object & Iterable<T>>{}
泛型方法
public <T> List<T> Fn(T t1, T t2) {
List<T> result = new ArrayList<T>();
result.add(t1);
result.add(t2);
return result;
}
List<String> list = Fn("a", "b"); // 无需手动指定泛型类型,程序会自动推断类型
如果需要你可以强制指定自己需要的类型
List<Object> list = this.<Object>Fn(1, "a");
泛型接口
interface MyInterface<T> {
public void Fn(T t);
}
类
构造函数
单个构造函数
public class demo2 {
public int a;
public demo2 (int i) {
this.a = i;
}
}
多个构造函数
public class demo2 {
public int a;
public demo2() {
this(111); // 只能写在第一行
}
public demo2 (int i) {
this.a = i;
}
}
类的继承
public class Test2 {
public String str = "aaa";
}
public class Test1 extends Test2 {
public void fn() {
System.out.println(str);
}
}
java中子类重写父类的方法,直接写方法就可以了,
子类中的重写的方法的权限必须大于或者等于父类方法的权限
子类继承父类,需要父类有无参数的构造函数
默认情况下,类不写构造函数会自动编译一个无参数构造函数,除非人为指定构造函数,如下
public class demo2 {
public demo2(int i) {
}
}
public class demo1 extends demo2 {
public int a;
public demo1() {
// super(); 默认情况下不写super,系统会自动编译成 super(),所以父类不包含无参数构造函数就会报错
super(111); // super只能写在第一行
}
}
抽象类
抽象类,就是一个风马牛不相及的东西的共性提取,不能实例化
abstract public class Test3 {
public String str = "aaa";
public abstract void fn(); // 抽象方法只能定义,具体实现必须在子类中完成
}
抽象方法不能和 private,final,static 一起使用
instanceof运算符
用来判断一个对象是否是一个类的实例
demo2 test = new demo2();
boolean b = test instanceof demo2;
内部类
public class demo {
int i = 1;
public class demo1 {
int i = 2;
public void fn() {
int i = 3;
System.out.println(i); // 3
System.out.println(this.i); // 2
System.out.println(demo.this.i); // 1
}
}
}
使用此内部类
demo.demo1 test1 = new demo().new demo1();
test1.fn();
equals
引用类型比较的地址是否相同,值类型比较值是否相同
demo test1 = new demo();
demo test2 = new demo();
boolean b = test1.equals(test2);
可以重写equals方法,实现自定义比较
public boolean equals (Object obj) {
demo d = (demo)obj;
return this.a = d.a;
}
结语
本文章是java成神的系列文章之一
如果你想知道,但是本文没有的,请下方留言
我会第一时间总结出来并发布填充到本文
java成神之——接口,泛型,类的更多相关文章
- java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作
ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...
- java成神之——注释修饰符
注释修饰符 自定义注释 元注释 通过反射在runtime访问注释 内置注释 多注释实例 错误写法 使用容器改写 使用@Repeatable元注释 注释继承 使用反射获取注释 获取类的注释 获取方法的注 ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
- java成神之——enum枚举操作
枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声 ...
- java成神之——集合框架之ArrayList,Lists,Sets
集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...
- java成神之——jaxb操作xml的基本使用
JAXB 依赖 读取xml配置 写配置 自定义写配置 结语 JAXB 依赖 <dependency> <groupId>javax.activation</groupId ...
- java成神之——文件IO
文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...
- java成神之——properties,lambda表达式,序列化
Properties 加载defaults.properties文件 写Properties到xml文件 读Properties从xml文件 Lambda表达式 自定义 内置 sort方法中使用Lam ...
- java成神之——java常识
java常识 简单DOS命令 java基础名词 java编译和运行流程 Eclipse常用快捷键 Eclipse相关操作 java基本数据类型 java基本数据类型转换 java常用运算符 java流 ...
随机推荐
- mysql数据库(三):查询的其他用法
一. 查询—IN的用法 语法:select ... from 表名 where 字段 a in (值b, 值c, 值d...) 等价于 select ... from 表名 where 字段a=值b ...
- ZOJ 3488 Conic Section
The conic sections are the nondegenerate curves generated by the intersections of a plane with one o ...
- SpringBoot_11_将springboot项目部署到外部tomcat上
一.前言 二. 三.参考资料 如何将Spring Boot项目打包部署到外部Tomcat 2.SpringBoot 项目如何在tomcat容器中运行
- ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等(一)
ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等 如果此文章对你有帮助,请关注一下哦 1.1 搭建maven 工程 创建web工程 ...
- LeetCode OJ:Next Permutation(下一排列)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 简要谈谈javascript bind 方法
最近去参加了场面试,跟面试官聊了很多JS基础上的东西,其中有个问题是谈谈对apply.call.bind的理解和区别.顿时一愣,apply.call我知道,经常用的东西,bind是什么鬼!!!好像见过 ...
- Activity的生命周期,BACK键和HOME对生命周期的影响
下面这张图详细的描述了Activity的整个生命周期: 直接上代码,注意看注释: [java] view plaincopy public class HelloActivity extends Ac ...
- 伪元素:focus-within
1.盒子边框的线条动画: <div class="cont"> <div class="bb"></div> </di ...
- docker 基本学习
Docker的应用场景: 加速本地开发和构建流程,使其更加高效.更加轻量化.本地开发人员可以构建.运行并分享Docker容器.容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境. ...
- Spring字符编码过滤器
1 <filter> 2 <filter-name>characterEncodingFilter</filter-name> 3 <filter-class ...