Java学习六、Java类的高级特性2

6.1关键字static

实例变量:只有实例化之后才能使用,属于实例化对象的一部分。

类变量(static修饰):不用实例化,直接类名.属性名就可以使用,是类的一部分,被所有这个类的实例化对象所共享,也可以 叫静态变量 。

类属性,类方法的设计思想:

类属性作为该类各个对象之间共享的变量。在设计类时,分析那些类属性不因对象的不同而改变,将这些属性设置为类属性,相应的方法设置为类方法。如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。类方法,也就是静态方法,一些工具类可以声明为静态方法。

关键字static:

  • 使用范围:在Java中,可以使用static修饰属性、方法、代码块、内部类

  • 被修饰后的成员具备以下特点:

  • 随着类的加载而加载

  • 优先于对象的存在

  • 修饰的成员被所有对象所共享

  • 访问权限允许时,可不创建对象,直接被类调用

单例设计模式

所谓类的单例设计模式,就是采用一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供 一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置 为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类的内部仍可以产生该类的对象。因为,在类的外部开 始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所 以,指向类内部产生的该类的变量也必须定义成静态的。

6.2main方法

由于java虚拟机需要调用类的main方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main方法时不必创建对象,所以该方法必须是static的,该方法接受一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

6.3类的成员之四:初始化块

初始化块的作用:

对Java对象进行初始化

程序执行顺序

  1. 声明成员变量的默认值

  1. 显示初始化、多个初始化块依次被执行

  1. 构造器再对成员进行赋值操作

一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block),当类被载入时,类属性的声明和静态代 码块先后顺序被执行,且只被执行一次 ,在程序运行中,非静态代码块每次new对象都有被执行,而静态代码块只被执行一次。

非静态代码块:

  1. 可以有输出语句

  1. 可以对类的属性声明进行初始化操作

  1. 可以调用静态和非静态的变量和方法

  1. 若有多个非静态代码块,那么按照从上到下的顺序依次执行

  1. 每次创建对象的时候都会执行一次,且先于构造器

静态代码块:

  1. 可以有输出语句

  1. 可以对类的属性声明进行初始化操作

  1. 不可以对非静态的属性进行初始化,不可以调用非静态的属性和方法

  1. 若有多个代码块,那么按照从上到下的顺序依次执行

  1. 静态代码块的执行要先于非静态代码块

  1. 静态代码块只执行一次

6.4关键字final

在java中声明类、属性和方法时,可以使用关键字final来修饰,表示“最终” ,final修饰的类不能被继承,提高安全性,提高程序的可读性 ,final修饰的方法不能被子类重写,final修饰的变量即为常量,名称大写,且只能被赋值一次,final修饰的成员变量必须在声明的同时或在每个构造方法中或在代码块中显示赋值,然后才能使用。

6.5抽象类

随着继承层次中一个个新子类的定义,类变的越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特

征。有时将一个父类设计得非常抽象,以致于他没有具体的实例,这样的类叫做抽象类。

抽象化处理:

不写具体实现,等到具体的实例再来实现。

抽象类:

  1. 用abstract关键字修饰的类叫抽象类

  1. 用abstract关键字修饰的方法叫抽象方法(只有方法的声明,没有方法的实现,以分号结束)

  1. 含有抽象方法的类必须被声明为抽象类

  1. 抽象类不能被实例化,抽象类是用来继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,则子类仍然为抽象类

  1. 不能用abstract修饰属性,私有方法,构造器,静态方法,final修饰的方法

  1. 抽象类是用来模型化那些父类无法确定全部实现,而是由子类提供具体实现对象的类

练习:编写一个Employee类,声明为抽象类,包含如下三个属性:name、id、salary。提供必要的构造器和抽象方法:work()。 对应Manager类来说,他既是员工,还有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager 类,要求类中提供的方法进行属性访问。

public abstract class Employee {
    public int id;
    public String name;
    public double salary;

    public Employee() {
    }
    public abstract void work();
}
public class CommonEmployee extends Employee {
    @Override
    public void work() {
        System.out.println("Common Working...");
    }
}
public class Manager extends Employee {
    public double bonus;

    @Override
    public void work() {
        System.out.println("Manager Working...");
    }
}

模板方法设计模式TemplateMethod

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类 总体上会保留抽象类的行为方式。 解决的问题: 1.当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。 2.编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给子类实现,就是一种模板模式。

6.6接口

有时必须从几个类中派生出一个子类,继承他们所有的属性和方法。但是,java不支持多重继承。有了接口,就可以得到多重继

承的效果。

接口(interface)是抽象方法和常量值的定义的集合。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

实现接口类:

class SubClass implements interface_name{}

一个类可以实现多个接口,接口也可以继承其他接口

接口的特点:

  1. 用interface来定义

  1. 接口中的所有成员变量都是默认由public static final修饰的

  1. 接口中的所有方法都是默认由public abstract修饰的

  1. 接口没有构造器

5. 接口采用多层继承机制

实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。

接口的主要用途就是被实现类实现。(面向接口编程)

与继承关系类似,接口与实现类之间存在多态性。

定义java类的语法格式:先写extends再写implements

抽象类与接口:

抽象类需要稳定的抽象,如果要新增抽象方法,或者父类抽象类一直需要更改,则下边的子孙类都会收到影响,但有时需要

增加新的抽象方法,但又不能直接更改子类,因此建立一个接口,其他子孙类需要的则实现接口,不需要的则无需改变

接口的其他问题:

如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类

接口也可以继承另一个接口,使用extends关键字

抽象类是对于一类事物的高度抽象,其中既有属性又有方法,接口是对方法的抽象,也就是对一系列动作的抽象,当需要对一类

事物抽象时,使用抽象类,当需要对一系列的动作抽象时,使用接口。

工厂方法(FactoryMethod)

FactoryMethod模式是设计模式中最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很

重要。FactoryMethod解决的就是这个问题,他通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提

供了一种扩展的策略,较好的解决了这种紧耦合的关系。

6.7类的成员之五:内部类

在java中,允许一个类的定义于另一个类的内部,前者称为内部类,后者称为外部类

  • Inner class一般在定义他的类或语句块之内,在外部引用他时,必须给出完整的名称。

  • Inner class的名字不能与包含他的类名相同

  • Inner class可以使用外部类的私有数据,因为他是外部类的成员,同一个类的成员之间可以相互访问。而外部类要访问内部类中

的成员需要:内部类.成员或者内部类对象.成员

分类:

成员内部类(static成员内部类和非static成员内部类)

局部内部类(不谈修饰符)

匿名内部类

public class Test{
    public int i;
    private int k;
    class   A{
        int a;
        public void setTest(){
            Test.this.i=1;
            Test.this.k=2;
        }
        public void setA(){
            this.a=3;
        }
    }
    public void setInfo(){
        new A().setTest();//外部类要用内部类的方法,先要new内部对象
    }
    public void showInfo(){
        System.out.println(this.i+this.k);
    }

    public static void main(String[] args) {
        Test A=new Test();
        A.setInfo();
        A.showInfo();
    }
}

内部类的特性:

  • Inner class作为类的成员:

可以声明为final的

和外部类不同,Inner class可声明为private或protected

Inner class可以声明为static的,但此时就不能再使用外层类的非static的成员变量

  • Inner class作为类:

可以声明为abstract类,因此可以被其他的内部类继承

注意:

非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员

内部主要是解决java不能多重继承的问题

6.8面向对象总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值