三大修饰符
代码块
作用: 封装一段代码
语法:
{}
定义位置:
1.方法中
注意: 此时不会影响代码的运行,定义相当于没定义
2.类中,方法以外
注意:
1.此时每次创建该类对象时,就会执行该代码块中的代码
2.该代码块在构造函数前执行
3.在对象的属性赋初始值之后
static
含义: 静态
可以修饰:
属性
含义: 公共的(使用static修饰的属性属于该类的所有对象,如果其中一个对其进行修改,那么该类的所有对象的该属性都将被修改)
使用方式:
对象名.属性名
或
类名.属性名
注意:
static修饰的属性不管该类有多少个对象,该属性只有一个
方法
含义: 静态方法
使用方式:
对象名.方法名(实参列表);
或
类名.方法名(实参列表);
注意:
静态方法中不能直接使用非静态成员(没有使用static修饰的属性或方法)
静态方法中不能使用this或super关键字
代码块
调用时机: JVM加载该类时调用
由于一个类只会被加载一次,所以该代码块只会被执行一次
语法:
static{
}
内部类(以后补充)
类加载
总结: 使用该类时
如:
使用类名调用静态属性或静态方法
创建该类对象
创建其子类对象
获取类对象时
在静态下对象的创建过程
没有继承关系
1.加载该类
2.给静态属性赋初始值
3.执行静态代码块中的代码
4.在堆内存中开辟空间
5.给非静态属性赋初始值
6.执行代码块中的代码
7.执行构造函数
8.赋值给栈中的引用
总结: 先静态,再非静态
final
含义: 最终的,不可修改的
可以修饰:
类
语法:
访问权限修饰符 final class 类名{
}
特点: final修饰的类不能被别的类继承
属性
语法:
访问权限修饰符 final 数据类型 属性名 = 值;
特点:
final修饰的属性必须在声明时赋值
值不能被修改
方法
语法:
访问权限修饰符 final 返回值类型 方法名(形参列表){
}
特点:
final修饰的方法不能被重写
局部变量
语法:
final 数据类型 变量名;
注意:
final修饰的局部变量只能赋值一次
名称:
公共静态常量: 使用public static final修饰的属性
公共静态方法: 使用public static修饰的方法
常量
概念: 不能被修改的变量或值称为常量
abstract
含义: 抽象的
可以修饰:
类
特点: 不能直接创建对象
语法:
访问权限修饰符 abstract class 类名{
属性
方法
构造函数
代码块
静态代码块
}
方法:
特点: 没有方法体
语法:
访问权限修饰符 abstratc 返回值类型 方法名(形参列表);
注意:
有抽象方法的类一定是抽象类
抽象类中不一定有抽象方法
子类继承于抽象类,要么重写父类所有抽象方法,要么自己也是抽象类
abstract能否与static一起使用
不能一起使用
abstract能否与final一起使用
不能一起使用
static能否与final一起使用
可以一起修饰属性,方法
案例
宠物医生给宠物治病,宠物有猫,狗,鱼
宠物医生: 小李
宠物:
旺财,黄,公(狗)
富贵,白,公(狗)
布丁,白,母(猫)
金龙,黄,雌(鱼)
小李给以上宠物治病,病好后,狗叫汪汪汪,猫叫喵喵喵,鱼叫咕噜噜
对象:
小李 旺财 富贵 布丁 金龙
类:
医生类
属性: 名称
方法: 看病(动物的对象){
sout(name + "给" + 动物对象.getName() + "看病");
动物对象.叫();
}
动物类
属性: 名称,性别,颜色
构造函数
方法:
get与set
叫: 因为无法具体描述,所以是一个抽象方法
因为动物类中有抽象方法,所以动物类也是抽象类
狗类
继承于动物类
必须重写父类中叫的方法
猫类
继承于动物类
必须重写父类中叫的方法
鱼类
继承于动物类
必须重写父类中叫的方法
环境类(测试类)
main
创建对象
建立关系
package demo01;
//动物类
public abstract class Animal {
private String name;
private String sex;
private String color;
public Animal() {
}
public Animal(String name, String sex, String color) {
this.name = name;
this.sex = sex;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract void call();
}
package demo01;
//狗类
public class Dog extends Animal{
public Dog() {
super();
}
public Dog(String name, String sex, String color) {
super(name, sex, color);
}
public void call() {
System.out.println(getName() + "汪汪汪");
}
}
package demo01;
//猫类
public class Cat extends Animal{
public Cat() {
super();
}
public Cat(String name, String sex, String color) {
super(name, sex, color);
}
public void call() {
System.out.println(getName() + "喵喵喵");
}
}
package demo01;
//鱼类
public class Fish extends Animal{
public Fish() {
super();
}
public Fish(String name, String sex, String color) {
super(name, sex, color);
}
public void call() {
System.out.println(getName() + "咕噜噜");
}
}
package demo01;
//医生类
public class Doctor {
private String name;
public Doctor() {
}
public Doctor(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void treat(Animal a) {
System.out.print(name + "给" + a.getName() + "看病, ");
a.call();
}
}
package demo01;
//测试类
public class Test {
public static void main(String[] args) {
Doctor doctor = new Doctor("小李");
Dog dog1 = new Dog("旺财", "公", "黄");
Dog dog2 = new Dog("富贵", "公", "白");
Cat cat = new Cat("布丁", "母", "白");
Fish fish = new Fish("金龙", "雌", "黄");
doctor.treat(dog1);
doctor.treat(dog2);
doctor.treat(cat);
doctor.treat(fish);
}
}
运行结果
案例
记录一个类的对象创建次数
分析:
可以在代码块中统计对象的创建次数
package demo02;
public class Test {
public static void main(String[] args) {
System.out.println("创建对象前, 创建次数为: " + A.count);
new A();
System.out.println("创建1次, 创建次数为: " + A.count);
new A();
new A();
new A();
System.out.println("创建4次, 创建次数为: " + A.count);
}
}
class A {
{
count++;
}
public static int count;
public A() {
}
}
运行结果