【Java→抽象类与接口】懒惰的小黑笔记11(小白一名,请大家多指点)

声明: 此笔记本人通过观看【尚学堂】+(赖小平主编)清华大学出版社的《Java程序设计》感悟整理得出, 若有任何相关问题,请注明来源联系作者!

7.1 抽象类与抽象方法

类的设计即为一个抽象的过程。在设计类的时候会出现这样的一种情况,希望某个类具有某些功能,但目前无法进行具体的实现。这是java提供了抽象类和抽象方法解决问题。

使用abstract定义抽象类,语法格式:

[访问修饰符] abstract class 类名{
类成员
}

使用abstract定义抽象方法,语法格式:

[访问修饰符] abstract 返回类型 方法名(参数列表);

抽象方法是指只有方法的声明,没有方法体的方法。抽象方法用来描述系统具有什么功能,但不提供功能的实现!

【实例 测试抽象类与抽象方法】

package study01;
/**
 * 定义抽象类
 * @懒惰的小黑
 *
 */
abstract class Animal{
	private String name;
	private int age;
	
	public Animal(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public abstract void shout();
	public abstract void eat();
	
	public String toString() {
		return "名字:" + name +" 年龄:" + age +"岁";
	}
}

class Dog extends Animal{
		public Dog(String name,int age) {
			super(name,age);
		}
		
		public void shout() {
			System.out.println("汪汪叫....");
		}
		
		public void eat() {
			System.out.println("吃狗粮...");
		}
		
		
	}
	

public class AbstractTest01 {
	public static void main(String[] args) {
		Animal dog = new Dog("旺财",5);
		System.out.println(dog.toString());
		dog.shout();
		dog.eat();	
	}
	
}


【执行结果】
抽象类执行结果
说明:

