一、 static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也能够造成静态static代码块。被static修饰的成员变量和成员方法独立于该类的任何对象;使用公共内存空间。 java
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的全部实例共享同一个static变量。在外部调用静态方法时,可以使用“类名.方法名”也可使用“对象名。方法名”的方式,即调用静态方法能够无需建立对象。 this
二、final关键字能够用来修饰类、方法、变量。各有不一样。 spa
A、修饰类(class)。
一、该类不能被继承。
二、类中的方法不会被覆盖,所以默认都是final的。
三、用途:设计类时,若是该类不须要有子类,没必要要被扩展,类的实现细节不容许被改变,那么就设计成final类 设计
B、修饰方法(method)
一、该方法能够被继承,可是不能被覆盖。
二、用途:一个类不容许子类覆盖该方法,则用final来修饰
三、好处:能够防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提升了执行效率。
四、注意:父类中的private成员方法不能被子类覆盖,所以,private方法默认是final型的(能够查看编译后的class文件) code
C、修饰变量(variable)
一、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
二、特色:能够先声明,不给初值,这种叫作final空白。可是使用前必须被初始化。一旦被赋值,将不能再被改变。 对象
D、修饰参数(arguments)
一、用final修饰参数时,能够读取该参数,可是不能对其做出修改。 继承
A、抽象类(abstract class)
一、抽象方法(abstract method):不含方法体的方法,它由继承它子类根据需求去实现,必须用abstract修饰。此外,该方法必须对子类可见,所以要加只能加public 或者 protected!。
二、抽象类:至少包含一个抽象方法的类(能够包含非抽象方法)。必须用abstract修饰。
三、特色:抽象类不能被实例化(也就是不能new对象);含有抽象方法的类必须声明为抽象类;一个类只有实现了抽象类中的全部方法才能被实例化,不然它依然是抽象类。 接口
B、接口(interface)
一、接口定义:抽象方法和常量值的集合(全部的方法都是抽象方法)。它是一种特殊的抽象类(会生成一个xxx.class文件,编译器会自动在interface关键字前加上abstract)。
二、特色:
a、接口里的常量默认都是public static final来修饰的(若是什么都不写,编译器会自动帮你写上)。
b、接口里的方法默认都是public abstract来修饰的(若是是什么都不写,编译器会自动帮你写上)。
c、能够用extends继承已有的接口。
d、一个类,能够用implements实现一个或多个接口中的全部方法(包括这个接口的父接口中的方法)。
e、一个抽象类,能够implements实现接口中的部分方法
f、一个类,能够extends一个父类的同时implements多个接口,可是extends关键字必须在implements关键字以前。 内存
三、Java抽象类和抽象方法: get
<span style="font-size:18px;">package OOTest; public abstract class Human {//抽象父类 private final int time=++count;//对象计数器 private static int count;//静态池 //属性封装 private String name;//封装三步:隐藏属性,提供getter与setter方法,构造中调用setter初始化 private int age; private String sex; //getter&&setter public String getName(){ return this.name; } public void setName(String name){ //处理代码:姓名不能为空,且不能包含数字 if(name.length()==0){ System.out.println("姓名不能为空"); } else if(this.isWrongName(name)){//调用私有方法处理 System.out.println("非法姓名,不能包含数字"); } else{ this.name=name; } } private boolean isWrongName(String name){//判断非法姓名输入(私有) char[] ch=name.toCharArray(); for(int i=0;i<ch.length;i++){ try{ int s=Integer.parseInt(String.valueOf(ch[i])); s++;//废 return true; } catch(Exception e){ continue;//出错就继续下一次循环转换 } } return false;//先返回错误 } public int getAge(){ return this.age; } public void setAge(int age){ if(age<=0){ System.out.println("年龄有误"); } else{ this.age=age; } } public String getSex(){ return this.sex; } public void setSex(String sex){ if(sex.length()>1||sex.length()==0){ System.out.println("性别设定错误"); } else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){ this.sex=sex; } else{ System.out.println("性别设定错误"); } } //构造 public Human(){//无参 this("无1名氏",25,"男"); } public Human(String name,int age,String sex){//全参 this.setName(name); this.setAge(age); this.setSex(sex); } //抽象方法 public abstract void speak();//说话 public abstract void work();//工做 public abstract void eat(); //获取对象建立数目 public int getHumanClassUseTimes(){ return this.time; } } </span>