static 关键字 可以修饰成员变量和成员方法 ,一旦成员修饰之后,成员不属于对象层次,而属
于类层级,也就是用创建对象来调用就不可行。
用static来修饰的成员变量,叫类变量,该类每个对象共享这个类变量值,每个对象都可以修改
类变量的值,甚至可以在不创建对象情况下对类变量来操作。
public class Student { //成员变量 String name; String sex; static String classId; public static void main(String[] args) { //静态成员变量,操作共享空间 Student.classId = "001"; //普通成员变量,只能操作自己空间内属性 Student s1 = new Student(); s1.name = "tom"; s1.sex = "male"; Student s2 = new Student(); s2.name = "Jerry"; s2.sex = "female"; System.out.println(s1.name + "/" + s1.sex + "/" + Student.classId); System.out.println(s2.name + "/" + s2.sex + "/" + Student.classId); System.out.println(s2.name + "/" + s2.sex + "/" + Student.classId); } }
用static 关键字修饰的成员方法,叫静态方法
//静态方法 public static void study(){ System.out.println("学生必须好好学习"); // playGame(); classId="001"; // name="xxx"; } //普通方法 public void playGame(){ classId="001"; System.out.println("有时也可以玩玩游戏"); study(); }
语法格式
static{ //静态代码块 }
软件设计模式的分类(面向对象领域) 23种设计模式,总共分3大类
掌握 单例模式 工厂模式 代理模式
目标: 使类中一个对象成为该系统唯一实例
定义: 一个类有且只有一个实例,并且自行实例化,并向整个系统提供
特点:
饿汉式:
//饿汉式 public class Singleton1 { private static Singleton1 instance = new Singleton1(); public void show() { System.out.println("冲就完了!"); } private Singleton1() { } public static Singleton1 getInstance() { return instance; } }
懒汉式:
//懒汉式 public class Singleton { private static Singleton instance; private Singleton (){} public void show(){ System.out.println("冲就完了!"); } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
将一个类A定义在另一个类B里面,里面那个类A称为内部类,B则称为外部类。
class B{ *** Class A; //成员变量 ->成员内部类(1) public void method(){ Class A;//-》方法内部类(2) } pubic static method(){ Class A//-》静态内部类(3) } }
class 外部类{ class 内部类{ } }
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类的结构;比如:汽车类Car
中包含发动机类Engine,这是Engine就可以使用内部类来描述,定义在成员位置
//外部类 class Car{ //内部类 class Engine{ } }
package demo01; public class Person { private boolean live=true; public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } class Heart{ public void jump(){ //直接访问外部类 if(live){ System.out.println("心脏在跳动!"); }else{ System.out.println("心脏不跳了!"); } } } } ---------------------------------------------------------- package demo01; public class InnerDemo { public static void main(String[] args) { //创建外部类的对象 Person p=new Person(); Person.Heart heart=p.new Heart(); // Person.Heart heart1=new Person().new Heart(); //调用内部类的方法 heart.jump(); //调用外部类 p.setLive(false); heart.jump(); } }
输出结果: 心脏在跳动! 心脏不跳了!
内部类仍然是一个独立的类,在编译之后 内部类会编译成独立的.class文件,但是前面冠以 外部类类名和符号$ Person$Heart.class
- 匿名内部类 【重点】
匿名内部类:是内部类的简化写法,它的本质是一个父类或者父接口的匿名子类对象。
开发中,最常用内部类就是匿名内部类,并且Lambda表达式是对匿名内部类的简化。
使用场景
当使用接口,先定义一个接口,接下来
new 父类名或接口名(){ //方法重写 @Override pubilc void methd(){ //执行语句 } };
使用:
以接口为例
public interface FlyAble { public abstract void fly(); }
创建了匿名的内部类,并调用:
public class Test { public static void main(String[] args) { /* FlyAble f=new FlyAbleImpl(); f.fly();*/ FlyAble f=new FlyAble() { @Override public void fly() { System.out.println("我能飞"); } }; //调用,执行重写的方法 f.fly(); } }
通常以方法形参方式,使用匿名内部类
public class Test01 { //将接口作为形参定义在方法中 public static void showFly(FlyAble f){ f.fly(); } public static void main(String[] args) { FlyAble f=new FlyAble() { @Override public void fly() { System.out.println("我能飞"); } }; //将引用作为实参传递到方法中 showFly(f); } }
以上两步,也可以简化成一步,代码如下:
public class Test03 { public static void showFly(FlyAble f){ f.fly(); } public static void main(String[] args) { showFly(new FlyAble() { // public static int 2; // public abstract void method() @Override public void fly() { System.out.println("我能飞"); } }); } }
注意事项: