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流 ...
随机推荐
- 51nod 1287 线段树
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. # ...
- 【lightoj-1039】A Toy Company(BFS)
The toy company "Babies Toys" has hired you to help develop educational toys. The current ...
- uboot主Makefile分析
VERSION = 1 PATCHLEVEL = 3 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(S ...
- Elasticsearch Painless语言(实现搜索打分基础)
With the release of Elasticsearch 5.x came Painless, Elasticsearch's answer to safe, secure, and per ...
- SpringCloud 教程 | 第十四篇: 服务注册(consul)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/art ...
- rem第一天
Rem为单位 CSS3的出现,他同时引进了一些新的单位,包括我们今天所说的rem.在W3C官网上是这样描述rem的——“font size of the root element” .下面我们就一起来 ...
- 使用 minio 搭建私有对象存储云。aws-php-sdk 操作object
How to use AWS SDK for PHP with Minio Server aws-sdk-php is the official AWS SDK for the PHP program ...
- SQLServer2008导入Excel遇到的问题
今天同事给客户处理基础物料信息,要把Excel中的几千行物料信息导入到数据库.觉得不是啥难事,写个SQL语句而已,没成想,实际一操作,出问题了. SELECT * FROM OPENROWSET('M ...
- linux rhel7下安装python
1.查看是否已经安装Python Centos7默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用python -V命令查看一下是否安装Pytho ...
- 简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点往下一直到叶子节点形成一条路径. 思路:很明显用前序遍历可以从根节点开始遍历到叶子节点,然后将遍历的节点添加到 ...