0基础学java_接口和instanceof关键字

抽象类

包含一个抽象方法的类就叫作抽象类。只声明而未实现的方法叫做抽象方法,抽象方法必须使用abstract关键字声明。

定义规则

  1. 包含一个抽象方法的类必须是抽象类
  2. 抽象类和抽象方法都要使用abstract关键字声明
  3. 抽象方法只需要声明而不需要实现
  4. 抽象类必须被子类继承,子类(不是抽象类)必须覆写抽象类中的全部抽象方法

格式

abstract class 抽象类名称{

      属性;

       访问权限 返回值类型 方法名称(参数){

          return 返回值;

}

      访问权限 abstract返回值类型 方法名称(参数){

         //在抽象方法中没有方法体

}

举例:

 1 package com.xiaotaotao.code;
 2 
 3 abstract class A{
 4     public static final String FLAG = "CHINA";//全局常量
 5     private String name = "肥猫";//定义一个普通的属性
 6     public void setName(String name){
 7         this.name = name;
 8     }
 9     public String getName(){
10         return this.name;
11     }
12     public abstract void print();//定义抽象方法
13 }
14 class B extends  A{//继承抽象类,因为B是普通类,所以必须覆写全部的抽象方法
15     public void print(){
16         System.out.println("FLAG = " + FLAG);
17         System.out.println("姓名 = " + super.getName());
18     }
19 }
20 public class AbstractDemo01 {
21     public static void main(String args[]){
22         B b = new B();
23         b.print();
24     }
25 }
26 
27 举例:
28 
29 package com.xiaotaotao.code;
30 
31 
32 
33 abstract class A{
34 
35     public A(){
36 
37     System.out.println("抽象类A中的构造方法");
38 
39     }
40 
41 }
42 
43 class B extends  A{//继承抽象类,因为B是普通类,所以必须覆写全部的抽象方法
44 
45     public B(){
46 
47         super();//也可以通过super明确指定构造方法
48 
49         System.out.println("子类B中的构造方法" );
50 
51     }
52 
53 }
54 
55 public class AbstractDemo01 {
56 
57     public static void main(String args[]){
58 
59         B b = new B();
60 
61     }
62 
63 }

 

举例:

 1 package com.xiaotaotao.code;
 2 
 3 
 4 
 5 abstract class Person01{
 6 
 7     private String name;
 8 
 9     private int age;
10 
11     public Person01(String name , int age){//构造方法
12 
13         this.name = name;
14 
15         this.age = age;
16 
17     }
18 
19     public  void setName(String name){//void 方法有返回值
20 
21         this.name = name;
22 
23     }
24 
25     public void setAge(int age){
26 
27         this.age = age;
28 
29     }
30 
31     public String getName(){
32 
33         return name;
34 
35     }
36 
37     public int getAge(){
38 
39         return age;
40 
41     }
42 
43     public abstract String getInfo();//定义抽象方法
44 
45 }
46 
47 class Student01 extends Person01{
48 
49     private String school;
50 
51     public Student01(String name , int age , String school){
52 
53         super(name , age);//指定要定义两个参数内的构造方法
54 
55         this.school = school;
56 
57     }
58 
59     public void setSchool(String school){
60 
61         this.school = school;
62 
63     }
64 
65     public String getSchool(){
66 
67         return school;
68 
69     }
70 
71     public String getInfo(){
72 
73         return "姓名 :" + super.getName() + " 年龄 :" + super.getAge() + " 学校 : " + this.getSchool();
74 
75     }
76 
77 
78 
79 }
80 
81 public class AbstractDemo02 {
82 
83     public static void main(String args[]){
84 
85         Student01 s = new Student01("肥猫" , 28 , "浙江大学");
86 
87         System.out.println(s.getInfo());
88 
89     }
90 
91 }
92  

接口

接口可以理解为一种特殊的类,里面全部是由全局变量和公共的抽象方法所组成。

接口中的抽象方法可以不加abstract,但是抽象方法中必须加abstract关键字

格式

interface 类名称{

全局变量

