JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、关键字 abstract
1.1.abstract可以修饰:类,方法
1.2.abstract修饰方法 :
- 抽像方法没方法体
 - 非抽像类继承抽像类 必须重写抽像类中的所有抽像方法(包括间接抽像父类)父类如果重写了间接抽像父类中的抽像方法,那么非抽像子类可以不用再重写该方法
 - 如果非抽像子类不想抽写抽像类中的抽像方法
 
①那么该类只能也被声明成抽像类
②父类全部重写抽像方法
abstract修饰类:
- 抽像类不能被实例化
 - 思考:抽像类构造器吗? 抽像类是有构造器的 因为要实现 子类对象的实例化过程。
 - 抽像方法所在的类必须是抽像类
 
1.4.abstrcat不可以和哪些关键字一起使用
    final,static,private
1.5:代码
/*
 * 几何图形
 * 1.抽像类可以继承非抽像类
 */
abstract class GeometricObject extends A {
	//抽像类是构造器的因为 要实现  子类对象的实例化过程
	public GeometricObject(){
		System.out.println("GeometricObject()");
	}
	@Override
	public void test() {
	}
	//抽像方法没方法体
	public abstract void findArea();
}
//如果非抽像子类不想抽写抽像类中的抽像方法,那么该类只能也被声明成抽像类
class Triangle extends GeometricObject{
	//非抽像类继承抽像类 必须重写抽像类中的所有抽像方法(包括间接抽像父类)
	//抽像父类如果重写了间接抽像父类的抽像方法 ①那么该类只能也被声明成抽像类  ②父类全部重写抽像方法
	@Override
	public void findArea() {
	}
}
2、模板方法的设计模式
/*
 * 模板设计模式:
 *
 *
 * 需求 : 计算代码运行的时间
 *
 */
