Java基础之接口(详细笔记)

26 篇文章 3 订阅

目录

 接口的本质

接口的语法:

接口的使用也满足多态性

接口的非匿名实现类的非匿名对象

 接口的非匿名实现类的匿名对象

 接口的匿名实现了类的非匿名对象

 接口的匿名实现类的匿名对象

接口的应用:代理模式

笔试题and面试题

 用接口实现两个对象的比较

Java8中关于接口的改进


 

 接口的本质

接口是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法都没有方法体

在Java程序设计语言中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。继承是一个“是不是”的关系,接口实现则是能不能的关系。接口的本质是契约,标准,规范。

1.接口不是类,不能使用new运算符实例化一个接口

2.类可以实现多个接口,弥补Java单继承的局限性

3.接口和类是并列的两个结构

4.接口的方法都是抽象方法

x= new Comparable(...);//ERROR
Comparable x;//OK

接口变量必须引用实现了接口的类对象

x=new Employee(...);//OK provide Employee implements Comparable

接口的语法:

public interface pain{
void draw();
}

定义接口方法可省略public abstract 关键字

一个类继承一个父类的同事再实现一个接口,可以写成如下形式

public class Parallelogram extends Quardrangle implements Paintable{

}

JDK7及以前,只能定义全局常量和抽象方法。

  • 全局常量:public static final的
  • 抽象方法:public abstract 的

JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法。

视频笔记:

public class test {
	public static void main(String[] args)
	{
		System.out.println(fly.max_speed);
		System.out.println(fly.min_speed);
	}
}
interface fly{
	//全局常量
	public static final int max_speed=7900;//第一宇宙速度
	public static final int min_speed=1;
}

有些修饰符可省略

 

 接口中不可创建构造器,则接口不能实例化。

  • 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
  • 如果实现类没有覆盖接口中的所有覆盖方法,则此实现类仍为一个抽象类

 下面看一段代码

public class test {
	public static void main(String[] args)
	{
		System.out.println(fly.max_speed);
		System.out.println(fly.min_speed);
		bird a1=new bird();
		a1.f();
	}
}
interface fly{
	//全局常量
		public static final int max_speed=7900;//第一宇宙速度
		public static final int min_speed=1;
	public  abstract void f();
	void g();//public abstract可省略
		
}
class bird implements  fly{
	public void f()
	{
		System.out.println("飞吧");
	}
	public void g()
	{
		
	}
}

类bird中f()和g()方法都要重写,否则会报错.或者在class前面加个abstract,表面自己还是一个抽象类,不实例化

 实现多个接口:

public class test {
	public static void main(String[] args)
	{
		System.out.println(fly.max_speed);
		System.out.println(fly.min_speed);
		bird a1=new bird();
		a1.f();
	}
}
interface fly{
	//全局常量
		public static final int max_speed=7900;//第一宇宙速度
		public static final int min_speed=1;
	public  abstract void f();
	void g();//public abstract可省略
		
}
interface attack{
	void ak();
	
}
 class bullet implements fly,attack{
	public void ak() {
		
	}
	public void f()
	{
		
	}
	public void g()
	{
		
	}
}
class bird implements  fly{
	public void f()
	{
		System.out.println("飞吧");
	}
	public void g()
	{
		
	}
}

 格式:

class A extends B implements C,D,E

类和接口之间是实现关系,接口和接口之间是继承关系,接口与接口之间也可以多继承

  • 接口的使用,体验多态性
  • 接口实际上可以看做是一种规范

接口也可以继承多个接口

public interface A{ 
public void testA();
}
public interface B{ 
public void testB();
}
public interface C extends A,B{
 public void testC(); 
}

接口的使用也满足多态性

接口的非匿名实现类的非匿名对象

public class test {
	public static void main(String[] args)
	{
    Computer A=new Computer();
    U u1=new U();
    A.transferdate(u1);
	}
}
interface USB	{
	void start();
	void stop();
}
class U implements USB{
	public void start()
	{
		System.out.println("U盘开始工作");
	}
	public void stop()
	{
		System.out.println("U盘结束工作");
	}
}
class  print implements USB{
	public void start()
	{
		System.out.println("打印机开始工作");
	}
	public void stop()
	{
		System.out.println("打印机结束工作");
	}
}
class Computer{
	public void transferdate(USB usb)
	{
		usb.start();
		System.out.println("传输过程");
		usb.stop();
	}
	
}

可以将上下两幅图的代码进行对比 

