目录
一.抽象类
1.抽象的概念
抽象是把多个事物的共性的内容抽取出来,本质就是把我们关注的内容抽取出来。(比如:宝马、奔驰都属于汽车,汽车是抽象出来的概念)
2.抽象类和抽象方法语法规则
2.1抽象类的语法
访问修饰符 abstract class ClassName { }
2.2抽象方法的语法
访问修饰符 abstract class ClassName {
访问修饰符 abstract 返回值类型 方法名(参数列表…);
}
public abstract class Action {
//abstract 抽象方法 只有方法名字,没有方法的实现(不是方法体为空)
public abstract void dosomething();
}
public class A extends Action{
//继承了抽象类的子类,都必须实现抽象类的方法(重写方法)
//除非他的子类也是抽象类,那么再由其子类实现
@Override //继承
public void dosomething() {
System.out.println("TT");
}
}
3.抽象类与普通类的区别
- 抽象类要用abstract修饰
- 普通类可以实例化,抽象类不能实例化
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
4.抽象方法和普通方法的区别
- 普通方法必须要有方法体,抽象方法不能有方法体(大括号也没有)
- 抽象方法要用abstract修饰
- 抽象方法必须存在于抽象类中
5.抽象类和抽象方法的使用
- 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
- 如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
- 没有抽象构造方法,也没有抽象静态方法
- 抽象类中可以有非抽象的构造方法,创建子类的实例时可以调用
6.抽象类的局限性
抽象类的本质还是类,还是离不开extends继承。然而,java中只有单继承,所以说抽象类还是不能满足子类需要同时满足多个不同类特点的需求。
7.代码实现
//父类 -- 鸟类
//抽象类 --abstract
public abstract class Bird {
//定义飞行方法
public void fly(){
System.out.println("弹射-飞****");
}
//定义叫声的方法
public void call(){
System.out.println("渣渣叫");
}
//定义攻击的抽象方法
public abstract void attack();
//子类 -- 火箭鸟
public class Rockets extends Bird{
//重写攻击方法
@Override
public void attack() {
System.out.println("火箭攻击*****");
}
}
//子类 -- 分裂鸟
public class Split extends Bird{
//重写攻击方法
@Override
public void attack() {
System.out.print("分裂攻击\t");
System.out.print("分裂攻击\t");
System.out.print("分裂攻击\t");
}
//玩家类
public class Pensor {
//定义玩家姓名
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//展示鸟类方法
public Bird attack(Bird bird){
bird.fly();
bird.call();
bird.attack();
return bird;
}
//运用三目运算符,根据选择创建游戏中鸟类对象
public void choose( int choose){
Bird bird = choose == 1 ? new Split() : new Rockets();
this.attack(bird);
}
}
//测试类
public class BirdTest {
//调用Util包,实现键盘输入
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
//创建游戏人对象
Pensor pensor = new Pensor();
//创建键盘输入,不可放在循环中
String chose = "";
do {
int choose = ScannerUtil.nextInt("请选择要玩得鸟类(1.分裂鸟\t2.火箭鸟)");
//根据选择展示鸟的方法
pensor.choose(choose);
chose = ScannerUtil.next("是否继续游玩(y/n)");
//判断是否继续游戏
}while ("y".equals(chose));
}
}
二.接口
1.接口的定义
如果一个类之中只是由抽象方法和全局常量所组成的,那么在这种情况下不会将其定义为一个抽象类,而只会将其定义为接口,所以所谓的接口严格来讲就属于一个特殊的类,而且这个类里面只有抽象方法与全局常量。
要定义一个接口使用interface关键字完成。
2.接口的语法
2.1定义接口的语法:
[访问修饰符] interface 接口名 extends 父接口1,父接口2,…{
//常量定义
//方法定义
}
2.2类实现接口的语法:
[访问修饰符] class 类名 extends 父类名 implements 接口1,接口2,…{
//类成员
}
3.接口的特性
- 接口的命名规则与类相同。如果修饰符是public,则该接口在整个项目中可见;如果省略修饰符,则该接口只在当前包可见。
- 接口中可以定义常量,不能定义变量。接口中的属性都会自动用public static final 修饰,即接口中的属性都是全局静态常量。
- 接口中方法自动用public abstract修饰,接口中所有方法都是抽象方法。
- 接口不能实例化,接口中不能有构造方法。
- 接口直接可以通过extends实现继承关系,一个接口可以继承多个接口,但是接口不能继承类。
- 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
4.接口的优点
- 类与接口的关系,实现关系,而且是多实现,一个类可以实现多个接口,类与类之间是继承关系,java中的继承是单一继承,一个类只能有一个父类,打破了继承的局限性。
- 对外提供规则(USB接口)
- 降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)
5.代码实现
//父类
public class Habdest {
//品牌
private String brand;
//型号
private String type;
//set和get方法
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
//功能方法
public void sendInfo(){
}
public void call(){
}
public void info(){
}
public void seed(){
}
}
//智能手机类
public class AptitudeHandest extends Habdest implements Network,TheakePictures,PlayWiring{
@Override
public void networkConn() {
System.out.println("开始启动移动网络..........");
}
@Override
public void play(String content) {
System.out.println("开始播放视频" + content + ".....");
}
@Override
public void takePicturens() {
System.out.println("咔嚓.......拍照成功");
}
@Override
public void sendInfo(){
System.out.println("发送带图片与文字的信息......");
}
@Override
public void call(){
System.out.println("开始视频电话......");
}
@Override
public void seed(){
System.out.println("这是一款型号为" + this.getType() + "的" + this.getBrand() + "手机:");
}
}
//普通手机类
public class CommonHandest extends Habdest implements PlayWiring {
@Override
public void play(String content) {
System.out.println("开始播放音乐"+ content +"......");
}
@Override
public void info(){
System.out.println("发送文字信息......");
}
@Override
public void call(){
System.out.println("开始语音通话.......");
}
@Override
public void seed(){
System.out.println("这是一款型号为" + this.getBrand() + "的" + this.getType() + "手机:");
}
}
//照相功能接口
public interface Network {
void networkConn();
}
//播放功能接口
public interface PlayWiring {
void play(String content);
}
//网络连接接口
public interface TheakePictures {
void takePicturens();
}
//测试类
public class HandestTest {
public static void main(String[] args) {
CommonHandest commonHandest = new CommonHandest();
commonHandest.setType("索尼立信");
commonHandest.setBrand("G502c");
commonHandest.seed();
commonHandest.play("《热血》");
commonHandest.info();
commonHandest.call();
System.out.println();
AptitudeHandest aptitudeHandest = new AptitudeHandest();
aptitudeHandest.setType("HTC");
aptitudeHandest.setBrand("I9100");
aptitudeHandest.seed();
aptitudeHandest.networkConn();
aptitudeHandest.play("《小时代》");
aptitudeHandest.takePicturens();
aptitudeHandest.sendInfo();
aptitudeHandest.call();
}
}
三.抽象类和接口的区别
1.共性
不断的进行抽取,抽取出抽象的,没有具体实现的方法,都不能实例化(不能创建对象)
2.区别
- 接口是行为的抽象,是一种行为的规范,接口是like a 的关系;抽象是对类的抽象,是一种模板设计,抽象类是is a 的关系。
- 接口没有构造方法,而抽象类有构造方法,其方法一般给子类使用
- 接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
- 抽象体现出了继承关系,继承只能单继承。接口提现出来了实现的关系,实现可以多实现。接口强调特定功能的实现,而抽象类强调所属关系。
- 接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号