包头市网站建设_网站建设公司_数据统计_seo优化
2025/12/17 4:39:14 网站建设 项目流程

目录

一、抽象类

1、1抽象类概念

1.2 抽象类语法

1.3 抽象类特性

1.4 抽象类的作用

二、接口

2、1接口的概念

2、2接口的语法规则

2、3接口使用

2、4接口特性

2.5 实现多个接口

2.6 接口间的继承

2、7抽象类和接口的区别

2、8 Object类


一、抽象类

1、1抽象类概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如:
在打印图形例子中,我们发现,父类Shape中的draw方法好像并没有什么实际工作,主要的绘制图形都是由Shape
的各种子类的draw方法来完成的.像这种没有实际工作的方法,我们可以把它设计成一个抽象方法(abstractmethod),包含抽象方法的类我们称为抽象类(abstract class).

1.2抽象类语法

// 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw(); abstract void calcArea(); // 抽象类也是类,也可以增加普通方法和属性 public double getArea(){ return area; } protected double area; // 面积 }
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

1.3抽象类特性

1.抽象类不能直接实例化对象
2.抽象方法不能是private
3.抽象方法不能被finalstatic修饰,因为抽象方法要被子类重写
4.抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用abstract修饰
5.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

1.4抽象类的作用

抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类.然后让子类重写抽象类中的抽象方法.
有些同学可能会说了,普通的类也可以被继承呀,普通的方法也可以被重写呀,为啥非得用抽象类和抽象方法呢?
确实如此.但是使用抽象类相当于多了一重编译器的校验.
使用抽象类的场景就如上面的代码,实际工作不应该由父类完成,而应由子类完成.那么此时如果不小心误用成父类
,使用普通类编译器是不会报错的.但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题.
很多语法存在的意义都是为了"预防出错",例如我们曾经用过的final也是类似.创建的变量用户不去修改,不 就相当于常量嘛?但是加上final能够在不小心误修改的时候,让编译器及时提醒我们. 充分利用编译器的校验,在实际开发中是非常有意义的.

二、接口

2、1接口的概念

在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。
电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备
电源插座插孔上,可以插:电脑、电视机、电饭煲...所有符合规范的设备
通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用
Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。、

2、2接口的语法规则