  • 1、有抽象方法的必须为抽象类(抽象类可以无抽象方法)
  • 2、抽象类可以有具体属性和方法
  • 3、构造方法不能声明为抽象方法
  • 4、一个具体类继承抽象类必须继承抽象类的所有抽象方法(抽象类、具体类也可以有属于自己的方法)
  • 5、不能用new关键字实例化抽象类的对象,但可以声明抽象类的引用指向子类的对象,实现多态性(父类对象变量引用子类对象,调用的方法是子类重写后的方法或父类没有被重写的方法。用多态性创建对象的好处是:竟可以调用父类私有的方法,也可以调用子类重写后的方法,但不能够调用子类自身定义(没有被重写)的方法。(具体可回看对象的多态性文章)

注意:

Final与abstract水火不容!!
final类不能被继承、final定义的方法不能被子类重写、final既可以存在final类中也可以不存在final类中。

7.2 接口

接口就是比抽象类还抽象的抽象类,接口就是标准、规范。例如设计电脑的usb接口,就是设计了一套规范,其中usb接口有4条通道,哪些用来传输数据,哪些用来供电,提供的电压多少,等等。所有的规范只规定了必须实现哪些功能,并没有规定如何实现。具体实现交给使用接口的产品(如u盘)来实现。

接口是作为一个标准存在的,一旦公布,就不应该被改变。

【图解 程序设计中的接口】
接口图解

7.2.1 接口的定义与实现

Java接口只声明一套功能,没有具体的实现。

接口的声明:
语法格式:

[访问修饰符] interface 接口名{
[常量字段] [抽象方法]
}

说明:

  • 1、访问修饰符:只能是public或默认
  • 2、接口只能包含最终字段(final常量)和抽象方法两种成员。
  • 3、常量:接口的属性只能是常量,public static final修饰,省略也是
  • 4、抽象方法:允许省略 public 和abstract,也只能是public abstract
  • 5、接口可实现多继承
  • 6、接口不能创建实例,但可用于声明引用变量类型
  • 7、一个类实现了接口,必须实现接口中的所有的抽象方法,并且这些方法只能是public
  • 8、通过类去实现接口
  • 9、JDK1.7之前,接口只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。JDK8增加了默认方法和静态方法。JDK9还增加了私有方法

接口的实现:
语法格式:

[访问修饰符] class 类名 implements 接口1[,接口2,接口3…]{
}

【实例 测试接口声明和实现】
【接口】

package study01;
/**
 * 定义一个usb接口
 * @author 卟淡
 *
 */
public interface interfaceUsb {
	double VOLTAGE = 10;	
	void transmit_Date();
	void phone_Date();
	
}

【实现类】

package study01;
/**
 * 实现接口的类
 * @author 卟淡
 *
 */
class Iphone implements interfaceUsb{
	
	//必须实现接口的所有抽象方法
	public void transmit_Date() {
		System.out.println("请传输传输照片、视频....");
	}
	
	public void phone_Date() {
		System.out.println("欢迎使用苹果手机!");
	}
	
	public void  vlotoString() {
		System.out.println("电压:" + VOLTAGE + "v");
	}
}
public class iponeTest {
	public static void main(String[] args) {
		/*
		 * 接口也可用于声明引用变量类型
		 * interfaceUsb iphone = new Iphone();
		 */
		Iphone iphone = new Iphone();
		iphone.phone_Date();
		iphone.vlotoString();
		iphone.transmit_Date();
		
	}

}

【执行结果】
接口的实现

【实例 测试一个类实现多个接口与接口的多态】

package study01;
/**
 * 测试一个类实现多个接口与接口的多态
 * @author 卟淡
 *
 */
interface Girl{
	int GIRL_AGE = 18;
	void study();
}
interface Boy{
	int BOY_AGE = 30;
	void work();
}

class YoungMan implements Girl,Boy{	//一个类可实现多个接口
	public void study() {
		System.out.println("实现了Girl的功能方法");
	}
	
	public void work() {
		System.out.println("实现了Boy的功能方法");
	}
}
public class OldManTest {
	public static void main(String[] args) {
		//接口也可用于声明引用变量类型
		
		/*
		 *只能调用Girl的功能方法,不能调用Boy的方法,
		 *因为编译器认为 a就是Girl(实现多态性)
		 */
		Girl a = new YoungMan();	//接口变量引用实现类YoungMan的对象
		a.study();
		//a.work();  编译出错,因为接口变量引用的是YoungMan的对象
		
		YoungMan b = new YoungMan();
		b.study();
		b.work();
		
	}

}

注:
接口的多态性与类的多态性类似,即接口变量引用的是实现了该接口的子类对象。
接口可以用来声明变量,但接口不是类,不能创建对象!
一个类只能有一个直接的基类,但是可以实现多个接口(解决多继承问题)。

注意:
JDK8增加了默认方法和静态方法。JDK9还增加了私有方法,用法在后面会继续学习!

一个类可以实现接口,同时继承抽象类,语法格式:

[访问修饰符] class 子类名 extends 抽象类名 implements 接口1[,接口2,接口3….]{ … }

7.2.2 接口的继承

在JAVA中,类只支持单继承,即一个类只能继承一个父类,但一个接口可以同时继承多个接口,再通过类去实现它,解决了多继承问题

【实例 测试多继承】

package study01;
/**
 * 接口的多继承
 * @author 卟淡
 *
 */
interface A{
	void printlnA();
}

interface B{
	void printlnB();
}

interface C{
	void printlnC();
}

interface D extends A,B,C{ //一个接口可继承多个接口
	void printlnD();
}
class F implements D{	//F类实现接口D时,必须实现D、A、B、C中的所有方法
	public void printlnA() {
		System.out.println("实现了A方法");
		
	}
	public void printlnB() {
		System.out.println("实现了B方法");
		
	}
	public void printlnC() {
		System.out.println("实现了C方法");
		
	}
	public void printlnD() {
		System.out.println("实现了D方法");
	}
}

public class InterfaceTest {
	public static void main(String[] args) {
		F test = new F();
		test.printlnA();
		test.printlnB();
		test.printlnC();
		test.printlnD();
	}

}

总结:

  1. 掌握使用抽象类、使用系统接口的技术(本篇文章还未涉及到,后面会再加强学习)和自定义接口的方法。
  2. 在创建对象时,抽象类对象可以引用子类对象,接口也可以引用实现类对象。
  3. 了解应该在什么情况下需要使用抽象类,什么情况下需要使用接口。

特别提醒:

在以后的工作中,面试官会常问到:java中有没有多继承?这时你无论回答有或没有,都是不及格的!!你应该回答:在java的类中是没有多继承,但在接口中是可以有多继承。这是正确严谨的答法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值