public class test {
	public static void main(String[] args)
	{
    Computer A=new Computer();
    print k=new print();
    A.transferdate(k);
	}
}
interface USB	{
	void start();
	void stop();
}
class U implements USB{
	public void start()
	{
		System.out.println("U盘开始工作");
	}
	public void stop()
	{
		System.out.println("U盘结束工作");
	}
}
class  print implements USB{
	public void start()
	{
		System.out.println("打印机开始工作");
	}
	public void stop()
	{
		System.out.println("打印机结束工作");
	}
}
class Computer{
	public void transferdate(print usb)
	{
		usb.start();
		System.out.println("传输过程");
		usb.stop();
	}
}

 接口的非匿名实现类的匿名对象

 A.transferdate(new print());

 接口的匿名实现了类的非匿名对象

public class test {
	public static void main(String[] args)
	{
    Computer A=new Computer();
    USB phone=new USB() {
    	public void start()
    	{
    		System.out.println("手机开始工作");
    	}
    	public void stop()
    	{
    		System.out.println("手机结束工作");
    	}	
    };
    A.transferdate(phone);
	}
}
interface USB	{
	void start();
	void stop();
}
class U implements USB{
	public void start()
	{
		System.out.println("U盘开始工作");
	}
	public void stop()
	{
		System.out.println("U盘结束工作");
	}
}
class  print implements USB{
	public void start()
	{
		System.out.println("打印机开始工作");
	}
	public void stop()
	{
		System.out.println("打印机结束工作");
	}
}
class Computer{
	public void transferdate(USB usb)
	{
		usb.start();
		System.out.println("传输过程");
		usb.stop();
	}
}

 接口的匿名实现类的匿名对象

public class test {
	public static void main(String[] args)
	{
    Computer A=new Computer();
    A.transferdate(new USB(){
    	public void start()
    	{
    		System.out.println("xx开始工作");
    	}
    	public void stop()
    	{
    		System.out.println("xx结束工作");
    	}	
    });	
	}
}
interface USB	{
	void start();
	void stop();
}
class U implements USB{
	public void start()
	{
		System.out.println("U盘开始工作");
	}
	public void stop()
	{
		System.out.println("U盘结束工作");
	}
}
class  print implements USB{
	public void start()
	{
		System.out.println("打印机开始工作");
	}
	public void stop()
	{
		System.out.println("打印机结束工作");
	}
}
class Computer{
	public void transferdate(USB usb)
	{
		usb.start();
		System.out.println("传输过程");
		usb.stop();
	}

接口的应用:代理模式

public class test {
	public static void main(String[] args)
	{
		server A=new server();//造完被代理类对象后,扔到代理类对象去调用方法
		proxyserver ps=new proxyserver(A);
		ps.browse();
	}
}
interface network{
	public void browse();
	
}
//被代理类
class server implements network{
	public void browse()
	{
		System.out.println("访问网络");
	}
}
//代理类
class proxyserver implements network{
	private network work;
	public proxyserver (network work)
	{
		this.work=work;
	}
	public void check()
	{
		System.out.println("检查工作");
	}
	public void browse()
	{
		check();
		work.browse();
	}
}

视频笔记: 

 代理模式的应用场景

  • 安全代理:屏蔽对真实角色(被代理类)的直接访问
  • 远程代理:通过代理类处理远程方法调用(RMI)
  • 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象

分为静态代理(静态定义代理类)和动态代理(动态生成代理类)

笔试题and面试题

下面看一段错误的代码

public class test {
}
interface A{
	int x=0;
}
class B{
	int x=1;
}
class C extends B implements A{
	public void p()
	{
		System.out.println(x);
	}
}

视频笔记:一般父类B的属性和接口的属性尽量不要写重名

public class test {
}
interface A{
	int x=0;
}
class B{
	int x=1;
}
class C extends B implements A{
	public void p()
	{
		//System.out.println(x);
		System.out.println(super.x);//1
		System.out.println(A.x);//A.属性
	}
}

 下面看一段错误的代码

public class test {
}
interface A{
	void f();
}
interface B{
	void f();
}
interface C extends A,B{
	jtest j=new jtest("小明");
}
class jtest implements C{
 private String name;
 public  jtest(String name)
 {
	this.name=name;
 }
 public String  getname()
 {
	 return name;
 }
 public void f()
 {
	 j=new jtest("小王");
	 System.out.println(j.getname());
 }
}
  • 类jtest中对方法f()的重写可以理解为对A,B中的方法f()都重写了
  • 我们需要注意j=new jtest("小王");这行代码,由接口的定义我们可以指知道jtest j=new jtest("小明");这行代码前面省略了public static final等修饰符