 抽象方法

}

接口的实现

与抽象类一样,接口要想使用必须通过子类,通过implements关键实现接口

class A implements 接口A,接口B{

}

接口的使用中必须有子类,子类必须覆写全部的抽象方法。一个子类可以同时实现多个接口,如果子类不是抽象类的话,那就得覆写接口中的全部抽象方法。

举例:

p
 1 ackage company.feimao.package1;
 2 
 3 
 4 
 5 interface A{
 6 
 7     public static final String AUTHOR = "肥猫";//全局变量
 8 
 9     public abstract void print();//抽象方法
10 
11     public abstract String getInfo();//抽象方法
12 
13 }
14 
15 interface B {
16 
17     public void say();//抽象方法
18 
19 }
20 
21 class C implements A , B{
22 
23     public void say(){//覆写抽象方法
24 
25         System.out.println("Hello World!");
26 
27     }
28 
29     public String getInfo(){
30 
31         return "Hello";
32 
33     }
34 
35     public void print(){
36 
37         System.out.println("作者 :" + AUTHOR);
38 
39     }
40 
41 }
42 
43 public class InterfaceDemo01 {
44 
45     public static void main(String args[]){
46 
47         C c = new C();
48 
49         c.say();
50 
51         c.print();
52 
53     }
54 
55 
56 
57 }

举例:继承类实现接口

 1 package company.feimao.package1;
 2 
 3 interface H{
 4 
 5     public String AUTHOR = "肥猫";
 6 
 7     abstract void print();
 8 
 9     abstract String getInfo();
10 
11 }
12 
13 abstract class I implements H{
14 
15     abstract void say();
16 
17 }
18 
19 class J extends I {
20 
21     public void say(){
22 
23         System.out.println("Hello 肥猫");
24 
25     }
26 
27     public String getInfo(){
28 
29         return "Hello";
30 
31     }
32 
33     public void print(){
34 
35         System.out.println("作者 "+ AUTHOR);
36 
37     }
38 
39 }
40 
41 public class InterfaceDemo02 {
42 
43     public static void main(String args[]){
44 
45         J j = new J();
46 
47         j.getInfo();
48 
49         j.print();
50 
51         j.say();
52 
53     }
54 
55 }

一个接口不能继承抽象类,但是可以继续多个接口,实现接口的多继承

格式

Interface A extends B , C{

}

 1 package company.feimao.package1;
 2 
 3 interface H{
 4 
 5     public String AUTHOR = "肥猫";
 6 
 7     abstract void printA();
 8 
 9 }
10 
11 interface I{
12 
13     public void printB();
14 
15 }
16 
17 interface J extends H , I{
18 
19     public void printC();
20 
21 }
22 
23 class K implements J {
24 
25     public void printA(){
26 
27         System.out.println("Hello 肥猫");
28 
29     }
30 
31     public void printB(){
32 
33         System.out.println("Hello 猪宝宝");
34 
35     }
36 
37     public void printC(){
38 
39         System.out.println("Hello 淘淘");
40 
41     }
42 
43 }
44 
45 public class InterfaceDemo02 {
46 
47     public static void main(String args[]){
48 
49         K k = new K();
50 
51         k.printA();
52 
53         k.printB();
54 
55         k.printC();
56 
57     }
58 
59 }
60  

Instanceof关键字

在java中可以使用instanceof关键字判断一个对象到底是哪个类的实例

对象 instanceof 类—>返回boolean类型

 1 package company.feimao.package1;
 2 
 3 class W{
 4     public void fun1(){
 5         System.out.println("W------>public void fun1(){}");
 6     }
 7     public void fun2(){
 8         this.fun1();
 9     }
10 }
11 class E extends W{
12     public void fun1(){
13         System.out.println("E----->public void fun1(){}");
14     }
15     public void fun3(){
16         System.out.println("E------->public void fun3(){}");
17     }
18 
19 }
20 public class InstanceofDemo01 {
21     public static void main(String args[]) {
22         W w = new E();//向上转型
23         System.out.println("W w = new E() :" + (w instanceof W));
24         System.out.println("W w = new E() :" + (w instanceof E));
25         W w2 = new W();
26         System.out.println("W w = new E() :" + (w2 instanceof W));
27         System.out.println("W w = new E() :" + (w2 instanceof E));
28     }
29 }

在实际开发中,对于向下转型操作最好增加验证,以保证转型时不会发生classCastException.一个类永远不要去继承一个已经实现好的类,而只能继承抽象类和实现接口。