JAVA学习篇11——抽象类、接口

本文深入探讨了抽象类和接口的概念,对比了它们的特点、使用场景及编程实践。解析了抽象类作为父类的特性,以及接口在行为抽象中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象类:
    抽象:笼统、模糊、不具体

    定义:随着继承层次中一个个的新子类的定义,类变得原来越具体,而父类更一般普通
    类的设计应该保证父类和子类能够共享特征,有时候将父类设计的特别抽象,以至于没有具体的方法体,这样的类就叫抽象类
    抽象类-》抽象方法(|没有具体实现) 申明(几何图形 求面积 public double finadArea(); 方法体去掉)
 
    声明:abstract 类名
    抽象关键字:abstract
    
    特点:
    1.方法只有申明没有实现,该方法就是抽象方法,需要被abstract修饰。
       抽象方法必须定义在抽象类里面,该类也必须被abstract修饰
    2.抽象类不能被实例化   为什么?   因为调用抽象方法没有实现
    3.抽象类必须有其子类覆盖所有的抽象方法,该类才可以被实例化,否则,这个子类还是定义为抽象类
    
    抽象类里面可以有构造函数      用于给子类对象初始化
    
    抽象里面可以定义非抽象方法   (很少用     如 AWT的适配器对象就是这种)
    
   抽象方法就是没有具体实现的方法(抽象方法不能被static修饰 不能被private修饰)
    public abstract void eat();    //后面没有方法体{}
     * 面试题:下面那个方法为抽象方法 (A)
     * A:public abstract void eat();
     * B:static abstract void eat(); 
     * C:private abstract void eat();

    抽象关键字不可以和那些关键字共存?
        static  private final
        
   抽象类一定是父类嘛? 是的,如果不是的话定义该抽象类就没有实际意义。

    抽象类和一般类的异同?
        相同:抽象类和一般类都是用来描述事物的,都在内部定义了成员
        不同:一般类可以被实例化,抽象类不能被实例化
            一般类不能定义抽象方法,抽象类可以定义抽象方法
            一般类的子类可以复写方法,抽象类子类如果不实现抽象方法就得定义为抽象类
            一般类有足够的信息描述事物,抽象类描述信息不充足

接口:
      定义:是一个抽象类型,是抽象方法的集合,接口只是一种形式,接口自身不能做任何事情。
      抽象层级: 接口-》抽象-》普通类
      声明:interface 接口名
      关键字:implements 
      接口的继承:一个接口能继承另一个接口,和类之间的继承方式比较相似。
                           接口的继承使用extends关键字,子接口继承父接口的方法。

      接口优点:重构、复用性更好、定义规则和实现无关    面向接口编程   契约式
              缺点:必须全部实现抽象方法  否则该类需要被abstract

接口里面可以定义普通的成员变量吗? 只能定义常量 默认为public static final类型
 int NUM = 55;
 public static final double PI = 3.14;// 以上两种方式都是在定义常量
// NUM = 66;   无法修改,该语句会报错


接口里面可以有构造方法吗? 不能定义,因为成员变量只能为常量,那么构造方法没意义,会报错

接口里面可以定义非抽象方法吗? 不能,会报错,接口中所有方法都是抽象方法

接口呢个被实例化吗? 不能
 
接口可以当引用?   可以  (多态的体现)
        InterfaceDemo in = new Demo();

接口中定义抽象方法:
      public abstract void show();// 显示定义
      void show1();// 两种方法都是定义的抽象方法 默认加上public abstract 隐式定义

JDK1.8在接口里面支持定义类方法 默认的方法default
类方法:使用static修饰(静态方法),属于整个类的,不是属于某个实例的,只能处理static域或调用static方法;
实例方法:属于对象的方法,由对象来调用。
区别:1、类方法在该类被加载到内存时就分配了相应的内存空间。
                实例方法不会被分配内存空间,只有在对象创建之后才会分配。
           2、实例方法可以调用该类中的其他方法。
                类方法只能调用其他类方法,不能调用实例方法。
           3、实例方法既能对类变量操作也能对实例变量操作。
                类方法只能访问其他static方法和其他static数据,类变量。

接口与抽象类的异同:
                                     抽象类                                                   接口
  * 设计原则:      抽象类:  动作抽象                              接口:行为抽象  
  *  声明                   abstract  类名                                     interface 接口名 
  * 特点:                  继承  单继承                                       实现 多实现    
  * 内部:   有变量、有构造函数、有普通方法       没有变量、构造函数、普通方法
  * 关键字                    extends 继承                                  implements 实现
  *
  * 相同:都不能被实例化

单继承多实现的简单例子:

//接口
public interface interfaceDemo {

	public abstract void father();
}
//接口
interface grandafather{
	public abstract void grandfa();
}
//抽象类
abstract class mather{
		public abstract void mather();
	}

//单继承,多实现
class son extends mather implements interfaceDemo,grandafather{
	@Override
	public void father() {
		// TODO Auto-generated method stub
		System.out.println("爸爸说,这是我儿子");
	}
	@Override
	public void mather() {
		// TODO Auto-generated method stub
		System.out.println("妈妈说,这是我儿子");
	}
	@Override
	public void grandfa() {
		// TODO Auto-generated method stub
		System.out.println("爷爷说,这是我儿子");
	}
}
class interTest{
	public static void main(String[] args) {
		son s =new son();
		mather s1 =new son();
		grandafather s2 =(grandafather)s1;
		interfaceDemo s5 = (interfaceDemo)s2;
		s1.mather();
		s5.father();
		s2.grandfa();
	}
}

输出为:

妈妈说,这是我儿子
爸爸说,这是我儿子
爷爷说,这是我儿子

接口与抽象类什么时候使用?
 * 抽象继承:xxx是yyy的一部分(如studen是person的一部分)
 * 接口实现:xxx包含yyy的一部分(如student包含Smoking)
 * 
 * 接口:行为抽象(范围更广泛)        抽象:动作抽象(具体的动作)
 * 抽象继承   is a 子类和父类(基类)关系       接口:实现
 *(个人理解:行为是指一种持续性的动作或举止,不是一瞬间完成的,而动作就是具体的某个动作,可以一瞬间完成的。比如,吃饭是行为,吃是动作;跑步是行为,跑是动作;抽烟是行为,抽是动作)

实例:(这里eat定义的为抽象类里面的抽象方法,smoke定义的是接口里面的抽象方法)

//抽象类
public abstract class Person {

	public abstract void eat();	
}
//接口
interface Smoking{
	void smoke();
}

//一个类可以同时继承和多个实现
//如果一个类没有实现接口里面的方法   那么这个类必须被abstract修饰
 class Student extends Person implements Smoking
 {
	public void smoke(String name) {
		// TODO Auto-generated method stub
		System.out.println(name+"小烟抽抽");
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("阿三吃饭用手抓");
	}

	@Override
	public void smoke() {
		// TODO Auto-generated method stub
		System.out.println("抽烟");
	} 
 }
  
 class StuTest{
	 public static void main(String[] args) {
		Student stu = new Student();
		stu.eat();
		stu.smoke("如花");
	}
 }
 

结果为:

阿三吃饭用手抓
如花小烟抽抽

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值