2026/1/11 9:43:54
网站建设
项目流程
网站配色 蓝色,注册邮箱,wordpress get_option array,做网站那个公司好目录 一、抽象类
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抽象类概念…目录一、抽象类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.抽象方法不能被final和static修饰因为抽象方法要被子类重写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方法时不能使用默认修饰符 // 正在尝试分配更低的访问权限; 以前为public5.接口中可以含有变量但是接口中的变量会被隐式的指定为public static final变量6.接口中不能有静态代码块和构造方法7.接口虽然不是类但是接口编译完成后字节码文件的后缀格式也是.class8.如果类没有实现接口中的所有的抽象方法则类必须设置为抽象类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类Object是Java默认提供的一个类。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); } } //执行结果 Person1b6d3586 Student4554617c所以在开发之中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.ageperson.age ; } }结论比较对象中内容是否相同的时候一定要重写equals方法。