面向对象(下)

本文详细探讨了Java中的`static`关键字,包括它如何用于修饰属性、方法和代码块,以及其加载时机和内存占用。强调了静态变量的共享特性以及静态方法的限制。同时,介绍了单例设计模式的饿汉式和懒汉式实现,讨论了它们的优缺点。此外,还涉及了代码块、final关键字、抽象类、接口和内部类的相关概念,强调了它们在实际开发中的应用。最后,提到了模板方法设计模式和面试中可能遇到的相关问题。
摘要由CSDN通过智能技术生成

static关键词的使用

1.static 静态的

2.static 可以用来修饰:属性,方法,代码块,内部类

3.使用static修饰属性:

3.使用static修饰属性:静态变量(类变量)
 3.1属性,按是否使用static修饰,又分为:静态属性vs非静态属性(实例变量)

 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套 类中的非静态属性。当修改其中一个对象中的非静态属性时,不会 导致其他对象中同样的属性值的修改。
 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变 量。当通过某一个对象修改静态变量时,会导致其他对象调用此静 态变量时,是修改过了的。

 3.2 static修饰属性的其他说明:
 3.2.1静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用

 3.2.2静态变量的加载要早于对象的创建。

 3.2.3由于类只加载一次,所以内存中只存在一次

 3.3静态变量的距离system.out.println math.pi

4.使用static修饰方法:

 1.随着类的加载而加载,可以通过"类.静态方法"的方式进行调用

  1.  静态方法 非静态方法
    类 yes no
    对象 yes yes
  2. 静态方法中,只能调用静态的方法或属性
    非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

5.static注意点:

在静态方法内不能使用this super关键词

6.开发中使用情况

开发中,如何确定一个属性是否要声明为static的?

属性是可以被多个对象所共享的,不会随着对象的不同而不同的。

开发中,如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为static的
 〉工具类中的方法,习惯上声明为static的。比如:Math,Arrays. collections

单例设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。

两种模式:饿汉式(一上来就造好对象,提供方法返回对象)

懒汉式(一开始是null用的时候才通过方法new一个对象)

单例模式的优点:
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

区分饿汉式和懒汉式

饿汉式

坏处:对象加载时间长

好处:饿汉式是线程安全的

懒汉式

好处:延迟对象的创建

坏处:目前的写法不安全---》到多线程修改

public class single {

    public static void main(String[] args) {
       Bank bank1 = Bank.getInstance();
       Bank bank2 =Bank.getInstance();
       System.out.println(bank1==bank2);
    }
}

//饿汉式
class Bank{
    //1.私有化构造器
    private Bank(){
      
    }
    //2.内部创建类的对象
    private static Bank instance =new Bank();
   
    //3.提供公共的静态的方法,返回类的对象
    public static Bank getInstance(){
       return instance;
    }
}

public class sigle2 {
    public static void main(String[] args) {
       Order order1 =Order.getInstance();
       Order order2 = Order.getInstance();
       System.out.println(order1==order2);
    }

}
//懒汉式
class Order{
    //1.私有化构造器
    private Order(){

    private static Order instance =null;
    //4.此对象也为static
    //3.声明public static 的方法返回当前类对象
    public static Order getInstance(){
       if(instance==null){
           instance =new Order();
       }
       return instance;
    }
}

代码块

1.代码块的作用:用来初始化类、对象
2.代码块如果有修饰的话,只能使用static

3.分类:静态代码块、非静态代码块
4.静态代码块

内部可以有输出语句

随着类的加载而执行,而且只执行一次

如果定义了多个代码块,按照先后顺序执行

只能调用静态的方法或者属性

作用:初始类的属性

5。非静态代码块
内部可以有输出语句
随着对象的创建而执行

每创建一次就执行一次

如果定义了多个代码块,按照先后顺序执行

方法和属性都可以调用

作用:可以在创建对象屎,对对象的属性等进行初始化

6.如果有很多父类子类代码块

由父及子 静态先行

属性赋值的位置

对属性可以赋值的顺序:

①默认初始化
②显式初始化/ ⑤在代码块中赋值(看位置前后)

③构造器中初始化
识有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值

final关键字

final可以修饰的结构:类 方法 变量

1.final修饰一个类

此类不能被其他类继承,没有子类

比如:String类 ,System类,StringBuffer类

2.final修饰一个方法

public final void method(){

}

表示不能被重写了

举例 Object类中的getClass方法

3.final修饰一个变量

修饰属性 表示变量为常量 不能修改

注意修饰属性的话不能使用默认值,要使用显式初始化、代码块初始化、构造器初始化

修饰局部变量 该局部变量不能再修改了

static final

修饰属性:全局变量

抽象类

abstract关键字

abstract可以修饰方法和类

1.abstract修饰类:抽象类

此类不能实例化

抽象类中一定有构造器,便于子类对象实例化调用

开发中,都会提供抽象类的子类,让子类实例化,完成相关操作

2.abstract修饰方法:抽象方法

抽象方法只有方法的声明

包含抽象方法的类 一定是抽象类

如果子类继承的父类有抽象类方法,则要重写或者子类也是抽象类

3.abstract注意点

不能修饰属性构造器(构造器不能重写)

不能用来修饰私有方法,静态方法(private方法不能重写),final的方法,final的类

//Employee 是抽象类
//这是声明这个数组是这个类型,没有new 对象 所以没有报错
Employee []  arr =new Employee[2];

匿名子类的对象

//Persons 是抽象类
Person p =new Person(){
    @Override
    public void eat(){
       System.out.println();
    }
}
//匿名子类的匿名对象
method1(new Person(){
    @Override
    public void eat(){
       System.out.println()}
})

模板方法设计模式

 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

