JAVA笔记6__抽象类/接口/多态/instanceof关键字、父类设计法则

时间:2022-02-26 09:04:17
/**
* 抽象类:很多具有相同特征和行为的类可以抽象为一个抽象类
* 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关键字、父类设计法则的更多相关文章

  1. Java中的Serializable接口和transient关键字

    Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2 ...

  2. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  3. java的方法重写 ,多态和关键字 instanceof和final

    package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class ...

  4. Java笔记:抽象类、接口

    这篇笔记主要是抽象类和接口,还有简单介绍下三种设计模式:模板模式.工厂模式.命令模式 1.抽象方法和抽象类(1)抽象方法和抽象类都必须使用abstract修饰符来定义,包含抽象方法的类只能被定义成抽象 ...

  5. Java笔记8-抽象接口

    高级特性部分: 抽象(abstract) 接口(interface) 提纲: 抽象类的定义和使用 模板设计模式的使用 接口的定义和使用 回调函数 区别抽象类和接口的异同 软件设计原则--------- ...

  6. 接口&&多态&&构造函数&&关键字

    day06 抽象类的局限性(与接口的区别) 抽象类可以定义非抽象方法,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;jdk1.8之后接口可以包含默认方法. 一个类只能继承一个直接父类 ...

  7. Java中 final static super this instanceof 关键字用法

    一.final关键字 final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参 ...

  8. Effective java笔记3--类和接口1

    一.使类和成员的可访问能力最小化 要想区别一个设计良好的模块与一个设计不好的模块,最重要的因素是,这个模块对于外部的其他模块而言,是否隐藏了内部的数据和其他的实现细节.一个设计良好的模块会隐藏所有的实 ...

  9. Effective java笔记3--类和接口2

    三.接口优于抽象类 java提供两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类.由于java只允许单继承,所以,抽象类作为类型定义受到了极大的限制. 已有的类可以很容易被更新,以实现新的接 ...

随机推荐

  1. servlet二

    ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始 ...

  2. LoadRunner执行过程报错&OpenCurlyDoubleQuote;Failed to connect to server &quot&semi;xxx&period;xxx&period;xxx&period;xxx&colon;xx&quot&semi;&colon;&lbrack;10060&rsqb; connetion time out”

    执行性能测试过程中,LR报错: Action.c(6):Error -27796: Failed to connect to server "xxx.xxx.xxx.xxx:xx" ...

  3. OpenStack Cinder组件支持的块存储设备表

    摘自恒天云官网:http://www.hengtianyun.com/download-show-id-18.html OpenStack的Cinder组件底层可以连接多种存储设备和方案,每一个Ope ...

  4. mysql的字段类型范围必须重视起来

    在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮 ...

  5. android activity启动的时候隐藏软键盘

    1.概述 android如果界面有EditText之类的跳软键盘的控件  在跳转到该界面是默认会跳出软键盘的. 更何况有些需求要直接需要获取焦点 <requestFocus /> 如果是E ...

  6. linux中服务器定时程序设定

    服务器不重启的情况下定时自动重启apache及mysql服务,其实也大同小异.具体步骤如下:  一.每天的12点及16点重启apache及mysql服务 [root@www bin]# cd /opt ...

  7. OLAP与数据仓库------《Designing Data-Intensive Applications》读书笔记4

    由于第三章的内容比较多,这里我们拆分成两篇读书笔记来记录.上一章我们聊了聊如何数据库是如何实现存储和检索的,今天这篇我们继续来看看OLTP与OLAP存储引擎的区别与联系. 1.OLTP与OLAP 联机 ...

  8. anguar使用指令写选项卡

    今天,我们来学习一下angular中怎么使用指令来实现两个选项卡的问题. 首先,要先引入jQuery文件与angularjs文件. <!DOCTYPE html><html lang ...

  9. Label Encoding vs One Hot Encoding

    最近在刷kaggle的时候碰到了两种处理类别型特征的方法:label encoding和one hot encoding.我从stackexchange, quora等网上搜索了相关的问题,总结如下. ...

  10. Keil不能跳转到函数的定义怎么办

    有时候我们右键一个函数名并点击Go To Definition Of xxx时,Keil却提示无法找到定义.但这个函数确实有定义的.这个时候可以试着重新编译整个工程,即可跳转到定义了.