一、抽象类
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 将具有继承性
*/