 方法的算法固定,里面不同的情况可抽象,子类继承对他进行重写

接口

接口的使用

interface name {
    int value =1; //省略了public static final
    void eat();  //省略了public abstract
}

1.接口使用interface定义

2.java中,接口和类是并列的两个结构

3.如何定义接口

3.1 JDK7及以前:只能定义全局常量和抽象方法

 全局常量: public static final的(书写时可以省略)

 抽象方法:public abstract的
3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法

4.接口不能定义构造器!所以不能实例化

5.Java开发中,接口通过类去实现(implement)的方式来使用

实现类来实现接口的全部方法,则实现类可以实例化

如果没有全部覆盖接口的方法,则类为抽象类,不能实例化

6.Java类可以实现多个接口

弥补了Java单继承的局限性

class AA extends BB implements cc,dd

7.接口和接口之间可以继承,而且可以多继承

interface AA{

}
interface BB{

}
interface CC extends AA,BB{
}

8.接口的具体使用,体现多态性

9.接口,实际上可以看做一种规范

开发中,体会面向接口编程

10.接口的应用

代理模式,工厂模式(具体看文件)

11.Java8接口新特性

interface AA{
    public static void method1(){
       System.out.println();  //只能用接口.方法来调用
       }
    public default void method2(){
       System.out.println(); //通过实现类.方法来调用
       //实现类可以重写默认方法
       //如果实现类继承的父类声明了重名的方法,调用的是父类的方法
       //如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错。-->接口冲突。
这就需要我们必须在实现类中重写此方法

       }
}
 

面试题

Ball类中的play 把两个接口的play都重写了

ball 是全局变量 不能修改

编译不通过,x不明确。 如果输出 B的x 则要 super.x。要输出A的话 要A.x

如果不重名可以直接写 因为是全局变量

内部类

1.Java中允许将一个类A声明在另一个类B中,则A类是内部类,B是外部类

2.内部类的分类:成员内部类 vs 局部内部类 (方法内、代码块内、构造器内)

3.成员内部类

 3.1 作为一个类

 类内可以定义属性 方法 构造器等

 可以final修饰,表示此类不能被继承

 3.2作为成员

 可以调用外部类的结构 Name.this.xxx

 可以被static修饰

4.关注三个问题

 4.1如何实例化内部类

//静态内部类
Person.Dog dog =new Person.Dog();
//非静态内部类  要实例化对象才可以调用
Person p =new Person();
Person.bird bird =p.new Bird();

 4.2如何在成员内部类中区分调用外部类的结构

//属性重名的时候 不重名直接用就行
Person.this.name  //外部类的属性
this.name  //内部类的属性
name //方法的形参

 4.3开发中内部类的使用

 在局部内部类的方法中(比如: show)如果调用局部内部类所声明的方法(比如:method )中的局部变量要求此局部变量声明为final的。
 jdk 7及之前版本:要求此局部变量显式的声明为final的

