`
long_yu2
  • 浏览: 311770 次
社区版块
存档分类
最新评论

单例类、final、抽象类

    博客分类:
  • java
阅读更多

前些日子一直没写博客,因为病了,所以就耽误了,现在好点了要继续了;下面先写单例类了:

单例设计模式:解决一个类在内存中只存在一个对象。

单例(Singleton)类:如果一个类始终只能创建一个实例.
想要保证对象的唯一:

1.禁止其他程序自由创建对象:将构造方法私有化,使用private修饰。

2.为了让其他程序可以访问到该类对象,只能在本类定义一个对象:在类中创建一个本类对象。

3.为了方便其他程序对该对象的访问,可以对外提供访问方法:提供一个public方法可以获取该对象
饿汉式:不管你用不用,一开始就建立单例对象,即先初始化对象。
     开发一般使用此写法,安全性 
 
   private static Single s=new Single();//初始化对象

 private Single(){}

     public static Single getInstance(){

  return s;

 }


2.懒汉式:使用时才建立对象,是延迟加载。

      private static Single1 s=null;

      private Single1(){}

  public static Single1 getInstance(){

                if(s==null){

       s=new Single1();

        }
 
   return s;

    }


 final关键字可用于修饰类、变量和方法,用于表示它修饰的类、变量和方法不可改变。
 final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。

当用final修饰基本类型变量时,不能对基本类型变量重新赋值,即基本类型变量的值不能被改变

 final修饰成员变量
 
               类变量:当类初始化时,系统会为类变量分配内存,并赋默认值。
                       当创建对象时,系统会为该对象的实例属性分配内存,并赋默认值。

  final修饰的类变量、实例变量能指定初始值的地方如下:

      类变量:静态初始化块或声明该属性时指定初始值。

     实例变量:非静态初始化块、声明该属性时或构造方法中指定初始值。

实例属性不能在静态初始化块中指定初始值,因为静态初始化块是静态成员,不可访问实例属性—非静态成员;类属性不能在普通初始化块中指定初始值,因为类属性在类初始化阶段已经被初始化了,普通初始化块不能对其重新赋值。
public class Test{

 final int age;

 {

  System.out.println(age);//编译出错

  age=6;

  System.out.println(age);

 }

 public static void main(String[] args){

  new Test();
 }

如果打算在构造方法、初始化块中对final成员变量进行初始化,则不要在初始化之前就访问成员变量的值。


使用final修饰局部变量:
可以在定义时指定默认值,则后面代码中不能再对该变量赋值。
如果在定义时没有指定默认值,则可在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值。

引用类型变量保存的是一个引用,final只保证这个引用(地址)不会改变,即一直引用同一个对象,但这个对象可以发生改变。


  final修饰的方法不可被重写,如果出于某些原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法。final修饰的方法仅仅是不能被重写,并不是不能被重载。

 final修饰的类不可有子类。例如,java.lang.Math类就是一个final类,它不可以有子类。


Java中,这种没有方法体的方法称为抽象方法。

抽象方法声明格式:
[修饰符] abstract  返回值类型 方法名([形式参数表]);

抽象方法的特点:
抽象方法的返回值类型前有关键字abstract;
抽象方法没有方法体;
抽象方法的定义是一行单独语句,以分号结束;
在抽象方法声明中使用static修饰符是错误的。
例如,public abstract double area();


类中如果定义了抽象方法,这个类必须定义为抽象类。

      [public]  abstract  class 类名{

            //类体(属性、非抽象方法、抽象方法、构造方法)

            //类体(初始化块、内部类、枚举类)
   
      }


抽象类不能创建自己的对象,使用new创建抽象类对象将产生错误。

子类继承抽象类时,应该覆盖抽象类中的所有抽象方法,否则子类也必须定义为抽象类。

含有抽象方法的类(包括直接定义了一个抽象方法;继承了一个抽象父类,但没有完全实现父类包含的抽象方法)只能被定义成抽象类。但抽象类中却不一定包含抽象方法。


public abstract class Shape{

      public abstract double calcArea();

      public Shape(){}

      public Shape(String name){//构造方法不用于创建Shape对象,而是用于被子类调用

 System.out.println(name+ " Shape Created");

      }

      public String toString(){

 System.out.println(“this is Shape!”);

      }

}

public class Circle extends Shape{

      public float r;

      private final float PI=3.14;

      public Circle(String name,float r){

       super(name);

       this.r=r;

      }

      public float calcArea(){//子类Circle,必须重写Shape类中的抽象方法 ,否则Circle就是一个抽象类

 


       return PI*r*r;

      }

}


final和abstract永远不能同时使用。

abstract不能用于修饰属性,不能用于修饰局部变量,即没有抽象变量、没有抽象属性等说法;
abstract也不能用于修饰构造方法,没有抽象构造方法。抽象类里定义的构造方法只能是普通构造方法。

static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。

abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限


抽象类不能实例化,但抽象类可作为变量的类型和方法形参类型,可将抽象类子类的对象赋给该变量或做方法的实参。
例如,
Shape s=new Rectangle();
public static String ShowShapinfo(Shape  item){
      if(item instanceof Rectangle){
                    Rectangle r=(Rectangle)item; //其他代码
      }
}

分享到:
评论

相关推荐

    观看韩顺平学习整理java的笔记到异常

    抽象类--模板设计模式 9 接口 9 内部类 11 匿名内部类的使用(重要!!!!!!!) 13 成员内部类的使用 13 静态内部类的使用 14 枚举的二种实现方式 14 自定义类实现枚举 14 使用 enum 关键字实现枚举注意事项 15 enum 用...

    【05-面向对象(下)】

    •接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。 接口与抽象类的区别 •接口里只能包含抽象方法,不同包含已经提供实现的方法;抽象类则完全可以包含普通...

    php5 类与对象

    PHP 抽象方法与抽象类 abstract 关键字 16. PHP 对象克隆 clone 关键字与 __clone() 方法 17. PHP 对象的存储与传输(序列化 serialize 对象) 18. php 设计模式:工厂模式和单例模式 19.对象对象迭代 20 this...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    logo 14模板方法模式:抽象类定义final方法模板方法模式:抽象类定义final方法 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第15页。 logo 15观察者模式:观察者接口和类、主题接口...

    Java语言面向对象上册教程

    14.10 抽象方法/抽象类 99 14.11 final的用法 108 14.12 租赁系统 111 14.13 继承的本质 121 14.14 多态性 121 15. 内部类/匿名内部类 135 16. 接口 144 16.1 为什么使用接口 144 16.2 接口的体验 148 16.3 接口语法...

    java进阶13天资料.zip

    day02-抽象类、接口、代码块,final、单例、枚举 day03-多态、包、权限修饰符、内部类,Object类,Date类 day04-常用API、正则表达式,泛型、Collection集合API day05-迭代器,数据结构,List,Set ,TreeSet集合,...

    java内部学习笔记.docx

    3.14抽象类 25 3.15接口 25 3.16内部类 26 3.17匿名类 27 3.18二维数组和对象数组 28 3.19其他注意事项 28 Java SE核心I 30 4.1 Object类 30 4.2 String类 31 4.3 StringUtils类 33 4.4 StringBuilder类 33 4.5正则...

    JAVA面向对象详细资料

    28.4 抽象方法与抽象类的关系 42 28.5 抽象方法与抽象类的使用 42 28.6 abstract的使用场合 42 29 练习:写一个“愤怒的小鸟”: 43 30 final关键字 43 30.1 final可以修饰到3个地方 43 30.2 引用类型加final修饰...

    summary2.md

    final,object,abstract抽象,interface接口,设计模式,单例,多态,内部类

    Java 基础面试题

    1. 抽象类和接口的区别 2. 什么时候使用抽象类,什么时候使用接口 3. 八大基本数据类型,所占字节数 4. List、Set、Map的区别 5. 什么情况下使用List、Map、Set? 6. ArrayList和LinckedList 7. LinckedList...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 ...11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    java面试800题

    3.接口中基本数据类型的数据成员,都默认为static和final,抽象类则不是 如果事先知道某种东西会成为基础类, 那么第一个选择就是把它变成一个接口。 只有在必须使用方法定义或者成员变量的时候,才应考虑采用抽象类...

    安卓java读取网页源码-android:安卓开发相关

    创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略...

    JAVA面试题收录

    接口和抽象类的异同点 重载(overload)和重写(overwrite)区别 StringBufferStringBuilderString区别 冒泡排序 选择排序 单例设计模式 常见的异常类型 Throws和Throw的区别 Final,Finally,finalize关键字的作用 ...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    7.4.1为什么需要抽象类 7.4.2为什么需要接口 7.5其他内容 7.5.1final关键字 7.5.2Object类 7.6一些工具的使用 7.6.1将字节码打包发布 7.6.2文档的使用 7.7小结 第8章实验指导2 8.1单例模式的设计 8.1.1...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    抽象类是否可继承具体类(concrete class) 30 【基础】一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 30 【基础】Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?...

    超级有影响力霸气的Java面试题大全文档

     声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    java面试题

    答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否...

Global site tag (gtag.js) - Google Analytics