static 修饰符用来修饰类中的变量和方法,用static 修饰的变量为静态变量或者类变量,用static 修饰的成员方法成为静态方法 或者静态方法。 当Java程序执行字节码文件被加载在内存中时,类变量会分配相对应的 存储空间,而实例变量只有创建对象时才会分配 存储空间。 1.类变量与实例变量:类变量的使用“类名或者对象名.类变量名” ,方法中的局部变量不能用static修饰。 2.类方法(静态方法。static修饰)与实例方法:类方法只能访问类变量,而实例方法既能访问类变量也能访问实例变量。 3.static还可以修饰类中代码块,称为静态代码块。它在加载时执行并且只执行一次。 实例变量的初始化: 用new运算符给实例变量分配空间是默认 初始化 类定义中的显示初始化 非静态代码块的初始化 执行构造方法进行初始化
类变量的 初始化: 加载时为静态变量分配内存空间 默认初始化 执行静态代码块 最后执行main()方法
如果用final修饰符表示最终的意思。
**1.final修饰类:**如修饰类,表示最终类,最终类不能被继承,也没有子类。例如:JDK类库中的String,Math,Boolean,Integer
**2.final修饰成员变量:**用final修饰成员变量时一定要明确赋初始值,且其值不能改变(如果修饰的成员变量是基本数据类型,值不可以改变,如果修饰的变量为引用类型,则该变量不能不能再指向其他对象,但是所指向对象的成员变量可以改变) 实例变量赋值的位置有三处:定义时的显示初始化、非静态代码块、构造方法中 类变量赋值的位置:定义时显示初始化、静态代码块
3.final修饰局部变量:必须先 赋值后使用,并且不能重新赋值
**4.final修饰方法:**可以修饰方法,但是该方法 在子类中不能被重写
==可以比较两个基本数据类型,两个引用类型。比较基本数据类型时比较的是值是否相等,比较引用类型时比较的是两个引用(对象地址是否一致)是否相同。 equals只能比较两个引用类型,无法比较基本类型。equals比较的是引用 是否相同,但是比较String、Date的时候比较的是对象的内容是否相同。
**
**:在定义类时在前面加上关键词 abstract 这样的类被定义为抽象类
a.抽象类访问修饰符可以为public或者什么也不写,如果被定义成public,则要求文件名与类名完全相同 b.抽象类不可以被实例化(既不能使用new),抽象类中的抽象方法用abstract来标识,但是在抽象方法中只包含声明部分,不包含实现部分。 c.当一个类继承抽象类时,一定要实现抽象类中的所有抽象方法,否在该类为抽象类。 d.抽象类中的抽象方法不能用private修饰,关键字abstract与final不能同时用来修饰类与方法
抽象类的作用(实现java中的 多态):因为抽象类(父类)的引用可以指向具体的 子类对象,所以会执行不同的 子类重写后的方法,从而实现多态 示例: 抽象类:Shape.java
abstract class Shape { abstract double getArea(); abstract String getShapeInfo(); }子类:Triangle.java
class Triangle extends Shape { double a; double b; double c; Triangle(double a, double b, double c) { this.a = a; this.b = b; this.c = c; } @Override double getArea() { double p = (a+b+c)/2; return Math.sqrt(p*(p-a)*(p-b)*(p-c)); } String getShapeInfo(){ return "Triangle:"; } }Rectangle.java
class Rectangle extends Shape { double a; double b; Rectangle(double a, double b) { this.a = a; this.b = b; } @Override double getArea() { return a*b; } String getShapeInfo(){ return "Rectangle:"; } }main
public class AbstractOveridingTest { public void printArea(Shape s){ System.out.println(s.getShapeInfo()+s.getArea()); } public static void main(String[] args){ AbstractOveridingTest aot = new AbstractOveridingTest(); Shape s = new Triangle(3,4,5);//父类(抽象类)的引用指向具体的子类从而实现多态 aot.printArea(s); s=new Rectangle(5,6); aot.printArea(s); } }运行结果: 如果再增加一个Square(正方形)类,只需要将Square类继承抽象类Shape并实现两个抽象方法,而AbstractOveridingTest类中的printArea(Shape s)并不需要改变。通过抽象类实现程序扩展,从而增强了程序的可维护性。
在Java中类的继承是单继承的,一个类只能有一个 父类,为了实现多继承,就必须通过接口来实现。一个类可以实现多个接口来实现多重继承。接口中可以有变量和方法,但是有特定要求。
1.接口中定义的成员变量默认都具有public 、static、final属性,并且定义这些常量时必须要赋值,且赋值后不能改变。 2.接口中定义的成员方法默认具有abstract、public属性. 3.由于接口中的抽象方法的访问限制属性为public ,在类中实现抽象方法时其访问限制属性不能缩小,既子类在实现了接口之后,实现接口中的方法的时候必须在方法前面写上public . 4.一个类实现接口的时候要将接口中的所有抽象方法都实现。否则这个类定义为抽象类(抽象类的实现规则 )。
通过接口实现多态 接口:Flyer.java
public class InterfaceTest { public static void main(String[] args){ Flyer f=new Bird(); f.fly(); f = new Airplane(); f.fly(); } }实现接口 Bird.java
public class InterfaceTest { public static void main(String[] args){ Flyer f=new Bird(); f.fly(); f = new Airplane(); f.fly(); } }Airplane.java
public class Airplane implements Flyer { @Override public void fly() { System.out.println("飞机在空中飞行"); } }测试:IntfaceTest.java
public class InterfaceTest { public static void main(String[] args){ Flyer f=new Bird(); f.fly(); f = new Airplane(); f.fly(); } }运行结果: