zoukankan      html  css  js  c++  java
  • Java入门7.1---关键字static、final、抽象类、接口

    一、关键字:static

    static:可以用来修饰属性、方法、*代码块(或初始化块)、*内部类

    1.static修饰属性(类变量)

    1. 由类创建的所有的对象,都共用这一个属性;
    2. 当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。 VS 实例变量(非static修饰的属性,各个对象各自拥有一套副本)
    3. 类变量随着类的加载而加载的,而且独一份。
    4. 静态变量可以直接通过“类.类变量”的形式来调用。(实例变量:随着对象的创建而被加载的,所以静态变量加载时间要早于实例变量。)
    5. 类变量的加载要早于对象。所以当有对象以后,可以“对象.类变量”调用,但是“类.实例变量”是不行的。
    6. 类变量存在于静态域中。

    举例:

    2.static修饰方法(类方法)

    1. 随着类的加载而加载,在内存中也是独一份;
    2. 可以直接通过“类.类方法”的方式调用。
    3. 在静态方法内部,可以调用静态的属性或静态的方法,而不能调用非静态的属性或方法。反之,非静态的方法是可以调用静态的属性或静态方法。(原因:生命周期不同)
    4. 静态的方法内是不可以有this或super关键字的!!!(在调用当前static方法时,可能没有生成对象,不能用this.方法)

    注:静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收也要晚于非静态的结构。

    3.设计模式及单例模式的饿汉式和懒汉式

    3.1 设计模式

    设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。

    1. 单例的设计模式:使得一个类只能够创建一个对象。

    3.2 单例模式---饿汉式(线程安全)

    public class TestSingleton{
    	public static void main(String[] agrs){
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		System.out.println(s1 == s2);
    	}
    }
    
    class Singleton{
    	// 1.私有化构造器,使得在类的外部不能够调用此构造器
    	private Singleton(){
    	
    	}
    	// 2.在类的内部创建一个类的实例
    	private static Singleton instance = new Singleton();
    	// 3.私有化此对象,通过公共的方法来调用
    	// 4.此公共的方法,只能通过类来调用,因此设置为static,同时类的实例也必须为static声明的
    	public static Singleton getInstance(){
    		return instance;
    	}
    	
    }
    

    Java.lang包下面的runtime类用的是饿汉式单例模式

    3.3 单例模式---懒汉式(线程不安全)

    用的时候再创建

    // 2.懒汉式
    public class TestSingleton{
    	public static void main(String[] agrs){
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		System.out.println(s1 == s2); // true
    	}
    }
    
    class Singleton{
    	// 1.私有化构造器,使得在类的外部不能够调用此构造器
    	private Singleton(){
    	
    	}
    	// 2.在类的内部创建一个类的实例
    	private static Singleton instance = null;
    	// 3.此公共的方法,只能通过类来调用,因此设置为static,同时类的实例也必须为static声明的
    	public static Singleton getInstance(){
    		if (instance == null){
    			instance = new Singleton();
    		}
    		return instance;
    }  

    4.main方法

     

    5.类的成员之四:初始化块

    非静态代码块:没有static修饰的代码块 静态代码块:用static修饰的代码块

    关于属性赋值的操作:

    1. 默认的初始化;
    2. 显示的初始化或代码块初始化(此处两个结构按照顺序执行);
    3. 构造器中;
    4. 通过方法对对象的相应属性进行修改。

    初始化块:

    1. 代码块如果有修饰的话,只能使用static;
    2. 分类: 
    静态代码块 非静态代码块
    1. 里面可以有输出语句
    2. 随着类的加载而加载,而且只能被加载一次
    3. 多个静态代码块之间按照顺序结构执行
    4. 静态代码块执行要早于非静态代码块执行
    5. 静态代码块中执行执行静态的结构(类属性、类方法)
    1. 可以对类的属性(静态的、非静态的)进行初始化操作,同时也可以调用本类声明的方法(静态的、非静态的)
    2. 里面可以有输出语句
    3. 一个类中可以有多个非静态的代码块,多个代码块之间安装顺序结构执行
    4. 每创建一个类的对象, 非静态代码块就加载一次
    5. 非静态代码块的执行要早于构造器
     

    二、关键字:final

    在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”。

    1.final修饰的类不能被继承

    提高安全性,提高程序的可读性。如:String类、System类、StringBuffer类

    2.final修饰的方法不能被子类重写

    如:Object类中的getClass()

    3.final修饰的变量(成员变量或局部变量)称为常量

    习惯上,常量用大写字符表示,且只能被赋值一次。此常量在哪里赋值:

    1. 此常量不能使用默认初始化
    2. 可以显示的赋值、代码块、构造器,不能在方法中赋值。

    变量用static final修饰,为全局常量。

    与finally finalize()区别

    三、抽象类

    abstract:抽象的,可以用来修饰类、方法

    1.abstract修饰类 ,抽象类

    (1)不可被实例化

    (2)抽象类有构造器(凡是抽象类,都有构造器)【保证在创建类的实例时,有实例化的过程】

    (3)抽象方法所在的类,一定是抽象类

    (4)抽象类中可以没有抽象方法

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

    (1)格式:只有方法的声明,没有方法的实现。以分号结束,如,public abstract void eat();

    (2)抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写抽象方法

    (3)若子类继承抽象类,并重写了所有的抽象方法,则此类是一个“实体类”,即可以实例化

    (4)若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的

    3.abstract不适用的场景

    不能用abstract修饰:

    1. 属性
    2. 构造器:构造器不能被重写
    3. private方法:子类不能覆盖(或重写)声明为private的方法
    4. 静态方法:静态方法意味着可以通过类来直接调用,当声明为抽象时,又没有方法体。
    5. final方法:final与abstract矛盾

    4.模板方法设计模式(TemplateMethod)

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

    解决的问题:

    1. 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
    2. 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

    四、接口

      有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。接口是与类并行的一个概念。

    1. 接口是抽象方法常量值的定义的集合。
    2. 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量(所有的常量都用public static final修饰)和方法的定义(抽象方法:所有的都用public abstract修饰),而没有变量和方法的实现。
    3. 接口是没有构造器的
    4. 接口定义的就是一种功能,此功能可以被类所实现(implements),比如,class CC implements AA
    5. 实现接口的类,必须要重写其中的所有抽象方法,方可实例化。若没有重写所有的抽象方法,则此类仍为一个抽象类。
    6. 类可以实现多个接口-------Java中的继承是单继承的
    7. 接口与接口直接也是继承的关系,而且可以实现多继承。

    实现接口类:class Subclass implements InterfaceA{}

     

  • 相关阅读:
    剑指Offer——数组中重复的数字
    基于Google Protobuff和Mina的RPC
    Google Protocol Buffers 编码(Encoding)
    Protocol Buffers 语法指南
    Google Protocol Buffers 入门
    Google Protocol Buffers 概述 转
    Protobuf语言指南
    基于Protobuf的通讯库--Poppy简介
    log4cxx第三篇----使用多个logger
    log4CXX第二篇---配置文件(properties文件)详解
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/13269842.html
Copyright © 2011-2022 走看看