关键字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.0
Circle 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();}
}

java基础_static关键字,接口,内部类,匿名内部类相关推荐

  1. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  2. JAVA基础之关键字、保留字和标识符

    关键字: 1.关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写 官方地址: https://docs.oracle ...

  3. Java基础(final关键字、双亲委派机制)

    Java基础 一.双亲委派机制 首先得了解类加载器Classloader在JVM中的分工: Bootstrap classLoader:主要负责加载核心的类库,构造ExtClassLoader和APP ...

  4. Java基础(抽象类和接口)

    Java基础 1.抽象类 ①抽象类是对类的抽象,比如波斯猫和加菲猫都属于猫这个类的类对象,猫.狗.鸟又可以抽象为动物这个大类,动物这个类可以被看成是抽象类. ②抽象类的定义: 定义类时在class前面 ...

  5. Java基础—序列化关键字transient

    原文作者:老鼠只爱大米 原文地址:Java中transient关键字的详细总结 一.概要介绍 本文要介绍的是Java中的transient关键字,transient是短暂的意思.对于transient ...

  6. Java基础语法-关键字、数据类型

    JRE.JDK.JVM Java基础语法 注释.标识符.关键字 标识符注意点 所有标识符都应该以字母(A-Z 或者a-z),美元符($).或者下划线(_)开始 首字符之后可以是字母(A-Z 或者a-z ...

  7. Java基础(Static关键字)

    java基础 一.关于Static修饰的变量 首先Static修饰的变量是放在方法区内存空间中的,在运行时Static方法先赋值然后才是main方法的执行,在类加载的时候就对Static修饰的变量进行 ...

  8. java入门 -- 面向对象关键字及内部类

    1 static 我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的 ...

  9. 【Java基础】关键字

    变量命名规则 标识符只能以大小写英文字母,数字,下划线和组成,而且开头必须是字母或者是下划线或者组成,而且开头必须是字母或者是下划线或者 同时Java中的标识符是区分大小写的,Count和count是 ...

最新文章

  1. 多任务上实现SOTA,UBC、谷歌联合Hinton等提出3D点云的无监督胶囊网络
  2. linux编译警告不能连接,linux编译警告信息
  3. os.chdir用法
  4. footer始终在页面最底部的方法(问题待检验)
  5. 第三阶段:2.产品运营:4.活动运营
  6. unix linux 命令参考,Unix/Linux 命令参考
  7. lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合
  8. hexo本地博客的转移
  9. tabulate matlab,matlab中用于统计矩阵数据频率,出现次数的函数
  10. 浏览器解析JavaScript的原理
  11. 错误: 非法字符: ‘\ufeff‘ 解决方案
  12. 我把朋友圈关掉了235天
  13. 苹果开发者中心密保问题忘了。
  14. mysql workbench中PK,NN,UQ,BIN,UN,ZF,AI字段类型标识说明
  15. 蜜瓜文案:水果蜜瓜文案短句,水果店蜜瓜发朋友圈文案
  16. 夜间环境人脸识别_基于人脸识别的夜间疲劳驾驶判断方法与流程
  17. 微软project服务器搭建,安装和配置 Project Server 2013
  18. java国际化程序_Java 国际化标准程序实现
  19. 最新kali之nmap
  20. 电子章怎么做(电子公章怎么生成),只要三步

热门文章

  1. 华为更换服务器硬件配置,华为CloudIVS服务器安装方案及安装步骤讲解
  2. Python 头歌计算个人所得税
  3. html表格统计平均成绩,Excel表格的成绩单如何算出平均分
  4. LLVM编译器Kaleidoscope(万花筒)入门教学
  5. SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
  6. 2021年亚马逊运营教程(全)
  7. c语言常用的格式声明,c语言函数声明格式是什么
  8. 耳挂式蓝牙耳机原理_挂耳式无线蓝牙耳机怎么佩戴 无线蓝牙耳机有哪些优点...
  9. 【前端提升之---webpack 一】
  10. 设计模式(老司机带你深入了解)