abstract class Computer{
	public void codeTime(){
		long start = System.currentTimeMillis();
		//将可变的代码抽成抽像方法,具体的实现由子类去实现
		runCode();
		long end = System.currentTimeMillis();
		System.out.println("time = " + (end - start));
	}
	public abstract void runCode();
}
class RunNumber extends Computer{
	@Override
	public void runCode() {
		for (int i = 0; i < 1000; i++) {
			if(i % 2 == 0){
				System.out.println(i);
			}
		}
	}
}
3、关键字:interface
3.1 接口的声明格式 :
权限修饰符(public,缺省的 interface 接口名{}
3.2 说明
   1.接口声明的格式 :权限修饰符(public和缺省的)   interface  接口名{}
   2.接口和类是并列的关系。
   3.jdk1.8之前接口中只能定义 - 抽像方法和常量
   4.类和类的关系是继承 (单继承)
      类和接口的关系是实现关系(多实现 例   A implments English,Math接口和接口的关系是继承关系(多继承
   5.接口中没构造器 - 不能创建接口的实例
   6.接口与实现类的多态性(详见InterfaceTest2.java)
3.3:接口和类的多态性
class Computer{
    public void runUSB(USB usb){
        usb.start();
        System.out.println("-----------工作中-------------");
        usb.close();
    }
    public void runBluetooth(Bluetooth bt){
        bt.connect();
        System.out.println("--------连接中--------------");
        bt.disConnect();
    }
}
interface USB{
    void start();
    void close();
}
interface Bluetooth{
    void connect();
    void disConnect();
}
class Printer implements USB,Bluetooth{
    @Override
    public void start() {
        System.out.println("打印机开始工作了.....");
    }
    @Override
    public void close() {
        System.out.println("打印机停止工作了....");
    }
    @Override
    public void connect() {
        System.out.println("打印机已经连接蓝牙.....");
    }
    @Override
    public void disConnect() {
        System.out.println("打印机已经断开蓝牙.....");
    }
}
class Mouse implements USB,Bluetooth{
    @Override
    public void connect() {
        System.out.println("鼠标已经连接蓝牙.....");
    }
    @Override
    public void disConnect() {
        System.out.println("鼠标已经断开蓝牙.....");
    }
    @Override
    public void start() {
        System.out.println("鼠标开始开作了....");
    }
    @Override
    public void close() {
        System.out.println("鼠标停止工作了....");
    }
}
面试题: 关于abstract 和 interface 的关系
(1)abstract类其实和普通类一样,拥有有自己的数据成员和方法,只不过abstract类里面可以定义抽象abstract的方法(声明为abstract的类也可以不定义abstract的方法,直接当做普通类使用,但是这样就失去了抽象类的意义)。
(2)一个类中声明了abstract的方法,该类必须声明为abstract类。
(3)interface中只能定义常量和抽象方法。在接口中,我们定义的变量默认为public static final类型,所以不可以在显示类中修改interface中的变量;定义的方法默认为public abstract,其中abstract可以不明确写出。
4、关键字:工厂方法的设计模式
interface IWorkFactory{
	Work getWork();
}
class TeacherWorkFactory implements IWorkFactory{
	@Override
	public Work getWork() {
		return new TeacherWork();
	}
}
class StudentWorkFactory implements IWorkFactory{
	@Override
	public Work getWork() {
		return new StudentWork();
	}
}
interface Work{
	void doWork();
}
class StudentWork implements Work{
	@Override
	public void doWork() {
		System.out.println("学生就要好好学习");
	}
}
class TeacherWork implements Work{
	@Override
	public void doWork() {
		System.out.println("老师就要好好教学生学习,不学就打");
	}
}
5、关键字:内部类
5.1 定义 : 在一个类A的内部再声明一个类B,类A叫做外部类,类B叫做内部类
5.2 内部类的分类
内部类 : 成员内部类   vs  局部内部类
成员内部类 : 静态成员内部类  vs 非静态成员内部类
5.3 说明
内部类作为成员来说:
- 可以使用四种权限修饰符
 - 可以使用static修饰
 
内部类作为类来说:
- 类内部可以,构造器,属性,代码块
 - 可以被继承
 
5.4 如何创建内部类对象
静态内部类 : new 外部类的类名.静态内部类的类名()
非静态内部类 :new 外部类的类名().new 非静态内部类的类名()
5.5 如何调用外部类的成员
静态内部类 :外部类的类名.类变量的名字、静态方法名
非静态内部类 :外部类的类名.this.属性名、方法名
5.6 局部内部类
- 在方法内再定义一个类。
 - 如何返回内部类的对象?
 
①可以通过创建一个接口,让局部内部类实现该接口。
       ②方法的返回值类型为该接口的类型
       ③创建局部内部类的对象并返回
        public AA getInnerClass(){
		//局部内部类
		class C implements AA{
			@Override
			public void show(){
				System.out.println("inner class");
			}
		}
		C c = new C();
		return c;
	}
        interface AA{
	    void show();
        }
6、关键字:枚举
6.1 定义
如果一个类的对象是有限的,可数多个的这样的类叫做枚举类
6.2 如何自定义枚举类
class Season{
	//ctrl + shift + x 所字母变成大写
	//ctrl + shift + y 所字母变成小写
	private final String SEASONNAME;
	private final String SEASONDES;
	//私化构造器
	private Season(String SEASONNAME,String SEASONDES){
		this.SEASONDES = SEASONDES;
		this.SEASONNAME = SEASONNAME;
	}
	//创建四个对象
	public static final Season SPRING = new Season("春天","春眠不觉晓");
	public static final Season SUMMER = new Season("夏天","夏天蚊子咬");
	public static final Season AUTUMN = new Season("秋天","秋天扫落叶");
	public static final Season WINTER = new Season("冬天","冬天穿棉袄");
	public String getSeasonName() {
		return SEASONNAME;
	}
	public String getSeasonDes() {
		return SEASONDES;
	}
}
6.3 如何使用enum关键字定义枚举类
enum Season10{
	//创建四个对象。注意 :创建的对象必须放在首行
	SPRING,
	SUMMER,
	AUTUMN,
	WINTER;
}
6.4 常用API

6.5 枚举的对象实现接口中的方法
enum Season3 implements Show{
	//创建四个对象。注意 :创建的对象必须放在首行
	SPRING{
		@Override
		public void info() {
			System.out.println("春天");
		}
	},
	SUMMER{
		@Override
		public void info() {
			System.out.println("夏天");
		}
	},
	AUTUMN{
		@Override
		public void info() {
			System.out.println("秋天");
		}
	},
	WINTER{
		@Override
		public void info() {
			System.out.println("冬天");
		}
	};
}
7、关键字 : 注解
7.1 定义:注解可以用来对类中的结构(属性,方法,类,构造器...)进行补充说明,而不改变原有的结构。
7.2 JDK内置的个注解

自定义注解
格式 : 权限修饰符(public,缺省的 @interface 注解名{
          int age() default 10;
}
代码:
@interface MyAnn2{
    String name();
    int age() default 20; //给这个属性赋值一个默认值为20,这样就可以再加注解时不用再强行进行赋值
}
7.4 元注解
@Target : 用来限制说明注解可以用在类中的哪些结构上。
@Retention :
            SORUCE(了解): 源文件 - 编译期间 (现在直接丢弃了这种策略)
            CLASS(了解): 编译期间 - 运行期间
            RUNTIME: 运行期间 (如果需要通过反射获取该注解的信息,那么该注解必须是Runtime)
//下面两个知道即可
@Documented : 该注解是否能被javadoc所解析
@Inherited : 该注解是否可以被继承。
JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解的更多相关文章
- Java【第八篇】面向对象之高级类特性
		
static 关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有 ...
 - 高级类特性----抽象类(abstract class)
		
抽象类(abstract class) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具 ...
 - Java高级类特性(二)
		
一.static关键字 static关键字用来声明成员属于类,而不是属于类的对象.1). static (类)变量类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来. static变量也称作 ...
 - 高级类特性----static关键字
		
static 关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用. 我们 ...
 - Java高级类特性(一)
		
一.继承性 1)继承的使用:权限修饰符 class A extends B{}:2)子类:A 父类(基类 SuperClass):B3)子类继承父类后,父类中声明的属性.方法,子类都可以获取到明确:当 ...
 - 高级类特性----接口(intertface)
		
