`
_kudy
  • 浏览: 16618 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javase_07(继承与设计模式)

 
阅读更多

/*
     子类对象的实例化过程
     我们可以用一个类的变量记住它的子类的子类的实例.这时如果调用子类中的方法,只需要强制转换子类就可以
     没必要非得强制转换子类的子类.
     instanceof关键字:也可以判断子类实例也属于父类的类型.
 */
 
 class A
 {
     A()
     {
         //如果程序没有写构造方法的/java会默认给它添加构造方法!
     }
     public void a()
     {
             System.out.println("a() in A");
     }
 }
 
 class B extends A
 {
     B()
     {
         super(); //默认调用父类的无参的构造方法!
     }
     public void a()
     {
             System.out.println("a()in B");
     }
 
     public void b()
     {
             System.out.println("b()in B");
     }
 
 }
 
 class C extends B
 {
     public void a()
     {
             System.out.println("a()in C");
     }
     public void b()
     {
             System.out.println("b()in C");
     }
     public void c()
     {
             System.out.println("C()int C");
     }
 }
 class Demo 
 {
     public static void main(String[] args) 
     {
         A a = new C();
         if(a instanceof C)
         {
             C c =(C)a;
             c.c();
         }
         if(a instanceof B)
         {
             B b = (B)a;
             b.b();
         }
     }
 }
 /*
    继承的细节
.子类不会继承与父类的私有的成员
.构造函数是不会被继承.
.只支持单继承,可以多重继承.

    ------------------
.以后在设计一个类的时候,父类一定要加上一个不带参数的super,否则子类实例化的时候会报错!
    为什么有这样一个机制:
    解答:别人来继承与这样一个类,一定也需要这个子类具有父类的方法.但是别人并不知道在构造函数里面做了一些特别才能实现这个
    的功能.所以java就规定子类实例化的过程中.一定会默认调用与父类的super()的构造方法.如果你在父类中没有定义一个无参的.
    那么在实例化的过程中是会容易出错的.
*/

class Person
{
    private String name ;
    public Person(String name)
    {
        this.name = name;
    }
    public  Person()
    {
            //咱们加一个无参的构造方法!
    }
    public    void eat()
    {
            System.out.println("是人都要吃东西!");
    }

}

class Student extends Person
{    
    public Student()
    {
        //不带参数的构造函数!
        super(); //默认为这个?  但是有这个父类的构造函数吗?显然没有对吧.。
    }
    public void eat()
    {
            System.out.println("抽一根");
            super.eat();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Student st = new Student();
        st.eat();
    }
}

 /*

    子类的实例化过程:子类在创建做了什么事情呢?
    解答:在创建子类的时候,会调用子类的构造函数,在子类构造函数的第一行会默认调用父类的构造函数
                在子类构造函数中如果没有显式地调用父类的构造函数.它会自动的调用父类的无参的构造函数(在这个问题上你要注意)
            我们可以在构造函数中使用this(实参)来调用自己的带参数的构造方法
            还可以用super(实参)去调用父类型的带了参数的构造方法/
            但要注意:this 与super()只能出现一次.  并且在第一行.
            如果一个构造函数调用了this ,那么就不能从第二个语句使用super()
*/


class Person
{
    private String name ;
    public Person()
    {
            System.out.println("无参的Person()被调用啦!");
    }
    public Person(String name )
    {
        this();
        System.out.println("有参的Person()被调用啦!");
        this.name = name;
    }

}

class Student extends Person
{
    private String name;
    public Student()
    {
            super("kudy");
            System.out.println("无参的Student()被调用啦~");
    }
    public Student(String name)
    {
            this();  //与super()不能同时出现
            System.out.println("有参的Student()被调用啦~");
    }

}

class Demo 
{
    public static void main(String[] args) 
    {
        new Student("abc");
    }
}


/*

输出的结构为:
--------------------------------
无参的Person()被调用啦!
有参的Person()被调用啦!
无参的Student()被调用啦~
有参的Student()被调用啦~
*/

 /*

    关于多态:
                不变应万变
*/

abstract class Person
{
    public abstract void eat();
}

class Chinese extends Person
{
    public void eat()
    {
            System.out.println("中国的人还是广东人最好啦!");
    }
}
class Shop
{
    public void shopping(Person p )
    {
            System.out.println("咱们去买好东西吃!");
            p.eat();
    }
}
class Demo
{
    public static void main(String[] args) 
    {
        Shop shop = new Shop();
        shop.shopping(new Chinese());

    }
}

 /*

    子类实例化的面试题!
    A1 B2 B1
*/

class A
{
    String name = "张三";
    public A()
    {
            System.out.println("A1");  //A1
    }
    public A(String name)
    {
        this();    
        System.out.println("A2");
    }
}

class B extends A
{
    String name = "王五";
    public B()
    { 
            this("张");  //如果有了this 就是默认没了super()
            System.out.println("B1");
    }
    public B(String name)
    {
    //    super();
        System.out.println("B2"); //B2
    }
}

class Demo 
{
    public static void main(String[] args) 
    {
        new B();
    }
}

 /*

    覆盖父类的方法:
    子类当中覆盖父类的方法必须要和父类具有相同的方法名,具有相同的参数类型,具有相同的返回值 返回值类型一定要和
    子类的保持一直.这样就是方法的重写
    子类的方法的权限不能比父类有更严格的访问权限,因为我们经常要把子类当做父类来使用.
    子类去访问父类的方法时,会比较一下子类的访问权限.如果权限比父类小.那么就挂啦

    多态: 把子类当做父类来使用,针对父类进行方法的调用.传入不同的子类.执行的结构是一样的.
    除非父类被子类这个哥们重写啦方法~
*/
class Person
{
    public void run()
    {
            System.out.println("run() in Person");
    }
    public Person getInstance()
    {
            return new Person();
    }
}

class Student extends Person
{
    public void run()
    {
            System.out.println("happy");
            super.run(); //调用了父类的run方法!
    }
    public  Student getInstance() //权限不应该比父类的要小.  如果权限要比父类的小.那么就OH.Sorry
    {
        return new Student();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Student stu = new Student();
        stu.run();
        run(stu);
    }
    //实现了多态!
    public static void run(Person p )
    {
         p = p.getInstance();
        p.run(); //实现了多态
    }
}

 /*

final 关键字:最终的!终态的
.被fina修饰的属性为常量,是不能被更改的.也就是说:值是不能被改变
.final所修饰的方法不能被重写,也就是说不能被子类所覆盖
.final修饰所修饰的类是不能被继承的!

一般fina的用法:public static fina String NAME = "kudy"; 
为什么它一般是和static一起的呢?
解答:
既然一个属性都不能被修改啦.是一个常量啦.咱们可以把他定义一个static的.在类出生的时候.它也会跟着出生.
方便.
*/
/*
final class Person
{
    //被final所修饰的类是不能被继承的!
}
*/
class Person
{
    public static final int NUM = 19 ;//给我修饰的常量是不能被修改的!
    public final void show()
    {
            System.out.println("给我修饰的方法都是不能被重写!");
    }
}
class Student extends Person
{
    /*
    public void show()
    {
            System.out.println("真的是不能被重写噢!");
    }
    */
    public void run (int num)
    {
        //先比较后自加!
        System.out.println(++num);
        System.out.println(num++); 
        //? 为多少呢?  20  //因为第一次自加1  后来第二次的时候。先输出值它自己再加1
    }
}
class  Demo
{
    public static void main(String[] args) 
    {
        Student stu = new Student();
        stu.run(stu.NUM);
    }
}

 /*

    设计模式!组合
    组合:当一个对象在运作的过程中必须要用到另外一个对象的时候,然而又不是构成继承的关系的!
*/
class Guo
{
    public void heat()
    {
            System.out.println("已经自动的加热啦~");
    }
}
class Chef
{
    //吃食品的时候一定要把它加热嘛~~
    Guo guo;
    Chef(Guo guo)
    {
        this.guo = guo;
    }
    public void cook()
    {
        guo.heat();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Chef chef = new Chef(new Guo());
        chef.cook();
    }
}

 /*

    这样也是一个简单的组合!
*/
class Card
{
    public void spend()
    {
            System.out.println("一不小心就花了600RMB");
    }
}

class Person
{
    Card card ;
    public Person(Card card)
    {
        this.card = card;
    }
}

class Chinese extends Person
{
    public Chinese(Card card)
    {
        super(card);
    }
}

class Shop
{
    public void Shopping(Person p )
    {
        System.out.println("happy完毕!");
        p.card.spend();
    }
}

class  Demo
{
    public static void main(String[] args) 
    {
        Shop shop = new Shop();
        shop.Shopping(new Chinese(new Card()));
    }
}

 /*

    抽象类:
.没有方法体必须要声明为abstract抽象方法
.含有抽象方法的类一定是抽象类
.抽象类的定义:用abstract修饰的类叫做抽象类
.抽象类是不能被实例化的(也就是说不能创建对象!);
.可以用一个抽象类来继承一个抽象类.会继承所有的方法
.如果用一个类来继承抽象类,那么必须要实现抽象类里面所有的方法
.抽象类的访问权限没有什么特殊之处.主要是看修饰符!
.抽象类里面不一定有抽象方法.但是包含有抽象方法一定是抽象类
*/

abstract class A
{
    abstract void a();//抽象方法!
    public void run()
    {
            System.out.println("A run()");
    }
}

abstract class B extends A
{
    abstract void b();
}

class C extends B
{
    //必须要把它所继承的所有的抽象方法实现!
    public void a()
    {
            System.out.println("A.class");
    }
    public void b()
    {
            System.out.println("B.class"); //实现B
    }
}
class  Demo
{
    public static void main(String[] args) 
    {
        A a = new C();
        if(a instanceof C)
        {
            C c = (C)a;
            c.a();
            c.b();
            c.run();
        }
    }
}

 /*

    抽象类:
.没有方法体必须要声明为abstract抽象方法
.含有抽象方法的类一定是抽象类
.抽象类的定义:用abstract修饰的类叫做抽象类
.抽象类是不能被实例化的(也就是说不能创建对象!);
.可以用一个抽象类来继承一个抽象类.会继承所有的方法
.如果用一个类来继承抽象类,那么必须要实现抽象类里面所有的方法
.抽象类的访问权限没有什么特殊之处.主要是看修饰符!
.抽象类里面不一定有抽象方法.但是包含有抽象方法一定是抽象类
*/

abstract class A
{
    abstract void a();//抽象方法!
    public void run()
    {
            System.out.println("A run()");
    }
}

abstract class B extends A
{
    abstract void b();
}

class C extends B
{
    //必须要把它所继承的所有的抽象方法实现!
    public void a()
    {
            System.out.println("A.class");
    }
    public void b()
    {
            System.out.println("B.class"); //实现B
    }
}
class  Demo
{
    public static void main(String[] args) 
    {
        A a = new C();
        if(a instanceof C)
        {
            C c = (C)a;
            c.a();
            c.b();
            c.run();
        }
    }
}

 //甲写的代码

class C
{
    public void run(A a)
    {
        a.c();
    }
}
abstract class A
{
    abstract void a();
    abstract void b();
    abstract void c();  //我这里有一个C是被子类所重写啦!
    abstract void d();
    abstract void e();
    abstract void f();
}

abstract class AbstractB extends A  //需要我都可以实现!但是我用到这种方式!
{
    public void a()
    {

    }
    public void b()
    {

    }
    public void c() //哥们.你也有啊!是不是OH啦
    {

    }
    public void d()
    {

    }
    public void e()
    {

    }
    public void f()
    {

    }
}
class B extends A
{
    public void a()
    {

    }
    public void b()
    {

    }
    public void c() //哥们.你也有啊!是不是OH啦
    {
            System.out.println("c() in B");
    }
    public void d()
    {

    }
    public void e()
    {

    }
    public void f()
    {

    }
}

class  Demo
{
    public static void main(String[] args) 
    {
        /*
        C c = new C();
        c.run(new B());
        */
        C  c = new C();
        //为什么抽象的都可以new呢?但要注意.我这个是匿名内部类
        c.run(new AbstractB(){
            public void c()
            {
                    System.out.println(" AbstractB in C");
            }
        }
            );
    }
}

 /*

    模板方法的设计模式:
    定义一个抽象类作为模板,将具体做事情方法定义出来,但是不实现
.对外提供一个共有的方法作为接口,规定做事情的顺序/这个方法应该为final 避免了让子类重写
    子类继承模板,实现所有的抽象方法()
*/

abstract class AbatractPrint
{
    abstract void opend();
    abstract void print();
    abstract void close();

    //定义成终态的.避免了子类所修改!
    public final void run()
    {
        this.opend();
        print();
        close();  //调用方法!
    }
}

class StringPrint extends AbatractPrint
{
    private String data;
    StringPrint(String data)
    {
        this.data = data;
    }
    public void opend()
    {
            System.out.print("<<");
    }
    public void print()
    {
            System.out.print(data);
    }
    public void close()
    {
            System.out.print(">>");
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        AbatractPrint abatractPrint = new StringPrint("kudy");
        abatractPrint.run();
        //使用匿名内部类做一下这道题目!
        //我现在不是为了抽象类创建对象.而是为了匿名子类!  //也多多态的一种形式!
        //匿名内部类重写了父类的方法!并且调用一把run();
        new AbatractPrint(){
                public void opend()
        {
                System.out.print("<<");
        }
        public void print()
        {
                System.out.print("show");
        }
        public void close()
        {
                System.out.print(">>");
        }
        }.run();
    }
}

 //定义抽象类作为接口,实现个模块之间的解耦

/*
        首先第一种方法的:  显示就是三个人不能同时分工协作啦~~

        咱们传入的时候要注意:  我们传入的是子类.  父类型的引用指向了子类型的对象。
*/
//定义一个抽象的数据产生器!
import java.io.*;
abstract class Generator
{
    abstract String getData();
}

//定义一个抽象的数据处理器
abstract class  DataHandler
{
    abstract String    handleData(Generator generator);
}

//甲负责写数据产生器
class OneGenerator extends Generator
{
    public String getData()
    {
            return "hello";  //产生了一个数据!
    }
}

//乙所负责写的数据处理代码
class OneDataHandler extends DataHandler
{
    public String  handleData(Generator generator)
    {
        String data = generator.getData();
        return  "~~"+data+"~~"; 
    }
}

//数据产生器!
class TwoGenerator extends Generator
{
    public String getData()
    {
        return "小细加油";
    }
}

//数据处理器!
class TwoDataHandler extends DataHandler
{
    public String     handleData(Generator generator)
    {
        String data = generator.getData();
        return "~~~"+data+"~~~";
    }
}


/*
    数据显示!
*/
class Demo 
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader br 
                            = new BufferedReader(new InputStreamReader(System.in));
        /*
        DataHandler data = new OneDataHandler();
        Generator gen = new OneGenerator();
        */
        //通过读取键盘获得用户使用的数据产生器名字
        System.out.println("请输入您使用的数据产生器:");
        String generatorClassName = br.readLine();
        //根据类名反射出类
        //Class class -->new Class()对象 --》class.Class
        //1-1根据类名反射出类!
        Class generatorClazz = Class.forName(generatorClassName);  //类
        //又因为返回的是object 类型/所以我们要强制转换.否则没有办法赋值。
        //根据类创建实例对象(数据产生器)
         Generator  generator=( Generator) generatorClazz.newInstance(); //类创建对象。并且是父类型的引用指向子类型的对象。

         //2.通过反射获得数据的处理器对象
         System.out.println("请输入您要使用的数据处理器:");
         String dataHandlerClassName = br.readLine();
         Class dataHandlerClazz = Class.forName(dataHandlerClassName);
         DataHandler dataHandler = (DataHandler)dataHandlerClazz.newInstance();
        String data = dataHandler.handleData(generator);
        System.out.println(data);
    }
}
 
分享到:
评论

相关推荐

    ATM_javase_

    8. **设计模式**:虽然这是一个简单的项目,但可以引入一些基本的设计模式,如工厂模式用于创建不同类型的账户,策略模式用于处理不同的利率计算等。 9. **单元测试**:为了确保代码的正确性,可以使用JUnit等工具...

    JavaSE_all

    7. Java企业级应用开发章节介绍了一系列Java EE相关的技术,如JDBC(Java数据库连接)、JSP(JavaServer Pages)、Servlet、JavaBean、HTML、JavaScript、MVC设计模式以及用于开发和部署Java EE应用的服务器软件(如...

    shuz_jjsc_jsp_javase_

    在本案例中,javabean可以设计为包含四个属性(加、减、乘、除)以及对应的操作方法,以便进行四则运算。用户输入的数字会被转化为javabean的属性,然后调用相应的方法进行计算。 接下来,我们来谈谈JSP(Java...

    公司级代码javaSE_EE源代码(三年工作经验)

    1. 面向对象设计:包括类、对象、继承、多态、接口等概念的实现,以及设计模式的应用,如单例、工厂、观察者模式等。 2. 集合框架:ArrayList、LinkedList、HashMap、TreeMap等各种数据结构的使用,以及它们在实际...

    javase子类父类继承关系图解

    在Java编程语言中,继承是面向对象特性的重要组成部分,它允许子类继承父类的属性和方法,...同时,这也为实现设计模式如工厂模式、单例模式等奠定了基础。在实际开发中,掌握这些概念有助于写出更高效、可维护的代码。

    JavaSE进阶 面向对象继承

    JavaSE进阶面向对象继承 继承是Java语言中的一种机制,允许一个类继承另一个类的特征和行为。继承的优点是可以提高代码的可重用性,减少代码冗余,提高开发效率。 1. 继承的定义:继承是指一个类继承另一个类的...

    JAVASE_Notes:来自itheima黑马的JavaSE基础笔记

    14. **设计模式**:笔记可能会提及一些常见的设计模式,如单例模式、工厂模式、观察者模式等,这些模式是解决软件设计问题的通用解决方案。 15. **注解(Annotation)**:注解是Java 5引入的新特性,可以向编译器或...

    0-JavaSE课程介绍

    - 反射机制和设计模式的扩展知识。 #### 三、总结 JavaSE作为Java技术体系中的核心部分,不仅提供了学习JavaEE的基础,也为后续深入到其他领域(如Android应用开发)打下了坚实的技术根基。通过本课程的学习,...

    JavaSE25套习题(含答案)

    15. **设计模式**:单例、工厂、观察者、装饰者等设计模式是解决常见问题的标准方案,熟悉这些模式能够提高代码质量。 通过完成这25套习题,开发者不仅可以加深对JavaSE的理解,还能发现自己的薄弱环节,有针对性地...

    JavaSE常用知识代码实现

    10. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式等,这些模式在实际开发中有着广泛的应用。 11. **JNI(Java Native Interface)**:允许Java代码调用C/C++原生代码,提供了Java与其他语言交互...

    javase阶段15个实战项目代码

    8. 设计模式:项目可能包含对单例、工厂、观察者等常见设计模式的应用,这些模式在解决特定编程问题时非常有用。 9. 异常处理:了解如何正确地捕获和处理异常,这是编写健壮代码的关键。 10. 注解与反射:通过使用...

    javase笔记.7z

    以上只是JavaSE部分核心知识点的概述,实际的“javase笔记.7z”文件可能包含更详细的讲解,如设计模式、JVM原理、并发编程进阶等内容。学习JavaSE不仅需要掌握这些基础知识,还要通过实践不断深化理解,才能成为一名...

    javase与javaweb笔记

    5. **MVC(Model-View-Controller)架构**:常见的Web应用设计模式,用于分离业务逻辑、视图和控制层。 6. **JDBC(Java Database Connectivity)**:数据库连接和操作,包括数据库连接池管理。 7. **EJB...

    javaSE项目

    6. **项目组织与管理**:一个完整的项目会包含良好的代码结构和模块化设计,遵循一定的设计模式,比如单例模式、工厂模式等。此外,版本控制系统如Git的使用,Maven或Gradle构建工具的集成,以及单元测试和集成测试...

    Studentmanger.zip_javase基础

    10. **设计模式**:虽然对于初级项目可能不会深入,但理解单例模式(用于管理全局资源)或工厂模式(用于对象创建)等基础设计模式会提升代码的结构和可扩展性。 通过这个项目,初学者可以学习到Java语言的基本语法...

    javase 版的QQ源码

    - **面向对象编程**:QQ源码中的主要设计模式是面向对象,包括类的设计、封装、继承和多态等概念。 - **异常处理**:程序中应有对各种可能异常的捕获和处理,确保程序的健壮性。 - **集合框架**:如ArrayList、...

    javaSE javaEE oracle 初学必备

    对于JavaEE,你需要了解其架构和生命周期,学习如何使用Servlet和JSP来处理HTTP请求和响应,理解MVC(模型-视图-控制器)设计模式。此外,EJB允许开发者创建可重用的业务组件,而JPA则是处理数据持久化的主要工具,...

    非常详细javaSE学习笔记.rar

    16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。 17. **JVM内部机制**:虚拟机内存结构,类加载机制,字节码执行,性能优化等方面的知识。 这份...

Global site tag (gtag.js) - Google Analytics