Java-面向对象基础-6

知识点:

        抽象类 接口 面向接口开发

一、抽象类的用法

1.1 复习:抽象类构造函数测试

抽象类不可以创建对象,抽象类中的构造函数常在子类对象实例化时使用
package cn.mbh.oop;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午6:50:02
*/
/**本类用于测试抽象类的构造函数的用法*/
/**总结:
* 1.抽象类中可以有构造方法
* 2.父类的构造方法要优先于子类的执行
* 2.抽象类中的构造方法存在的目的,不是为了创建抽象类本身的对象,而是为了创建子类对象时使用的
*/
public class Test4_Abstract2 {

	public static void main(String[] args) {
		//4.创建多态对象进行测试
		Animal3 a = new Dog3();
		//5.测试抽象类是否可以创建对象?---不能!
		//Animal3 a3 = new Animal3();

	}

}
//1.创建抽象父类
abstract class Animal3{
	//3.创建抽象类的构造函数
	public Animal3() {
		//如果此处传参,会覆盖无参构造,子类super就报错了
		System.out.println("Animal3....构造方法");
	}
}
//2.创建子类
class Dog3 extends Animal3{
	//5.创建子类无参构造,无参构造默认存在
	public Dog3() {
		super();//隐藏着super();//先访问父类的构造方法,再执行自己的功能
		System.out.println("Dog3...构造方法");
	}
}



1.2 练习 1:抽象类成员测试

创建 Java 工程: DAY06
创建包: cn.tedu. oop
创建类: Test1_Abstract3.java
package cn.mbh.oop;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:19:10
*/
/**本类用于测试抽象类中的成员*/
public class Test1_Abstract {

	public static void main(String[] args) {
		//4.创建多态对象进行测试
		Fruit f = new Apple();
		System.out.println(f.sum);//10
		//name = "lemon";//常量值补课修改
		System.out.println(f.name);//banana

	}

}
//1.创建抽象父类--水果类
abstract class Fruit{
	/**1.抽象类中可以有成员变量吗?--可以!!!*/
	//3.1创建抽象父类成员变量
	int sum = 10;
	/**2.抽象类中可以有成员常量,但是值无法修改*/
	//3.2创建抽象父类成员常量
	final String name = "banana";
	/**3.抽象类中可以有普通成员方法,也可以都是普通方法*/
	/**4.如果一个类中都是普通方法,这个类为什么还要被声明成抽象类呢?
	* 原因:抽象类不可以创建对象,如果不想让外界创建本类的对象,可以把普通类声明成一个抽象类
	* */
	//5.创建普通成员方法*2
	public void eat(){
		System.out.println("吃啥水果都行");
	}
	public void eat2(){
		System.out.println("吃啥水果都行");
	}
	/**5.抽象类中可以有抽象方法,一旦类中有抽象方法,这个类必须被声明成抽象类*/
	abstract public void clean();
}
/**6.当一个类继承了父类,父类是一个抽象类时
* 子类需要重写抽象父类的所有抽象方法,或者把自己变成一个抽象子类
* */
//解决方案一:抽象子类
//abstract class Apple extends Fruit{ }
//解决方案二:
//2.创建子类 -- 苹果类 :普通子类+重写父类的抽象方法
class Apple extends Fruit{
	//子类重写父类的抽象方法clean()
	@Override //表示这个方法是一个重写的方法
	public void clean() {
		System.out.println("苹果还是需要好好洗洗再吃的");
	}
}


继承+抽象类 – 接口引入
abstract class Animal{
        abstract public void eat();
        abstract public void sleep();
}
class Dog extends Animal{
        eat(){......}
}
class Cat extends Animal{
        eat(){......}
}
class Pig extends Animal{
        eat(){......}
}

二、接口

2.1 概念

        Java 里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。
        Java 接口和 Java 抽象类 代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。
        OOP 面向对象 的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为 java 结构层次上的顶层。

2.2 接口的格式

interface 接口名 { 代码 … }

2.3 特点

        1. 接口中都是抽象方法
        2. 通过 interface 关键字来定义接口
        3. 通过 implements 让子类来实现接口
        4. 可以理解成,接口是一个特殊的抽象类(接口里的方法都是抽象方法)
        5. 接口突破了 java 的单继承的局限性
        6. 接口和类之间可以多实现,接口和接口之间可以多继承
        7. 接口是对外暴露的规则,是一套开发规范
        8. 接口提高了程序的功能扩展,降低了耦合性