 用接口实现两个对象的比较

public interface compareobject {
	public int compare(Object o);//规范:返回0代表相等,返回正数代表当前对象大,返回负数则相反
}
public class square {
private double s;
public double gets()
{
	return s;
}
public void sets(double s)
{
	this.s=s;
}
public square()
{
	super();
}
public square(double s)
{
	super();
	this.s=s;
}
}
//comparesquare类继承square并且实现compareobject的接口,给出接口中方法compare的实现体,用来比较大小
public class comparesquare extends square implements compareobject{
public comparesquare (double s)
{
	super(s);
}
	public int compare(Object o)//规范:返回0代表相等,返回正数代表当前对象大,返回负数则相反
	{
		if(this==o)
		{
			return 0;
		}
		if(o instanceof comparesquare)
		{
			comparesquare n=(comparesquare)o;
		if(this.gets()>n.gets())
		{
			return 1;
		}
		else if(this.gets()<n.gets()) {
			return -1;
		}
		else {
			return 0;
		}
		}
		else {
			return 0;
		}
	}
}
public class test {
	public static void main(String[] args)
	{
	comparesquare A=new comparesquare(28.0);
	comparesquare B=new comparesquare(2.0);
	int m=A.compare(B);
	if(m>0)
	{
		System.out.println("A大");
	}
	if(m<0)
	{ 
		System.out.println("B大");
	}
	if(m==0)
	{
		System.out.println("一样大");
	}	
}
}

Java8中关于接口的改进

  1.  java8中,可以为接口添加静态方法和默认方法。
  2. 静态方法:static修饰,可以通过接口直接调用静态方法,并执行其方法体。
  3. 默认方法:使用default修饰,可以通过实现类的对象来调用。在已有的接口中提供新方法的同时,还保持了与旧代码的兼容性:Java8 API中对Collection,List等接口提供了丰富的默认方法

  • 接口中的静态方法只能通过接口来调用:接口.静态方法。
  • 通过实现类的对象,可以调用接口中的默认方法

学习如逆水行舟,不进则退,和小吴一起加油吧!

  

  • 42
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 53
    评论
Java基础学习笔记 # 一、Java简介 Java是一种面向对象的编程语言,由Sun Microsystems(现在是Oracle)于1995年首次发布。它具有跨平台的特性,可以在不同的操作系统上运行。Java语言被广泛应用于开发各种类型的应用程序,包括桌面应用、Web应用、移动应用等。 # 二、Java基本语法 ## 1. 变量与数据类型 Java是强类型语言,每个变量必须先声明后使用。Java提供了多种数据类型,包括基本数据类型(整数、浮点数、字符、布尔值)和引用数据类型(类、接口、数组)。 ## 2. 运算符 Java提供了多种运算符,包括算术运算符、关系运算符、逻辑运算符等,用于进行各种数学或逻辑运算。 ## 3. 控制流程 Java提供了多种控制流程语句,包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环)、跳转语句(break语句、continue语句)等,用于控制程序的执行流程。 ## 4. 方法和类 Java中的方法用于封装一段可重复使用的代码,可以带有参数和返回值。类是Java程序的基本组织单位,包含了属性和方法。可以使用关键字class定义一个类,通过实例化类的对象来调用其方法。 # 三、面向对象编程 Java是一种面向对象的编程语言,面向对象编程的核心概念包括封装、继承和多态。 ## 1. 封装 封装是将数据和行为打包成一个类,通过访问修饰符(public、private等)控制对类的成员的访问权限。 ## 2. 继承 继承允许一个类继承另一个类的属性和方法,并且可以通过重写来修改或扩展继承的方法。 ## 3. 多态 多态允许通过父类类型的引用来引用子类对象,实现对不同子类对象的统一调用。 # 四、异常处理 Java提供了异常处理机制,用于处理程序中的错误情况。异常分为可检查异常(checked exception)和不可检查异常(unchecked exception),可以使用try-catch语句来捕获和处理异常。 # 五、Java标准库 Java标准库提供了大量的类和接口,用于完成各种常见的任务。其中包括输入输出、集合、多线程、网络编程等功能,可以大大简化开发过程。 以上是我学习Java基础笔记总结,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴有想法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值