- 浏览: 16618 次
- 性别:
- 来自: 广州
最新评论
/* 子类对象的实例化过程 我们可以用一个类的变量记住它的子类的子类的实例.这时如果调用子类中的方法,只需要强制转换子类就可以 没必要非得强制转换子类的子类. 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); } }
发表评论
-
javase_22(TCP的理解)
2012-09-02 19:43 649TCP传输 Socket(客户端)和ServerSocket( ... -
javase_21(DUp的学习-->*)
2012-08-30 00:45 730Socket网络编程 网络协议 IP地址与端口号 本 ... -
javase_20(Awt初步认识)
2012-08-27 01:00 1031多线程的再度复习.class package com.jav ... -
javase_19(多线程)
2012-08-24 23:32 877进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次 ... -
javase_18(回顾与反射机制学习)
2012-08-20 11:58 464AM上午总结: package com.ja ... -
javase_17(IO的总结)
2012-08-20 11:55 1071所有的流在使用完毕时,都需要调用close方法进行关流,释放资 ... -
javase_16(其它流)
2012-08-20 11:52 915IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_16(其它流)
2012-08-20 11:38 0IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_15(File类的应用)
2012-08-19 00:07 904File类:用来将文件或者 ... -
javase_14(字节流)
2012-08-19 00:00 727字节流的抽象基类: InputStream(输入) ... -
javase_13(字符流)
2012-08-19 00:00 627IO(Input OutPut)流 IO流用来处理设备 ... -
javase_12(集合+时间对象)
2012-08-19 00:00 585Map集合 1.Map存储了一系列键值的映射关系2.M ... -
javase_11(集合的理解)
2012-08-19 00:00 890集合类: 为什么使 ... -
javase_10(String类日常操作)
2012-08-18 09:40 843第一: package com.ja ... -
javase_09(面向对象总结)
2012-08-18 09:39 918Java的环境配置 day01 1. 环 ... -
javase_08(基础面试题)
2012-08-18 09:38 766面试题:请说说抽象类和接口的区别 抽象类,使用abstrac ... -
javase_06(面向对象)
2012-08-18 09:29 707/* 内部类: .在类中定义的类我们称之为内部类, ... -
javase_05(面向对象)
2012-08-16 11:25 0一.构造函数的定义与 ... -
javase_05(面向对象)
2012-08-16 11:22 834一.构造函数的定义与作用 1.函数的名次与类同名2.没有 ... -
javase_04(面向对象)
2012-08-16 11:21 562面向对象:一种编程思想,使用对象来描述生活中的事物:面向对象的 ...
相关推荐
8. **设计模式**:虽然这是一个简单的项目,但可以引入一些基本的设计模式,如工厂模式用于创建不同类型的账户,策略模式用于处理不同的利率计算等。 9. **单元测试**:为了确保代码的正确性,可以使用JUnit等工具...
7. Java企业级应用开发章节介绍了一系列Java EE相关的技术,如JDBC(Java数据库连接)、JSP(JavaServer Pages)、Servlet、JavaBean、HTML、JavaScript、MVC设计模式以及用于开发和部署Java EE应用的服务器软件(如...
在本案例中,javabean可以设计为包含四个属性(加、减、乘、除)以及对应的操作方法,以便进行四则运算。用户输入的数字会被转化为javabean的属性,然后调用相应的方法进行计算。 接下来,我们来谈谈JSP(Java...
1. 面向对象设计:包括类、对象、继承、多态、接口等概念的实现,以及设计模式的应用,如单例、工厂、观察者模式等。 2. 集合框架:ArrayList、LinkedList、HashMap、TreeMap等各种数据结构的使用,以及它们在实际...
在Java编程语言中,继承是面向对象特性的重要组成部分,它允许子类继承父类的属性和方法,...同时,这也为实现设计模式如工厂模式、单例模式等奠定了基础。在实际开发中,掌握这些概念有助于写出更高效、可维护的代码。
JavaSE进阶面向对象继承 继承是Java语言中的一种机制,允许一个类继承另一个类的特征和行为。继承的优点是可以提高代码的可重用性,减少代码冗余,提高开发效率。 1. 继承的定义:继承是指一个类继承另一个类的...
14. **设计模式**:笔记可能会提及一些常见的设计模式,如单例模式、工厂模式、观察者模式等,这些模式是解决软件设计问题的通用解决方案。 15. **注解(Annotation)**:注解是Java 5引入的新特性,可以向编译器或...
- 反射机制和设计模式的扩展知识。 #### 三、总结 JavaSE作为Java技术体系中的核心部分,不仅提供了学习JavaEE的基础,也为后续深入到其他领域(如Android应用开发)打下了坚实的技术根基。通过本课程的学习,...
15. **设计模式**:单例、工厂、观察者、装饰者等设计模式是解决常见问题的标准方案,熟悉这些模式能够提高代码质量。 通过完成这25套习题,开发者不仅可以加深对JavaSE的理解,还能发现自己的薄弱环节,有针对性地...
10. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式等,这些模式在实际开发中有着广泛的应用。 11. **JNI(Java Native Interface)**:允许Java代码调用C/C++原生代码,提供了Java与其他语言交互...
8. 设计模式:项目可能包含对单例、工厂、观察者等常见设计模式的应用,这些模式在解决特定编程问题时非常有用。 9. 异常处理:了解如何正确地捕获和处理异常,这是编写健壮代码的关键。 10. 注解与反射:通过使用...
以上只是JavaSE部分核心知识点的概述,实际的“javase笔记.7z”文件可能包含更详细的讲解,如设计模式、JVM原理、并发编程进阶等内容。学习JavaSE不仅需要掌握这些基础知识,还要通过实践不断深化理解,才能成为一名...
5. **MVC(Model-View-Controller)架构**:常见的Web应用设计模式,用于分离业务逻辑、视图和控制层。 6. **JDBC(Java Database Connectivity)**:数据库连接和操作,包括数据库连接池管理。 7. **EJB...
6. **项目组织与管理**:一个完整的项目会包含良好的代码结构和模块化设计,遵循一定的设计模式,比如单例模式、工厂模式等。此外,版本控制系统如Git的使用,Maven或Gradle构建工具的集成,以及单元测试和集成测试...
10. **设计模式**:虽然对于初级项目可能不会深入,但理解单例模式(用于管理全局资源)或工厂模式(用于对象创建)等基础设计模式会提升代码的结构和可扩展性。 通过这个项目,初学者可以学习到Java语言的基本语法...
- **面向对象编程**:QQ源码中的主要设计模式是面向对象,包括类的设计、封装、继承和多态等概念。 - **异常处理**:程序中应有对各种可能异常的捕获和处理,确保程序的健壮性。 - **集合框架**:如ArrayList、...
对于JavaEE,你需要了解其架构和生命周期,学习如何使用Servlet和JSP来处理HTTP请求和响应,理解MVC(模型-视图-控制器)设计模式。此外,EJB允许开发者创建可重用的业务组件,而JPA则是处理数据持久化的主要工具,...
16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。 17. **JVM内部机制**:虚拟机内存结构,类加载机制,字节码执行,性能优化等方面的知识。 这份...