2.4 练习 2-1:创建接口

创建 Java 工程: DAY06
创建包: cn.tedu. inter
创建接口: Inter.java
package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:32:42
*/
/**本接口是创建接口测试*/
/**1.通过interface关键字来定义接口*/
public interface Inter {
	/**2.接口中可以有普通方法吗?--不可以!!!*/
	//public void eat() {}
	/**3.接口中可以有抽象方法吗?--可以,接口中的方法都是抽象方法!!!*/
	public void eat();
	public void play();

}

2.5 练习 2-2:创建接口实现类

创建 Java 工程: DAY06
创建包: cn.tedu. inter
创建接口实现类: InterImpl.java
package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:35:42
*/
/**本类作为Inter接口的实现类*/
/**1.实现类如果想用接口的功能,要和接口发生实现关系,通过关键字implements*/
/**2.1方案一:实现类实现了接口以后,可以把自己变成一个抽象子类*/
//abstract public class InterImpl implements Inter{ }
/**2.2方案二:实现类实现了接口后,还可以重写接口中所有抽象方法*/
public class InterImpl implements Inter{

	@Override//标记重写了父接口的方法
	public void eat() {
		System.out.println("吃火锅");
		
	}

	@Override//标记重写了父接口的方法
	public void play() {
		System.out.println("玩代码");
		
	}

}

2.6 练习 2-3:创建接口测试类

创建 Java 工程: DAY06
创建包: cn.tedu. inter
创建实现类测试类: InterTests.java
package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:39:34
*/
/**本类用于测试接口实现类*/
public class InterTests {
	//1.创建入口main()
	public static void main(String[] args) {
		//2.创建多态对象进行测试
		Inter inter = new InterImpl();
		inter.eat();
		inter.play();
		//3.接口可以创建对象吗?--不行!!!
		//Inter inter = new Inter();

	}

}

三、接口的用法

3.1 练习 3-1:接口之构造方法

创建 Java 工程: DAY06
创建包: cn.tedu. inter
创建类: Test5_UseInter.java
package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:42:57
*/
/**本类用于测试接口的使用*/
public class Test5_UseInter {

	public static void main(String[] args) {
		//3.在main()创建多态对象进行测试
		/**问题:子类创建对象时,会自动调用父类的构造方法,但现在的父级是个接口
		* 接口没有构造方法,那子类中super()调用的是什么呢?
		* 结论1:子类默认继承了顶级父类Object,super()会自动调用Object的无参构造
		* */
		Inter2 in = new Inter2Impl();

	}

}

//1.创建接口
interface Inter2{
	/**1.接口里有构造方法吗?--没有!!!*/
	//public Inter2() {}
}
//2.创建接口的实现类
class Inter2Impl implements Inter2{
	public Inter2Impl() {
		super();//默认先调用顶级父类Object的无参构造方法
		System.out.println("Inter2Impl的无参构造");
	}
}

3.2 练习 3-2:接口之成员变量

package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:42:57
*/
/**本类用于测试接口的使用*/
public class Test5_UseInter {

	public static void main(String[] args) {
		//3.在main()创建多态对象进行测试
		/**问题:子类创建对象时,会自动调用父类的构造方法,但现在的父级是个接口
		* 接口没有构造方法,那子类中super()调用的是什么呢?
		* 结论1:子类默认继承了顶级父类Object,super()会自动调用Object的无参构造
		* */
		Inter2 in = new Inter2Impl();
		System.out.println(in.age);
		/**结论2.1接口中的变量都是静态变量,可以通过接口名直接调用*/
		System.out.println(Inter2.age);
		/**结论2.2接口中的变量都是常量,不能被重新赋值*/
		//Inter2.age = 20;
	}

}

//1.创建接口
interface Inter2{
	/**1.接口里有构造方法吗?--没有!!!*/
	//public Inter2() {}
	/**2.接口里可以有成员变量吗?--没有!!!*/
	int age = 10;//静态常量,实际上:final static int age =10;
}
//2.创建接口的实现类
class Inter2Impl implements Inter2{
	public Inter2Impl() {
		super();//默认先调用顶级父类Object的无参构造方法
		System.out.println("Inter2Impl的无参构造");
	}
}