 jdk8及之后的版本。可以省略final的声明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。   本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业面向对象课程的理想教学参考书。 第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象开发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 1.4 类到底是什么 9 1.4.1 类是对象模板 9 1.4.2 属性 11 1.4.3 方法 11 1.4.4 消息 11 1.5 使用UML完成类图建模 12 1.6 封装和数据隐藏 12 1.6.1 接口 12 1.6.2 实现 13 1.6.3 接口/实现范型的一个实际例子 13 1.6.4 接口/实现范型的模型 14 1.7 继承 15 1.7.1 超类和子类 16 1.7.2 抽象 16 1.7.3 is-a关系 17 1.8 多态 18 1.9 组合 20 1.9.1 抽象 21 1.9.2 has-a关系 21 1.10 小结 21 1.11 本章使用的示例代码 21 1.11.1 TestPerson示例:C#.NET 21 1.11.2 TestPerson示例:VB.NET 22 1.11.3 TestShape示例:C#.NET 23 1.11.4 TestShape示例:VB.NET 25 第2章 如何以对象方式思考 27 2.1 了解接口与实现之间的区别 28 2.1.1 接口 29 2.1.2 实现 29 2.1.3 接口/实现示例 29 2.2 设计接口时使用抽象思维 33 2.3 尽可能为用户提供最小接口 35 2.3.1 确定用户 35 2.3.2 对象行为 36 2.3.3 环境约束 36 2.3.4 明确公共接口 36 2.3.5 明确实现 37 2.4 小结 37 2.5 参考书目 38 第3章 高级面向对象概念 39 3.1 构造函数 39 3.1.1 何时调用构造函数 39 3.1.2 构造函数中有什么 40 3.1.3 默认构造函数 40 3.1.4 使用多个构造函数 41 3.1.5 构造函数的设计 44 3.2 错误处理 44 3.2.1 忽略问题 45 3.2.2 检查问题并中止应用 45 3.2.3 检查问题并尝试恢复 45 3.2.4 抛出异常 45 3.3 作用域概念 47 3.3.1 局部属性 48 3.3.2 对象属性 49 3.3.3 类属性 50 3.4 操作符重载 51 3.5 多重继承 52 3.6 对象操作 53 3.7 小结 54 3.8 参考书目 54 3.9 本章使用的示例代码 54 3.9.1 TestNumber示例:C#.NET 54 3.9.2 TestNumber示例:VB.NET 55 第4章 类剖析 57 4.1 类名 57 4.2 注释 58 4.3 属性 59 4.4 构造函数 60 4.5 访问方法 62 4.6 公共接口方法 63 4.7 私有实现方法 64 4.8 小结 64 4.9 参考书目 64 4.10 本章使用的示例代码 65 4.10.1 TestCab示例:C#.NET 65 4.10.2 TestCab示例:VB.NET 66 第5章 类设计指导原则 68 5.1 真实世界系统建模 68 5.2 明确公共接口 69 5.2.1 最小公共接口 69 5.2.2 隐藏实现 69 5.3 设计健壮的构造函数(和析构函数) 70 5.4 在类中设计错误处理 70 5.4.1 对类建立文档以及使用注释 71 5.4.2 构建类要以合作为出发点 71 5.5 设计时充分考虑重用 72 5.6 设计时充分考虑到可扩展性 72 5.6.1 名字要有描述性 72 5.6.2 抽出不可移植的代码 72 5.6.3 提供一种复制和比较对象的方法 73 5.6.4 让作用域尽可能小 73 5.6.5 类应当对自己负责 74 5.7 设计时充分考虑可维护性 75 5.7.1 使用迭代 76 5.7.2 测试接口 76 5.8 使用对象持久性 78 5.9 小结 79 5.10 参考书目 79 5.11 本章使用的示例代码 79 5.11.1 TestMath示例:C#.NET 79 5.11.2 TestMath示例:VB.NET 80 第6章 利用对象实现设计 81 6.1 设计指导原则 81 6.1.1 完成适当的分析 84 6.1.2 建立工作陈述 84 6.1.3 收集需求 84 6.1.4 开发用户界面的原型 85 6.1.5 明确类 85 6.1.6 确定各个类的职责 85 6.1.7 确定类如何相互合作 85 6.1.8 创建类模型来描述系统 85 6.2 案例研究:blackjack示例 86 6.2.1 使用CRC卡 87 6.2.2 明确blackjack类 88 6.2.3 明确类的职责 90 6.2.4 UML用例:明确协作关系 95 6.2.5 第一轮CRC卡 98 6.2.6 UML类图:对象模型 99 6.2.7 建立用户界面原型 100 6.3 小结 101 6.4 参考书目 101 第7章 掌握继承和组合 102 7.1 重用对象 102 7.2 继承 103 7.2.1 一般化和特殊化 105 7.2.2 设计决策 105 7.3 组合 107 7.4 为什么封装在OO中如此重要 109 7.4.1 继承如何削弱封装 109 7.4.2 多态的一个详细例子 111 7.4.3 对象职责 111 7.5 小结 115 7.6 参考书目 115 7.7 本章使用的示例代码 115 7.7.1 TestShape示例:C#.NET 115 7.7.2 TestShape示例:VB.NET 117 第8章 框架与重用:使用接口和抽象类实现设计 119 8.1 代码:重用还是不重用 119 8.2 什么是框架 119 8.3 什么是契约 121 8.3.1 抽象类 122 8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 建立契约 128 8.3.6 系统插入点 130 8.4 一个电子商务例子 130 8.4.1 电子商务问题 130 8.4.2 非重用的方法 131 8.4.3 一个电子商务解决方案 133 8.4.4 UML对象模型 133 8.5 小结 137 8.6 参考书目 137 8.7 本章使用的示例代码 138 8.7.1 TestShape示例:C#.NET 138 8.7.2 TestShape示例:VB.NET 140 第9章 构建对象 143 9.1 组合关系 143 9.2 分阶段构建 144 9.3 不同类型的组合 146 9.3.1 聚集 146 9.3.2 关联 146 9.3.3 结合使用关联和聚集 148 9.4 避免依赖性 148 9.5 基数 149 9.5.1 多个对象关联 151 9.5.2 可选关联 151 9.6 集成示例 152 9.7 小结 152 9.8 参考书目 153 第10章 用UML创建对象模型 154 10.1 什么是UML 154 10.2 类图的结构 155 10.3 属性和方法 156 10.3.1 属性 156 10.3.2 方法 157 10.4 访问指示 157 10.5 继承 158 10.6 接口 159 10.7 组合 160 10.7.1 聚集 160 10.7.2 关联 161 10.8 基数 161 10.9 小结 162 10.10 参考书目 163 第11章 对象和可移植数据:XML 164 11.1 可移植数据 164 11.2 XML 165 11.3 XML与HTML 166 11.4 XML和面向对象语言 166 11.5 两个公司间共享数据 167 11.6 用DTD验证文档 168 11.7 将DTD集成到XML文档 170 11.8 使用层叠样式表 175 11.9 小结 177 11.10 参考书目 177 第12章 持久对象:串行化和关系数据库 178 12.1 持久对象基础 178 12.2 将对象保存到平面文件 179 12.2.1 串行化文件 180 12.2.2 再谈实现和接口 182 12.2.3 方法如何保存 183 12.3 串行化过程中使用XML 183 12.4 写到关系数据库 186 12.5 加载驱动程序 189 12.5.1 建立连接 189 12.5.2 SQL语句 190 12.6 小结 192 12.7 参考书目 192 12.8 本章使用的示例代码 192 12.8.1 Person类示例:C#.NET 193 12.8.2 Person类示例:VB.NET 195 第13章 对象与因特网 197 13.1 分布式计算的演进 197 13.2 基于对象的脚本语言 197 13.3 JavaScript验证示例 200 13.4 Web页面中的对象 202 13.4.1 JavaScript对象 202 13.4.2 Web页面控件 204 13.4.3 声音播放器 205 13.4.4 电影播放器 205 13.4.5 Flash 206 13.5 分布式对象和企业 206 13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web服务定义 210 13.5.3 Web服务代码 213 13.5.4 Invoice.cs 214 13.5.5 Invoice.vb 215 13.6 小结 216 13.7 参考书目 216 第14章 对象和客户/服务器应用 217 14.1 客户/服务器方法 217 14.2 专有方法 217 14.2.1 串行化对象代码 218 14.2.2 客户代码 218 14.2.3 服务器代码 220 14.2.4 运行专有的客户/服务器示例 222 14.3 非专有方法 223 14.3.1 对象定义代码 223 14.3.2 客户代码 224 14.3.3 服务器代码 225 14.3.4 运行非专有的客户/服务器示例 227 14.4 小结 228 14.5 参考书目 228 14.6 本章使用的示例代码 228 14.6.1 客户/服务器示例——VB.NET:对象定义代码 228 14.6.2 客户/服务器示例——VB.NET:客户代码 229 14.6.3 客户/服务器示例——VB.NET:服务器代码 230 第15章 设计模式 232 15.1 为什么研究设计模式 232 15.2 Smalltalk的模型/视图/控制器 233 15.3 设计模式的不同类型 234 15.3.1 创建型模式 235 15.3.2 结构型模式 239 15.3.3 行为型模式 241 15.4 反模式 242 15.5 小结 243 15.6 参考书目 243 15.7 本章使用的示例代码 243 15.7.1 C#.NET 244 15.7.2 VB.NET 247 索引 250
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值