JAVA笔记6__抽象类/接口/多态/instanceof关键字、父类设计法则
/**
* 抽象类:很多具有相同特征和行为的类可以抽象为一个抽象类
* 1.抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
* 2.非抽象类继承抽象类必须实现抽象方法【可以是空实现】
* 3.抽象类可以有方法和属性
* 4.抽象类不能被实例化
* 5.抽象类不能声明为final
* 6.抽象类可以有构造方法【不代表实例化对象】
*/
public class Main {
public static void main(String[] args) {
Goddess m1 = new Goddess();
m1.setName("dining");
m1.say(); Ugly m2 = new Ugly();
m2.setName("fish");;
m2.say();
}
} abstract class Woman{ //Woman为抽象类
private String name;
public Woman(){
System.out.println("我是抽象类的构造方法。");
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public abstract void say(); //抽象方法(只有声明,没有实现)
} class Goddess extends Woman{
//实现父类的抽象方法
public void say(){
System.out.println("我是女神,我的名字是:"+getName());
}
}
class Ugly extends Woman{
public void say(){
System.out.println("我是丑女,我的名字是:"+getName());
}
}
/**
* 接口:一组行为的规范、定义,没有实现
* 接口定义格式:
* interface 接口名称{
* 全局常量;
* 抽象方法;
* }
* 1.一个类可以实现多个接口
* 2.抽象类实现接口可以不实现方法
* 3.接口中所有方法的访问权限都必须是public
* 4.接口中定义的属性都是常量
*/ //定义一个接口
interface Hit{
public static final String NAME = "d"; //在接口中定义的属性都是常量 public static final都可以省略
public void cry(); //抽象方法 public abstract(可以省略)
}
interface IEat{
public void eat();
} class goddess implements Hit,IEat{
//实现接口必须实现接口中的所有方法
public void cry(){
System.out.println("疼死我了~");
}
public void eat(){
System.out.println("一小口一小口吃~");
}
}
class girl implements Hit{
public void cry(){
System.out.println("你妹啊!疼死老娘了~");
}
}
abstract class Person implements Hit{ }
public class Main {
public static void main(String[] args) {
//父类就是大,子类就是小【向上转型:父类的引用指向子类对象】
Person s1 = new man();
s1.say(); //如果Person类中没有say方法则不能调用
s1.talk(); //调用的是man类中的talk方法,而不是Person类中的talk方法,如果man类中没有talk方法,则调用Person类中的talk方法
Person s2 = new woman();
s2.say();
//【向下转型:将父类实例转为子类实例(强制转换)】
man w1 = (man)s1;
w1.say();
//man w2 = (man)s2; 不能这样转
}
}
/**
* 多态性:1.方法的重载与重写 2.对象的多态性
*/
abstract class Person{
String name;
abstract public void say();
public void talk(){
System.out.println("hi I'm a person.");
}
}
class man extends Person{
public void say(){
System.out.println("I'm a man.");
}
public void talk(){
System.out.println("hi I'm a man.");
}
}
class woman extends Person{
public void say(){
System.out.println("I'm a woman.");
}
}
/**
* Instanceof关键字:用于判断某一个对象是否为某个类的实例,返回布尔值
*/
public class Main {
public static void main(String[] args) {
Man m1 = new Man();
say(m1);
Woman m2 = new Woman();
say(m2);
}
public static void say(Person p){
p.say();
if(p instanceof Woman){
Woman w = (Woman)p;
w.getangry();
}
}
} class Person{
public void say(){
System.out.println("I'm a person.");
}
}
class Man extends Person{
public void say(){
System.out.println("I'm a man.");
}
}
class Woman extends Person{
public void say(){
System.out.println("I'm a woman.");
}
public void getangry(){
System.out.println("I'm angrying...");
}
} /**
* 父类设计法则
* 能过instanceof关键字,我们可以方便地检查对象类型,但如果一个父类的子类过多,这样的判断还是显得很繁琐
* 如何设计父类?
* 1.父类通常情况下都设计为抽象类或接口,其中优先考虑接口,如果接口不能满足才考虑抽象类
* 2.一个具体的类尽可能不去继承另一个具体类,这样的好处是无需检查对象是否为父类的对象
*/
/**
* 抽象类应用(灵鹫宫招聘)
* 模板方法模式:定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中。
* 模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤
*/
public class Main {
public static void main(String[] args) {
LinJiuGong lp = new Shemale("fish7");
lp.action();
}
} abstract class LinJiuGong{
public void action(){ //招聘活动
if(competition()){
System.out.println("Congratulations, welcome to LinJiuGong !");
}else{
System.out.println("Sorry.....");
}
}
public abstract boolean competition(); //抽象方法
}
class Shemale extends LinJiuGong{
private String name;
Shemale(String name){
this.name = name;
}
public boolean competition(){ //实现比赛方法
System.out.println("Game start....I'm gonna win !");
Random r = new Random();
return r.nextBoolean();
}
}
JAVA笔记6__抽象类/接口/多态/instanceof关键字、父类设计法则的更多相关文章
- Java中的Serializable接口和transient关键字
Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2 ...
- Java学习笔记 抽象类 接口 多态
instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...
- java的方法重写 ,多态和关键字 instanceof和final
package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class ...
- Java笔记:抽象类、接口
这篇笔记主要是抽象类和接口,还有简单介绍下三种设计模式:模板模式.工厂模式.命令模式 1.抽象方法和抽象类(1)抽象方法和抽象类都必须使用abstract修饰符来定义,包含抽象方法的类只能被定义成抽象 ...
- Java笔记8-抽象接口
高级特性部分: 抽象(abstract) 接口(interface) 提纲: 抽象类的定义和使用 模板设计模式的使用 接口的定义和使用 回调函数 区别抽象类和接口的异同 软件设计原则--------- ...
- 接口&&多态&&构造函数&&关键字
day06 抽象类的局限性(与接口的区别) 抽象类可以定义非抽象方法,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;jdk1.8之后接口可以包含默认方法. 一个类只能继承一个直接父类 ...
- Java中 final static super this instanceof 关键字用法
一.final关键字 final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参 ...
- Effective java笔记3--类和接口1
一.使类和成员的可访问能力最小化 要想区别一个设计良好的模块与一个设计不好的模块,最重要的因素是,这个模块对于外部的其他模块而言,是否隐藏了内部的数据和其他的实现细节.一个设计良好的模块会隐藏所有的实 ...
- Effective java笔记3--类和接口2
三.接口优于抽象类 java提供两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类.由于java只允许单继承,所以,抽象类作为类型定义受到了极大的限制. 已有的类可以很容易被更新,以实现新的接 ...
随机推荐
- Catch That Cow----BFS
Catch That Cow Description 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<= ...
- 学习PHP中有趣的字符集国际化验证功能
今天的内容非常简单,不过也很有趣.不知道大家有没有经历过这样的事情,就是在某些字体下,0 和 O 不好区分,1 和 l 也是很难看清楚.当然,现在大部分的编辑器和 IDE 的默认字体都是会选择那些比较 ...
- HCNP Routing&Switching之路由控制-策略路由
前文我们了解了路由策略工具Route-Policy相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15322135.html:今天我们来聊一聊策略路由相 ...
- find_elements与find_element的区别
find_element不能使用len,find_elements可以使用len获取元素数量,判断页面有无某个元素,这个方法可以用来断言. 如添加用户后,判断是否添加成功. 删除用户后,判断是否删除成 ...
- linux 脚本--守护进程
#/bin/bash #队列的守护进程 Date = `date +"%F-%H:%M:%S"` XMML = "/var/www/html/xiangmu" ...
- JavaScript 原生控制元素添加删除
参考: https://blog.csdn.net/leijie0322/article/details/80664554 https://www.cnblogs.com/jpfss/p/910620 ...
- Python接口自动化测试概念以及意义
接口定义: 接口普遍有两种意思,一种是API(Application Program Interface),应用编程接口,它是一组定义.程序及协议的集合,通过API接口实现计算机软件之间的相互通信.而 ...
- 3-等待线程终止的join方法
等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...
- Spring源码阅读一
引导: 众所周知,阅读spring源码最开始的就是去了解spring bean的生命周期:bean的生命周期是怎么样的呢,见图知意: 大致流程: 首先后通过BeanDefinitionReader读取 ...
- Fortran学习笔记:03 数组(Array)
Fortran学习笔记目录 书接上回:Fortran学习笔记:02 流控制语句 数组(Array) 定义数组 一维数组 program main implicit none integer :: i ...