3.3 练习 3-3:接口之成员方法

package cn.mbh.inter;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:42:57
*/
/**本类用于测试接口的使用*/
public class Test5_UseInter {

	public static void main(String[] args) {
		//3.在main()创建多态对象进行测试
		/**问题:子类创建对象时,会自动调用父类的构造方法,但现在的父级是个接口
		* 接口没有构造方法,那子类中super()调用的是什么呢?
		* 结论1:子类默认继承了顶级父类Object,super()会自动调用Object的无参构造
		* */
		Inter2 in = new Inter2Impl();
		System.out.println(in.age);
		/**结论2.1接口中的变量都是静态变量,可以通过接口名直接调用*/
		System.out.println(Inter2.age);
		/**结论2.2接口中的变量都是常量,不能被重新赋值*/
		//Inter2.age = 20;
	}

}

//1.创建接口
interface Inter2{
	/**1.接口里有构造方法吗?--没有!!!*/
	//public Inter2() {}
	/**2.接口里可以有成员变量吗?--没有!!!*/
	int age = 10;//静态常量,实际上:final static int age =10;
	/**3.接口里可以有抽象方法*/
	abstract public void eat2();
	void eat();//可以简写--会自动拼接public abstract
}
//2.创建接口的实现类
class Inter2Impl implements Inter2{
	public Inter2Impl() {
		super();//默认先调用顶级父类Object的无参构造方法
		System.out.println("Inter2Impl的无参构造");
	}
	/**4.如果接口中添加了抽象方法,实现类中需要添加所有未实现的抽象方法*/
	@Override
	public void eat2() {
	}
	@Override
	public void eat() {
	}
}

四、程序设计

4.1 分析老师示例-面向抽象编程

具体事物:实习老师 正式老师
共性:讲课,备课
创建 Java 工程: DAY06
创建包: cn.tedu. design
创建类: Test6_Design.java
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午7:51:40
*/

public class Test6_design {

}
//生活中的事物--java类
//特征--属性 行为--方法
//把所有的共性内容向上抽取形成父类
/**2.类中含有抽象方法,这个类必须变成抽象类*/
abstract class Teacher{
	//讲课
	/**1.没有方法体的方法叫做抽象方法*/
	abstract public void teach();
	//备课
	public void ready() {
		System.out.println("正在备课");
	}
}
//实习老师
class SXTeacher extends Teacher{
	//讲课
	@Override
	public void teach() {
		System.out.println("讲课");
	}
	//备课
	@Override
	public void ready() {
		System.out.println("正在备课");
	}
	
}
//正式老师--基础加强+框架加强+高新技术
class ZSTeacher extends Teacher{
	//讲课
	@Override
	public void teach() {
		System.out.println("正在讲课...基础加强+框架加强+高新技术");
	} 
}
//Scala大数据老师--Scala+Spark
abstract class ScalaTeacher extends Teacher{
}

4.2 分析老师示例-面向接口编程

具体事物:培优班老师, 高手班老师
共性:讲课,备课
创建 Java 工程: DAY06
创建包: cn.tedu. design
创建类: Test7_DesignInter.java
package cn.mbh.design;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午8:04:20
*/
/**本类用于设计老师类,面向接口编程*/
public class Test7_DesignInter {

}
//抽取共性,形成抽象层--体现接口--定义规则
/**1.通过interface关键字定义接口*/
interface Teacher2{
	/**2.接口中的方法都是抽象方法*/
	/**3.接口中的方法可以简写--自动拼接public abstract*/
	//讲课方法
	void teach();
	//备课方法
	void ready();
}
/**4.实现类要使用接口的功能,需要发生实现关系*/
//实习老师
class SXTeacher2 implements Teacher2{
	@Override
	public void teach() {
	}
	@Override
	public void ready() {
		System.out.println("备课电商项目");
	}
}
//正式老师
abstract class ZSTeacher2 implements Teacher2{ }



六、接口的多继承多实现

6.1 代码示例

创建 Java 工程: DAY06
创建包: cn.tedu. design
创建类: Test8.java
package cn.mbh.design;
/**
*@author MBH:
*@version 创建时间:2022年7月10日 下午8:07:43
*/
public class Test8 {

