1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java基础_static关键字 接口 内部类 匿名内部类

java基础_static关键字 接口 内部类 匿名内部类

时间:2019-09-21 03:12:13

相关推荐

java基础_static关键字 接口 内部类 匿名内部类

关键字static

当我们编写一个类时,其实就是在描述其对象的属性和行为,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份

class Circle{private double radius;public Circle(double radius){this.radius=radius;}public double findArea(){return Math.PI*radius*radius;}}创建两个Circle对象Circle c1=new Circle(2.0);//c1.radius=2.0Circle c2=new Circle(3.0);//c2.radius=3.0

Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。

上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。

类属性作为该类各个对象之间共享的变量。

如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

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

随着类的加载而加载优先于对象存在修饰的成员,被所有对象所共享访问权限允许时,可不创建对象,直接被类调用。

class Circle {private double radius;public static String name = "这是一个圆";public static String getName(){return name;}public Circle(double radius) {getName();this.radius = radius;}public double findArea() {return Math.PI * radius * radius;}public void display(){System.out.println("name:"+name+"radius:"+radius);}}

public class TestStatic {public static void main(String[] args) {Circle c1 = new Circle(2.0);Circle c2 = new Circle(3.0);c1.display();c2.display();}}

类变量(类属性)由该类的所有实例共享

public class Person {private int id;public static int total = 0;public Person() {total++;id = total;}}

class Person {private int id;public static int total = 0;public Person() {total++;id = total;}public static void main(String args[]){Person Tom=new Person();Tom.id=0;total=100; // 不用创建对象就可以访问静态成员}}``public class OtherClass {public static void main(String args[]) {Person.total = 100; // 不用创建对象就可以访问静态成员//访问方式:类名.类属性,类名.类方法System.out.println(Person.total);Person c = new Person(); System.out.println(c.total);//输出101}}

类方法

没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法。

在static方法内部只能访问类的static属性,不能访问类的非static属性。

初始化块

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

static块通常用于初始化static (类)属性class Person {public static int total;static {total = 100;//为total赋初值 }…… //其它属性或方法声明}

抽象类

用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。抽象方法:只有方法的声明,没有方法的实现。以分号结束:abstract int abstractMethod( int a );含有抽象方法的类必须被声明为抽象类。抽象类不能被实例化。抽象类是用来作为父类被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

abstract class A{abstract void m1( );public void m2( ){System.out.println("A类中定义的m2方法");}}class B extends A{void m1( ){System.out.println("B类中定义的m1方法");}}public class Test{public static void main( String args[ ] ){A a = new B( );a.m1( );a.m2( );}}

接口

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

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

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

实现接口类:

class SubClass implements InterfaceA{ }

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

接口的特点:

用interface来定义。

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

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

接口没有构造器。

接口采用多层继承机制。

接口定义举例

public interface Runner {(public static final)int ID = 1;(public abstract)void start();public (abstract)void run();(public abstract)void stop();}

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

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

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

定义Java类的语法格式:先写extends,后写implements

< modifier> class < name> [extends < superclass>][implements < interface> [,< interface>]* ] {< declarations>*}

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

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

interface MyInterface{String s=“MyInterface”;public void absM1();}interface SubInterface extends MyInterface{public void absM2();}public class SubAdapter implements SubInterface{public void absM1(){System.out.println(“absM1”);}public void absM2(){System.out.println(“absM2”);}}

实现类SubAdapter必须给出接口SubInterface以及父接口MyInterface中所有方法的实现。

内部类

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

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

Inner class的名字不能与包含它的类名相同;

Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。

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

局部内部类(不谈修饰符)、匿名内部类

class A {private int s;public class B{public void mb() {s = 100;System.out.println("在内部类B中s=" + s);} }public void ma() {B i = new B();i.mb();} }public class Test {public static void main(String args[]){A o = new A();o.ma();} }

内部类的特性

Inner class作为类的成员:

可以声明为final的

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

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

Inner class作为类:

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

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

匿名内部类

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

new 父类构造器(实参列表)|实现接口(){

//匿名内部类的类体部分

}

interface A{public abstract void fun1();}public class Outer{public static void main(String[] args) {new Outer().callInner(new A()){//接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名public void fun1() {System.out.println(“implement for fun1");}});// 两步写成一步了}public void callInner(A a) {a.fun1();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。