7月21日---关键字、抽象方法、抽象类、接口、多态及总结、设计模式

来源:互联网 发布:彩票数据分析软件 编辑:程序博客网 时间:2024/05/16 08:02

参考资料:请点这里,这是一篇很有用的文章

static关键字

static 静态的 用来定义该类中对象共有的属性
静态的变量和方法可以通过”类名. “调用
静态只能调用静态 不能使用super 和this

final关键字

final最后 最终
用final修饰类 该类不能被继承
用final修饰方法 该方法不允许被重写
用final修饰变量 该变量值不允许被修改
全局变量用final修饰后要立刻赋值
局部变量可以先声明后赋值

用static和final修饰后的变量相当于常量
常量命名规则 全部大写单词用下划线隔开
静态导入
这里写图片描述

导包
当定义一个String类的变量是 会自动导入:lang.*

抽象方法

abstract
抽象方法没有方法体
抽象方法肯定有抽象类
抽象方法必须在子类中实现,除非子类是抽象类

匿名内部类,一般在只使用一个此类对象的时候使用,

    Students s = new Students(){    @Override    public void run() {    // TODO Auto-generated method stub        }    };    //Students是一个抽象类,Schoolboy是Students的子类,Students s = new Students();是使用不了的,可以用Students s = new Schoolboy();,或者用到一个匿名内部类,相当于创建了一个类继承了Students类,然后用此类创建了一个对象

接口

interface
只有抽象方法的抽象类可以用接口来表示

接口中只允许有常量和抽象方法
接口中的方法是抽象的,没有方法体
接口中不能有变量
这里写图片描述
这里写图片描述

接口的定义和类的定义很相似,只是关键字不同,关键字为interface。声明格式如>下:interface 接口名{}
上面的大括号中为接口体。接口体中包含成员变量定义和方法定义两部分。
接口体中只进行方法的声明,不允许提供方法的实现。所以在格式上只存在方法声明,实际上没有方法体,而方法体要在实现的类中再去具体定义。
还有一点需要说明的是:如果一个类使用了某个接口,就必须要实现这个接口的所有方法,即使实在没有内容只是一个空的方法体也不许要写。而且每个方法都默认是public的,所以实现时代码一定要用public做修饰,参数个数,类型以及返回值的类型都必须与接口中的声明相一致。
例如:
interface Runable { }
接口和抽象类的区别

接口和抽象类

多态

父类的引用指向子类的对象
多态
例:
Print print = new LGPrint();//LG是Print的子类
Paper paper = new ChenguangPaper();
Ink ink = new BeijingInk();

instanceof
这里写图片描述

内部类

内部类就是创建在内部的类,是指对象包含的类

创建内部类的方法:
这里写图片描述

这里写图片描述

封装、继承和多态总结

1、我们可以把JAVA中的类分为以下三种:

类:使用class定义且不含有抽象方法的类。

抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。

接口:使用interface定义的类。

在这三种类型之间存在下面的继承规律:

类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

接口只能继承(extends)接口。

2、继承(inheritance)
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

继承是为了重用父类代码,同时为实现多态性作准备。

3、封装(encapsulation)
类使得数据和对数据的操作集成在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏。 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。
4、多态(polymorphism)

方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关 系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
多态又分为设计时多态和运行时多态,例如重载又被称为设计时多态,而对于覆盖或继承的方法,JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。总而言之,面向对象的设计的典型特点就是继承,封装和多态,这些特点也是面向对象之所以能如此盛行的关键所在。

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;该引用只能调用父类中定义的方法和变量;二、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)三、变量不能被重写(覆盖),"重写"的概念只针对方法。

重写和重载

重载(Overloading)

(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

重写(Overriding)

(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3)子类函数的访问修饰权限不能少于父类的;

设计模式

参考资料

设计模式分为:单例设计模式和共产设计模式

1.单例设计模式

所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:
(1)先私有构造器
(2)创建静态得到对象的方法
(3)穿件对象
(4)在静态方法中加条件语句

package Print;public class Students {    private static Students instence;    private Students(){    }    public static Students getInstence(){        if(instence==null){            instence=new Students();        }        return instence;        }}package Print;public class Test {    public static void main(String[] args) {        Students zhangsan = Students.getInstence();        Students lisi = Students.getInstence();        System.out.println(zhangsan);        System.out.println(lisi);    }}结果:Print.Students@19e0bfdPrint.Students@19e0bfd

2.工厂设计模式

程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。

例:
要先新建一个File,名称为config.properties,,在里面写ink app或者ink hPP

public Print creatPrint(){        Properties properties = new Properties();        String s = "";        try{            properties.load(new FileInputStream("config.properties"));            s = properties.getProperty("ink");            System.out.println(s);        }catch(IOException e){            e.printStackTrace();        }        Print print = null;        if(s.equals("app")){            print=new HPPrint();        }else if(s.equals("hPP")){            print=new ApplePrint();        }        //Print print = new HPPrint();        return print;    }
0 0