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();
    }
}
时间: 2024-12-23 12:08:28

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

Java中的Serializable接口和transient关键字

Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2. 问题排查和解决 3. 总结 1 向memcached中放数据时遇到NotSerializableException异常 项目中用到了memcached缓存,存储客户的组织结构,以便提高系统性能.之前系统运行正常,近期为了和Portal对接,更新了涉及到组织结构的jar包(由公司产品部门维护),更

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

package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class Penguin{} final修饰符方法,方法就不能被重写.所以final修饰的是最终子类或最终类 final 修饰属性,经常和static搭配使用,形成静态常量.静态常量不能被改变 修饰变量final 修饰基本数据类型 ,表示a中的内容(值)不能被改变final int a = 10; fina

【Java笔记】——抽象类和接口

现在开发的主流都是面向对象,面向过程几乎已经被淘汰了.理解面向对象,就要知道它的三大特性,多态继承和封装.在学习面向对象的过程中,总是会接触到抽象类和接口,涉及到继承和实现,而这两个概念又总是傻傻分不清楚.不过经过不懈努力,还是解决的差不多了.下面就来介绍下抽象类和接口: 抽象类 概念 用abstract关键字来修饰的类称为抽象类 特点 1.不是完整的类,只能作为基类 2.不能被实例化 3.有抽象方法的类必须声明为抽象类,而且该抽象方法必须被重写 举例 <span style="font-

Java笔记8-抽象接口

高级特性部分: 抽象(abstract) 接口(interface) 提纲: 抽象类的定义和使用 模板设计模式的使用 接口的定义和使用 回调函数 区别抽象类和接口的异同 软件设计原则---------------------------------------------------------------------抽象类 定义: public abstract class XXX{ //1.抽象类中可以有构造方法,但是抽象类不能够被实例化 //2.抽象类中可以普通属性 //3.抽像类中可以有

抽象类 接口 多态

一 抽象类(abstract) 抽象类的概念只抽取了很多类的方法的声明,方法声明用abstract修饰.一个类如果有抽象方法,那么这个类必须是抽象类.抽象类里边可以没有抽象方法,如果这么做只有一个目的:不让你创建这个类的对象.抽象类不能被实例化,不能创建对象.如果一个类继承抽象类,那么,它要么重写抽象类中的所有抽象方法,要么本身也是抽象类. 抽象类的成员成员变量:可以是常量,也可以是变量.子类可以直接继承抽象类中的成员变量.成员方法:可以是抽象的,也可以是非抽象的.抽象方法在子类中必须要被实现.

Thinking In Java笔记(第八章 多态)

第八章 多态 在面向对象的程序设计语言中,多态是继抽象和技能之后的第三种基本特征.多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序. 多态的作用是用来消除类型之间的耦合关系. 8.1 再论向上转型 将某个对象的引用视为对其基类对象的做法被称作向上转型.但是这样做也有问题.看如下的例子: public enum Note { MIDDLE_C, C_SHARP, B_FlAT; } class Instrument { public void play(Note n) { Syste

Java笔记(07):面向对象--多态

1.final关键字 1 /* 2 final可以修饰类,方法,变量 3 4 特点: 5 final可以修饰类,该类不能被继承. 6 final可以修饰方法,该方法不能被重写.(覆盖,复写) 7 final可以修饰变量,该变量不能被重新赋值.因为这个变量其实常量. 8 9 常量: 10 A:字面值常量 11 "hello",10,true 12 B:自定义常量 13 final int x = 10; 14 */ 15 16 //final class Fu //无法从最终Fu进行继承

hinking in JAVA笔记——第8章 多态

多态分离做什么和怎么做.又成为动态绑定,后期绑定或运行时绑定. 8.1再论向上转型 对象可以当做它的父类型来使用,称为向上转型. 一个方法接受父类为参数,所有的子类都能调用这个方法,编译器在编译时间不确定执行哪个方法,在运行时间根据相应的子类是否重写了方法决定调用哪个方法,这样做大大减少了编程. 8.2转机? 8.2.1方法调用绑定 将方法调用和方法主体关联起来被称作绑定. 后期绑定:在运行时根据对象的类型进行绑定 编译器不知道对象的类型(因为编译器只知道这是个父类,不知道是哪个子类传入的) J

java 笔记(3)多态 容易理解

多态的使用 class A1{ public void tell1(){ System.out.println("A1 -- tell1"); } } class B1 extends A1{ public void tell1(){ System.out.println("B1 -- tell2"); } } class C1 extends A1{ public void tell1(){ System.out.println("C1 -- tell3