Java中高级类的特性

一、抽象类

1、为什么使用抽象类

类用于描述现实生活中的一类事物,类中有属性,有方法,,方法都有方法体

某种情况下,父类只能知道子类应该具有一个怎样的方法,但是不能明确知道子类如何实现该方法

eg:几何图形(多态联系),所有几何图形都应该具备计算面积的功能,但是不同几何图形的计算面积的方式不同

 

java 为上述问题提供了相应的解决办法

java 允许父类中只提供了一个方法的声明,不提供具体的实现,具体的实现交给子类来完成

该方法称为“ 抽象方法”,拥有一个或多个抽象方法的类,称为“抽象类”

 

2、如何使用抽象:abstract

1)使用 abstract 修饰的类称为“抽象类”

①格式:访问控制修饰符 abstract class 类名{}

②拥有一个或多个抽象方法的类必须是抽象类

③抽象类中可以有非抽象方法,抽象类中可以没有抽象方法

④**抽象类不能创建实例

⑤抽象类中可以声明构造器

目的:当子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类是如何进行初始化的

 

2)使用 abstract 修饰的方法称为 “抽象方法”

①格式:访问控制修饰符 abstract 返回值类型 方法名(参数列表);

②子类继承父类后,若重写了父类中“所有”的方法,该类是具体类,可以创建实例

③子类继承父类后,若没有重写父类中“所有”的方法,该类必须是抽象类,不可以创建实例

abstract class Pserson{
   
   private String name;
   private int age;
   
   public Person(){}
   
   public void setName(String name){
       this.name = name
  }
   
   //人都应该具备一个说话的功能,但是不同的人说话方式不同
   public abstract void speak();
}//Person p = new Person();

3、abstract 关键字的注意

① abstract 和 final 不能同时使用

② abstract 和 static 不能同时使用

③ abstract 和 private 不能同时使用

二、接口

可以定义多个不相关事物的相同功能

1、如何使用接口(如下以 jdk1.7 为标准)

①接口与类是平级的

关键字:interface

eg:public interface Flyer{}

②可以把接口理解为特殊的抽象类,因为 jdk1.7 前接口中只能定义”全局静态变量“和抽象方法

//全局静态变量
int NUM = 100;//public static final

//抽象方法
void fly();//public abstract

③接口中不能有变量,构造器,代码块

④**接口中不能创建实例

⑤接口就是用来被实现的

实现接口关键字:implements

eg:class Bird implements Flyer{}

⑥实现接口的类称为“实现类”,实现类的功能和“继承”一样的,可以继承接口中所有的成员

⑦若实现类实现了接口中所有的抽象方法,该类为具体类,可以创建实例

若实现类没有实现接口中所有的抽象方法,该类必须为抽象类,不可以创建实例

⑧接口可以多实现-----解决了 java 中单继承的局限性

eg:class Bird implements Flyer, Runner{}

⑨一个类可以继承另一个类,同时实现多个接口

eg:

class Bird extends Animal implements Flyer,Runner{}

注意:先继承,后实现

2、jdk1.8 对于接口的升级

(Lambda 表达式需要函数式接口(接口中只有一个抽象方法的接口) 的支持)

①接口中的默认方法

②接口中的静态方法

三、内部类

1、成员内部类

在类中声明另一个类,里面的类称为内部类,外面的类称为外部类

①是类的成员之一,(属性、方法、构造器、代码块)

②可以使用四种访问控制修饰符(public、protected 、default、private)

③可以使用 static 和 final

④与类具有相同的特性

class Person{
   private String name;
   
   public Person(){};
   
   public void setName(String name){
       this.name = name;
  }
   
   public void getName(String name){
       return name;
   
   //内部成员类
   public class Computer{
       
       private String name;
       
       public Computer(){};
       
       public void setName(String name){
           this.name = name;
      }        
  }
       
       //对类的隐藏
      private class Head{
         
      }
       //静态内部类
       static class Mobile{
           public void show(){
               System.out.println("静态内部类中的方法");
          }
      }        
}
   
class InnerclassTest{
   
   public static void main(String[] args){
       //创建静态内部类对象
       Person.Mobile pm = new Person.Mobile();
       pm.show();
       
       //创建非静态内部类的对象
       Person p = new Person();
       Person.Computer pc = p.new Computer();
       pc.setName("IBM");
       
  }
   
}    

2、局部内部类

 

四、枚举类

是 jdk1.5 后出的特性,可以定义有限数量的可穷举数据集

简而言之,当确定一个类有几个对象时,使用枚举

1、自定义枚举

①私有化构造器

②类的内部创建对象

package com.at.java;

//自定义枚举类
public class Season1{
   
   private String seasonName;
   private String seasonDesc;
   
   //2.类的内部创建对象
   public static final Season1 SPRING = new Season1("春天");
   public static final Season1 SUMMER = new Season1("夏天");
   public static final Season1 AUTUMN = new Season1("秋天");
   public static final Season1 WINTER = new Season1("冬天");
   
   //1.私有化构造器
   private Season1(String seasonName, String seasonDesc){
       this.seasonName = seasonName;
       this.seasonDesc = seasonDesc;
  }
   
   //下面是get/set方法和tostring
   
}

 

2、使用 enum 关键字

valueOf(String name):根据枚举类对象的名称,获取枚举类对象

value():获取当前枚举类中所有的枚举类对象,组成的数组

public enum Season1{
   
   //2.类的内容创建对象
   SRPRING("春天");
   SUMMER("夏天");
   AUTUMN("秋天");
   WINTER("冬天");
}

 

3、枚举类实现接口

public enum Season1 implements MyInterface{
   SPRING{
       public void show(){
           System.out.println("春天");
      }
  }
   
   SUMMER{
       public void show(){
           System.out.println("夏天");
      }
  }
   
   AUTUMN{
       public void show(){
           System.out.println("秋天");
      }
  }
   
   WINTER{
       public void show(){
           System.out.println("冬天");
      }
  }
}

 

五、注解

jdk1.5 后出的特性,是一个元数据,是一个代码级别的说明

String name = "atljs";

1、JDK 内置的常用注释

① @Override:用于注解方法,说明该方法必须是重写方法

② @Deprecated:用于注解属性,方法、类,说明已经过时

③ @SuppressWarnings:用于抑制编译器警告

2、自定义注释

public @interface MyAnnotation{
   
   String value() default "arljs";
}

3、元注解

/*
@Retention:描述注解的生命周期
@Target:描述注解可用于修饰哪些程序元素
@Documented:随之生成说明文档,但注解的生命周期必须是 RUNTIME
@Inherited:被他修饰的 Annotation 将具有继承性
*/

 

posted @ 2021-01-26 16:42  是二阳ya  阅读(43)  评论(0)    收藏  举报