Java抽象类、接口、内部类、多态

抽象类:abstract

如果一个类中,存在没有方法体的方法,这个方法就是抽象方法,如果一个类里存在抽象方法,那么这个类就是抽象类

抽象类也是类,可以放属性存储数据,有方法体就完成某个功能。

抽象类因为有抽象方法,所以程序员不能对抽象类实例化,但是jvm可以进行实例化。

抽象类只能做父类,当他的子类把所有的抽象方法补全,这个子类才能实例化对象,如果没有把所有抽象方法不全,那这个子类还是抽象类

注意:抽象方法不能使用static final private 修饰,抽象方法只存在于抽象类和接口中,不能存在于普通类中

接口:interface

抽象类抽象到极致,类中所有方法都没有方法体,这种情况建议组成接口

接口的特点

  1. 接口中的方法和属性都是公有的
  2. 接口是不能实例化对象的
  3. 必须有子类实现接口,且可以实现多个接口,接口间用 " , " 间隔,解决了java的单继承问题
  4. 子类实现接口用implements关键字
  5. 子类把接口中所有的方法都实现了,才可以实力化子类对象
  6. 接口中的属性默认是public static final ,不适合存储数据
  7. 接口中有方法,方法必须没有方法体,默认且必须是公有的
  8. 接口不能实现接口,但是可以继承,且支持多继承
  9. 接口中没有构造方法

为什么使用接口

  1. 用接口可以限定子类必须实现接口规定的方法,以保证项目功能的完整性
  2. 用接口可以实现多态,因为有了接口就一定有继承,而多态就是以继承为基础的

内部类

顾名思义就是把类放在某个范围的内部

  1. 类可以放在另一个类的内部 --> 类里套类
  2. 类也可以放在方法中 --> 方法里套类

类里套类

  1. 要使用内部类就需要在外部类中实例化内部类的对象,然后用对象打点调用内部类中的方法(可以在外部类中调用内部类的私有属性和私有方法),通过内部类里的方法来操作内部类中的数据
  2. 在内部类中可以直接使用外部类中的所有属性和方法
  3. 特殊用法:要使用内部类,可以在外部类的外面实例化内部类的对象,然后通过对象打点调用内部类的非私有的方法(在同一个包内)
	OuterClass.InnerClass ic=oc.new InnerClass();
	OuterClass.InnerClass ic1=new OuterClass().new InnerClass();
	
	/*No enclosing instance of type OuterClass is accessible. Must qualify the allocation with 
	  an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).*/

方法里套类

  1. 要使用方法中的内部类,就必须在方法中,内部类定义的下面,实例化内部类的对象,通过内部类对象打点调用内部类中的属性方法(包括私有)
  2. 内部类的作用域仅限于当前方法,从内部类定义开始到方法结束,内部类的作用域就消失了
  3. 在内部类中可以直接使用外部类中的属性和当前方法中的局部变量
  4. 在外部类的外部,不能使用方法中的内部类
  5. 在内部类用private修饰时,这个类不能是顶层类,只能在该类的外部类内部使用

匿名内部类

形式一:

	//匿名内部类,但有对象名
	Person p=new Person(){
		public void study(){
			//具体实现
		}
		public void eat(){
			//具体实现
		}
	};  
	p.study();  //有对象名,可以打点多次调用方法

形式二:

	//匿名内部类,但没有对象名
	new Person(){
		public void study(){
			//具体实现
		}
		public void eat(){
			//具体实现
		}
	}.study();  //只能调用一次方法,
匿名内部类的特点
  1. 当前匿名内部类中,只能实现一次,如果还想要其他的实现则必须使用匿名内部类重新new实现
  2. 匿名内部类更适合长辈的方法的实现,而且实现只需要实现一次即可
匿名内部类和有名内部类的区别
  1. 匿名内部类的方法只能实现一次,对象也只能有一个
  2. 有名内部类也是实现一次,但对象可以实例多个

多态

顾名思义就是多种表现状态
最直观的理解:有对象名称,用对象名称打点调用方法,在不同的时候执行的方法功能是不一样的

多态的判断标准

  1. 跨类且继承,多态是以继承为基础的
  2. 子类重写长辈的方法
  3. 子类对象赋值给长辈的引用
  4. 用长辈的引用打点调用方法
    a. 用对象打点能调出哪些方法,取决于这个对象所对应的类或接口中有什么方法
    b. 如果用长辈的引用打点调出的方法是重写过的方法,那么久执行重写后的方法
    c. 如果长辈的引用打点调用的方法是没有重写的方法,则执行的是本长辈类中的方法

多态的应用场景

  1. 以长辈作为方法或函数的参数
  2. 以长辈作为方法或函数的返回值

多态的应用:

  1. 把所有的子类共有的方法抽象到一个接口中,只放方法
  2. 创建抽象类,实现接口,放置共用的属性或重写接口的方法,当然也可以添加新的方法
  3. 创建子类继承抽象类,按实际需求实现接口方法
  4. 直到所有的接口方法都给了对应的实现,才可以实例化对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值