接 口 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值的定义的集合. 从本 ...
 - Java SE学习笔记 --->高级类特性 ---> toString() 方法
		
概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...
 - 高级类特性----final关键字
		
final 关键字 在Java中声明类.属性和方法时,可使用关键字final来修饰. final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次. final标记的类不能被继承.提高安全性,提 ...
 - 设计模式学习-使用go实现模板模式
		
模板模式 定义 模板模式的作用 优点 缺点 适用范围 代码实现 回调 模板模式 VS 回调 参考 模板模式 定义 模板模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到 ...
 
随机推荐
- LeetCode--Array--Remove Element && Search Insert Position(Easy)
			
27. Remove Element (Easy)# 2019.7.7 Given an array nums and a value val, remove all instances of tha ...
 - ysql常用sql语句(12)- group by 分组查询
			
测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...
 - abp web.mvc项目中的菜单加载机制
			
abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样,它是在编写代码的时候配置,而我们一般写的通用权限管理系统中,是后期在后台界面中添加的.这一点有很大不同.abp关于菜单的定义及管理 ...
 - Kitty Cloud(HTTP_RPC)的全局异常处理
			
项目地址 https://github.com/yinjihuan/kitty-cloud 异常处理不用我讲,大家都清楚.单独的异常处理太繁琐,全局异常处理可以在一个应用中统一进行异常的处理,非常方便 ...
 - DNS注入以获取WebShell -asp_POST_DNS_SQLServer_GetWebShell
			
豹子安全-注入工具-asp_POST_DNS_SQLServer_GetWebShell 注意,是 DNS 注入.这种方式的注入会隐藏很多细节, 对于用户来说是透明的. 请看如下视频(该视频会停留15 ...
 - 2018-08-27 jq筛选选择器
			
筛选选择器:为了辅助选择器更简便.快速的找到元素: 1.过滤 eq(n) -> 第n个元素(从零开始) $('h1').eq(2) // 第三个h1 first() -> 第一个元素 la ...
 - 1、Fiddler基础
			
1.抓取https请求 前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddl ...
 - 【WEB自动化】【第一节】【Xpath和CSS元素定位】
			
目前自动化测试开始投入WEB测试,使用RF及其selenium库,模拟对WEB页面进行操作,此过程中首先面对的问题就是对WEB页面元素的定位,几乎所有的关键字都需要传入特定的WEB页面元素,因此掌握常 ...
 - css 箭头三角形
			
1.向下的三角形 .down{ display:inline-block; width:0px; height:0px; border-top:8px solid rgba(0, 0, 0, 0.65 ...
 - jupyter notebook 修改前端样式
			
目录 jupyter notebook主题 修改css和js 最终效果 jupyter notebook主题 作者的GitHub地址:https://github.com/dunovank/jupyt ...