接口的定义格式与定义类的格式基本相同,将class关键字换成interface关键字,就定义了一个接口。
public interface 接口名称{ // 抽象方法 public abstract void method1(); // public abstract 是固定搭配,可以不写 public void method2(); abstract void method3(); void method4(); // 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁 }
提示:
1.创建接口时,接口的命名一般以大写字母I开头.
2.接口的命名一般使用"形容词"词性的单词.
3.阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性.

2、3接口使用

接口不能直接使用,必须要有一个"实现类""实现"该接口,实现接口中的所有抽象方法。
public class类名称implements接口名称{
// ...
}
注意:子类和父类之间是extends继承关系,类与接口之间是implements实现关系。
一个示例:
请实现笔记本电脑使用USB鼠标、USB键盘的例子
1. USB接口:包含打开设备、关闭设备功能
2.笔记本类:包含开机功能、关机功能、使用USB设备功能
3.鼠标类:实现USB接口,并具备点击功能
4.键盘类:实现USB接口,并具备输入功能
// USB接口 public interface USB { void openDevice(); void closeDevice(); } // 鼠标类,实现USB接口 public class Mouse implements USB { @Override public void openDevice() { System.out.println("打开鼠标"); } @Override public void closeDevice() { System.out.println("关闭鼠标"); } public void click(){ System.out.println("鼠标点击"); } } // 键盘类,实现USB接口 public class KeyBoard implements USB { @Override public void openDevice() { System.out.println("打开键盘"); } @Override public void closeDevice() { System.out.println("关闭键盘"); } public void inPut(){ System.out.println("键盘输入"); } } // 笔记本类:使用USB设备 public class Computer { public void powerOn(){ System.out.println("打开笔记本电脑"); } public void powerOff(){ System.out.println("关闭笔记本电脑"); } public void useDevice(USB usb){ usb.openDevice(); if(usb instanceof Mouse){ Mouse mouse = (Mouse)usb; mouse.click(); }else if(usb instanceof KeyBoard){ KeyBoard keyBoard = (KeyBoard)usb; keyBoard.inPut(); } usb.closeDevice(); } } // 测试类: public class TestUSB { public static void main(String[] args) { Computer computer = new Computer(); computer.powerOn(); // 使用鼠标设备 computer.useDevice(new Mouse()); // 使用键盘设备 computer.useDevice(new KeyBoard()); computer.powerOff(); } }

2、4接口特性

1.接口类型是一种引用类型,但是不能直接new接口的对象
public class TestUSB { public static void main(String[] args) { USB usb = new USB(); } } // Error:(10, 19) java: day20210915.USB是抽象的;无法实例化
2.接口中每一个方法都是public的抽象方法,即接口中的方法会被隐式的指定为public abstract(只能是 public abstract,其他修饰符都会报错)
3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
public interface USB { void openDevice(); // 编译失败:因为接口中的方式默认为抽象方法 // Error:(5, 23) java: 接口抽象方法不能带有主体 void closeDevice(){ System.out.println("关闭USB设备"); } }
4.重写接口中方法时,不能使用默认的访问权限
public interface USB { void openDevice(); // 默认是public的 void closeDevice(); // 默认是public的 } public class Mouse implements USB { @Override void openDevice() { System.out.println("打开鼠标"); } // ... } // 编译报错,重写USB中openDevice方法时,不能使用默认修饰符 // 正在尝试分配更低的访问权限; 以前为public
5.接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量
6.接口中不能有静态代码块和构造方法
7.接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8.如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8中:接口中还可以包含default方法。

2.5实现多个接口

Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类
继承表达的含义是is - a语义,而接口表达的含义是具有xxx特性

2.6接口间的继承

Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。
接口可以继承一个接口,达到复用的效果.使用extends关键字

2、7抽象类和接口的区别

(重要)抽象类和接口都是 Java 中多态的常见使用方式.都需要重点掌握.同时又要认清两者的区别(重要!!!常见面试题).
核心区别:抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写),而接口中 不能包含普通方法,子类必须重写所有的抽象方法.
如之前写的Animal例子.此处的Animal中包含一个name这样的属性,这个属性在任何子类中都是存在的.因此此处的 Animal只能作为一个抽象类,而不应该成为一个接口.
再次提醒: 抽象类存在的意义是为了让编译器更好的校验,Animal这样的类我们并不会直接使用,而是使用它的子类. 万一不小心创建了 Animal的实例,编译器会及时提醒我们.

2、8 Object类

ObjectJava默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。
范例:使用Object接收所有类的对象
class Person{} class Student{} public class Test { public static void main(String[] args) { function(new Person()); function(new Student()); } public static void function(Object obj) { System.out.println(obj); } } //执行结果: Person@1b6d3586 Student@4554617c
所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。如下:
对于整个Object类中的方法需要实现全部掌握。
目前,我们主要来熟悉这几个方法:toString()方法,equals()方法

2、8、1获取对象信息

如果要打印对象中的内容,可以直接重写Object类中的toString()方法。
// Object类中的toString()方法实现: public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

2、8、2对象比较equals方法

Java中,==进行比较时:
a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
// Object类中的equals方法 public boolean equals(Object obj) { return (this == obj); // 使用引用中的地址直接来进行比较 } class Person{ private String name ; private int age ; public Person(String name, int age) { this.age = age ; this.name = name ; } } public class Test { public static void main(String[] args) { Person p1 = new Person("gaobo", 20) ; Person p2 = new Person("gaobo", 20) ; int a = 10; int b = 10; System.out.println(a == b); // 输出true System.out.println(p1 == p2); // 输出false System.out.println(p1.equals(p2)); // 输出false } } //Person类重写equals方法后,然后比较: class Person{ ... @Override public boolean equals(Object obj) { if (obj == null) { return false ; } if(this == obj) { return true ; } // 不是Person类对象 if (!(obj instanceof Person)) { return false ; } Person person = (Person) obj ; // 向下转型,比较属性值 return this.name.equals(person.name) && this.age==person.age ; } }
结论:比较对象中内容是否相同的时候,一定要重写equals方法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询