1.类变量和类方法
1.1static变量
(1)类变量:
也叫静态变量/静态属性,所有对象共享并且所有对象访问的值是相同的
static变量是同一个类所有对象共享的
static类变量,在类加载的时候就生成了
(2)定义语法:
一种:访问修饰符 static 数据类型 变量名;
static 访问修饰符 数据类型 变量名;
(3)访问方式:
类名.类变量名(推荐)
(4)使用细节
加上static称为类变量/静态变量,否则称为实例变量/普通变量/非静态变量;
它们的区别在于类变量是该类所有对象共享的,而实例变量是所有对象都可以共享的。
1.2 类方法
(1)也叫静态方法;
(2)定义语法:
一种:访问修饰符 static 数据类型 方法名(){};(推荐!)
另一种:stati c 访问修饰符 数据类型 方法名(){};
(3)访问方式:
类名.类变量名(推荐)
(4)特殊细节:
当方法不涉及任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率;例如Math类,Arrays类等,可以直接用类名去调用类的静态方法;
(5)使用细节:
类方法中不能使用this,super等和对象有关的关键字/参数;
类方法/静态方法只能访问静态类和静态方法;
普通方法既可以访问静态,也可以访问普通的 ;
2.main()方法
1.1main()方法由java虚拟机调用,所以要public并且要static;
2.2由于main()属于静态方法,所以它满足上述类变量和类方法的所有规则
3.代码块
3.1代码块的定义
3.2代码块的应用
(1)不管调用哪个构造器,创建对象时,都会先调用代码块的内容,再生成 构造器;即代码块调用的顺序优先于构造器 !
3.3代码块注意事项
(1) Static静态代码块
那么类什么时候被加载?(这个重要,要背下来)
注:
DD dd=new DD();
DD dd1=new DD();
这种连续生成实例的情况下,类只会 被加载一次,因此static代码块也只会被执行一次;
(2)普通代码块
(3)在创建一个对象时,在一个类中的调用顺序如下:
(4)为什么构造器在生成对象时最后才调用
在调用构造器时,会先调用一个super()方法,去找到父类的构造器,初始化完父类构造器后,还要再调用普通代码块;
(5) 创建一个子类时,静态属性、代码块;普通属性、代码块;构造方法的调用顺序为:
注意:不须考虑静态方法,因为静态方法只有在对象或类调用时才会执行
(6)静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员;
4.单例设计模式
4.1 饿汉式
public class singleCase01 {public static void main(String[] args) {GirlFriend fd=GirlFriend.getFriend();System.out.println(fd);}
}class GirlFriend{private String name;//饿汉式//1.将构造器私有化//2.在类的内部直接创建//3.提供一个公共的static方法,返回friend对象private static GirlFriend friend = new GirlFriend("小红");private GirlFriend(String name) {this.name = name;}public static GirlFriend getFriend() {return friend;}@Overridepublic String toString() {return "GirlFriend{" +"name='" + name + '\'' +'}';}
}
4.2 懒汉式
public class singleCase02 {public static void main(String[] args) {GirlFriend2 fd=GirlFriend2.getFriend();System.out.println(fd);}
}class GirlFriend2{private String name;private static GirlFriend2 friend;public GirlFriend2(String name) {this.name = name;}public static GirlFriend2 getFriend() {if (friend == null) {friend=new GirlFriend2("小红");}return friend;}@Overridepublic String toString() {return "GirlFriend2{" +"name='" + name + '\'' +'}';}
}
5.java_final的基本使用
5.1基本情形
5.2 使用细节
(1)final变量在定义时必须赋值,赋值位置可以在定义语句、在构造器或者在代码块中;
(2)但如果final修饰的属性为静态属性,则只能在定义语句和静态代码块两处赋值;
感觉一般把final放在了访问修饰符的后面叭;
(3)final int x; ————final关键字不能被修改
6.抽象类
6.1 定义
一般来说,抽象类会被其子类继承并实现具体方法;
*注:抽象方法不能有方法体;抽象类不能被实例
化;抽象类可以没有抽象方法,但抽象方法一定要在抽象类中 *
7.接口
7.1定 义
注:
(1)在接口中,可以直接省略abstract关键字;
(2)一个类implement一个接口时,它需要重写该接口的所有抽象方法;
7.1 使用注意事项
class A implement interface1说明class已经执行接口的属性了,拥有和接口一样的访问权限;
7.2接口vs继承
可以理解为:实现接口是对java单继承机制的一种补充
7.3 接口多态
(1)可以用A instanceof <类>来判断A的运行类型是否为特定类;
7.4接口的多态传递
(1)接口类型的变量可以指向实现了该接口的类的对象实例;
(2)接口继承就能实现多态传递;
7.5 至今类的迭代
8.内部类
类的五大成员:属性,方法,构造器,代码块,内部类
8.1内部类定义
8.2内部类分类(4种)
(1)局部内部类
(2)匿名内部类(重要!!!)
基于接口的匿名内部类举例
基于类的匿名内部类
匿名内部类的使用注意事项
匿名内部类的常用实践举例
public class innerClassExercise {public static void main(String[] args) {Phone phone = new Phone();phone.alarmclock(new Bell(){public void ring(){System.out.println("懒猪起床了");}});phone.alarmclock(new Bell(){public void ring(){System.out.println("小伙伴上课了。。。。");}});}}interface Bell{public void ring();
}class Phone{public void alarmclock(Bell bell){bell.ring();}
}
(3)成员内部类
外部类要使用成员内部类的方法:
外部其他类要使用成员内部类时
public void getInner08Instance(){return new Inner08;
}
(4)静态内部类
外部其他类访问静态内部类
当外部类和静态内部类中的属性重名时,可以直接使用:外部类名.成员去访问;(因为本身静态属性就不要实例对象,所以this存在没有意义,this它代表的是实例对象)