Java小白学习之路(Java基础)Day09

Day09

书接上回,抽象类、接口和内部类

抽象类和接口两种机制的引入,使Java拥有了强大的面向对象编程能力。
抽象类

在面向对象的概念中,所有的对象都是通过类来表述,但并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一类具体的对象,这样的类就是抽象类。

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

抽象类注意:
  • abstract放在class前,指明该类是抽象类;

  • abstract放在方法声明中,则该方法是抽象方法,抽象方法没有方法体;

  • 一个抽象类可以含有多个抽象方法,也可以含有已实现的方法。

抽象类实例

定义一个类Shape来演示抽象类的定义和使用。

public abstract class Shape {
	double dim;
	public Shape(double dim) {
		this.dim = dim;
	}
	// 抽象方法,获得面积
	 public abstract double callArea();
	// 抽象方法,获得周长
	 public abstract double callPerimeter();
}
public class Circle extends Shape {
	public Circle(double dim) {
		super(dim);
	}
	// 实现抽象方法callArea()
	public double callArea() {
		// 返回圆的面积
		return 3.14 * dim * dim;
	}
	// 实现抽象方法callPerimeter()
	public double callPerimeter() {
		// 返回圆的周长
		return 2 * 3.14 * dim;
	}
	public static void main(String[] args) {
		// 声明一个Shape对象,指向实现它的子类对象
		Shape shape = new Circle(10);
		// 调用callArea()求圆的面积,并输出
		System.out.println("圆的面积是:" + shape.callArea() );
		// 调用callPerimeter()求圆的周长,并输出
		System.out.println("圆的周长是:" + shape.callPerimeter() );
	}
}
抽象类的特点

抽象类虽然具备类的形式,但由于其“抽象”性,不能定义抽象类的实例,即不能为抽象类分配具体空间 ;

错误案例:

Shape circle= new Shape(3); 
注意:抽象类不能实例化,但可以指向一个实现它的子类对象;
abstract不能与final同时修饰一个类;
abstract不能和static、private、final或native并列修饰同一方法。
接口

Java是单继承的语言,利用接口可以模拟多继承;

接口是对抽象类的进一步抽象,是方法声明和常量的定义集合;

接口是一种行为规范,是一种“契约”;

格式:

<访问符> interface 接口名 {
[访问符] <返回类型> 方法名([参数列表]);
//省略…
}

接口实例
public interface MultiInterface {
	public static final double PI = 3.1415926;
	public void callArea();
}
注意:在定义接口的时候,接口中的所有方法和常量自动定义为public;接口中定义的变量默认是public static final 型,且必须赋初值 。
同抽象类一样,接口是一种更加“虚拟”的类结构,无法对接口实例化 。
接口的使用

接口的使用通过“implements”关键字来实现,示例代码如下 :

public class MyClass implements MyInterface {
	public void add(int x, int y) {
		// do something
	}
	public void volume(int x, int y, int z) {
		// do something
	}
}
多重继承

通过实现多个接口来实现多重继承,示例代码如下 :

public class MyClass2 implements MyInterface, MultiInterface{
	//实现多个接口中的所有方法
}
接口解决了Java子父类单继承的问题。
抽象类和接口的区别
  • 抽象类中可以有非抽象方法。接口中则不能有实现方法;

  • 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;

  • 接口中的方法默认都是public abstract类型的。

补充
instanceof运算符

声明为同种类型的两个引用变量调用同一个方法时也可能会有不同的行为。为更准确的鉴别一个对象的真正类型,Java语言引入了instanceof操作符,其使用格式如下:

<引用类型变量> instanceof <引用类型>

当 instanceof 左侧的引用类型变量所引用对象的实际类型是其右侧给出的类型或其子类类型时,整个表达式的结果为true,否则为false。

对象类型转换(引用数据类型转换)

引用类型数据转换时,同样可以分为自动转换和强制转换两种情况 :

  • 自动转换:子类转换成父类时(或者实现类转换成接口)可以自动完成。例如,Teacher是Person的子类,将一个Teacher对象赋给一个Person类型的变量时,转换自动完成。

  • 强制转换:父类转换成子类时(或者接口转换成实现类),必须使用强制转换。例如,Teacher类是Person的子类,如果将一个Person对象赋给一个Teacher类型变量的时候,必须使用强制转换。

//创建一个Teacher对象,把引用赋予Person类型的变量p,该过程自动转换
Person p = new Teacher(); 

//把变量p强制转换成Teacher类型的变量
Teacher t  = (Teacher)p; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值