一、抽象类

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 将具有继承性
*/