	public static void main(String[] args) {
		//创建多态对象进行测试
		Inter1 in = new InterImpl();
		in.delete();
		in.save();
		//in.update();//运行看右边(子类),不能调用子类特有的方法

	}

}
//1.创建接口1
interface Inter1{
	void save();
	void delete();
}
//2.创建接口2
interface Inter2{
	void update();
	void find();
}
//4.创建接口3测试接口间的继承关系
/**2.接口之间可以发生继承关系,而且可以多继承,用逗号隔开*/
interface Inter3 extends Inter1,Inter2{}
/**3.实现类,可以继承的时候同时多实现
* 注意:由于java是单继承 多实现,所以先写继承,再写实现
* * */
//class InterImpl extends Object implements inter1,inter2{}
/**1.接口和实现类之间可以发生实现关系,通过implements关键字来完成
* 而且可以多实现(同时实现多个接口),多个接口之间用逗号隔开
* */
//3.创建接口的实现类
class InterImpl implements Inter1,Inter2{
	@Override
	public void update() {
		System.out.println("更新中...");
	}
	@Override
	public void find() {
		System.out.println("查找中...");
	}
	@Override
	public void save() {
		System.out.println("保存中...");
	}
	@Override
	public void delete() {
		System.out.println("删除中....");
	} 
}

七、总结

1. 类与类的关系
        --继承关系 , 只支持单继承
        --比如 ,A 是子类 B 是父类 ,A 具备 B 所有的功能 ( 除了父类的私有资源 )
        --子类如果要修改原有功能 , 需要重写 ( 方法声明与父类一致 + 权限修饰符 >= 父类修饰符 )
2. 类和接口的关系
        --实现关系 . 可以单实现 , 也可以多实现
        --class A implements B,C{}
        --其中 A 是实现类 ,B C 是接口 ,A 拥有 BC 接口的所有功能 , 只是需要进行方法的重写 , 否则 A 就是抽象类
3. 接口与接口的关系
        --是继承关系 , 可以单继承 , 也可以多继承
        --interface A extends B,C{}
        --其中 ABC 都是接口 ,A 是子接口 , 具有 BC 接口的所有功能 ( 抽象方法 )
        --class X implements A{}
        --X实现类需要重写 ABC 接口的所有方法 , 否则就是抽象类
        --class A extends B implements C,D{}
        --其中 A 是实现类 , 也是 B 的子类 , 同时拥有 CD 接口的所有功能
        --这时 A 需要重写 CD 接口里的所有抽象方法
4. 抽象类与接口的区别
        --抽象类是一个特殊的类 , 特殊在 , 抽象类中可以包含没有方法体的方法 ( 抽象方法 )
        --接口是一个特殊的抽象类 , 特殊在 , 接口里的都是抽象方法 , 没有普通方法
        --接口会为方法自动拼接 public abstract, 还会为变量自动拼接 public final static
        --抽象类可以有构造方法 -- 用来给子类创建对象 , 接口没有抽象方法
        --抽象类和接口都不能实例化 ( 创建对象 )
        --抽象类可以有普通方法 , 接口都是抽象方法

八、访问控制符

        用来控制一个类,或者类中的成员的访问范围。
子类任意
public
protected
default

 

private
TIPS:default 是表示不写修饰符,默认,如果写 default 单词来修饰会报错

九、拓展

9.1 abstract 注意事项

抽象方法要求子类继承后必须重写。那么, abstract 关键字不可以和哪些关键字一起使用呢?以下关键字, 在抽象类中。用是可以用的,只是没有意义了。
        1) private:被私有化后,子类无法重写,与 abstract 相违背。
        2) static:静态的,优先于对象存在。而 abstract 是对象间的关系,存在加载顺序问题。
        3)final:被 final 修饰后,无法重写,与 abstract 相违背。

9.2 接口和抽象类的区别

        1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
        2、抽象类要被子类继承,接口要被类实现。
        3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
        4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
        5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽 象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
        6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
        7、抽象类里可以没有抽象方法
        8、如果一个类里有抽象方法,那么这个类只能是抽象类
        9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
        10、接口可继承接口,并可多继承接口,但类只能单根继承。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值