类
什么是类
- 什么是类?
类是一个模板,描述了一类对象的行为和状态。
- 什么是对象?
对象是类的实例,具有行为和状态。
例如:一只猫就是一个对象,他有品种、颜色、性别等状态;会叫、跑、吃等行为。
类的基本结构:
[修饰符] class 类名{
0到多个构造器
0到多个成员变量
0到多个方法
0到多个初始化块
}
- 修饰符可以写public final abstract或者不写。
- java类名要用驼峰命名法(即每个单词的首字母大写)。
- 一个java源文件(也就是文件后缀名为.java的文件)可以写多个类,但是里面只能有一个用public修饰的class,
- 什么是构造器(构造方法或者叫构造函数)
与类名相同,但是没有返回值。
public class TestController{
TestController(){}//构造器
}
- 构造器可以重载。
- 默认会添加一个无参构造器。
- 对象使用new关键字实例化时,jvm给对象分配内存,并初始化,对象的成员变量被设置为初始值;如果没有构造器,就要手动初始化所有的成员变量,以确保对象的数据是有意义的。在对象实例化的时候,构造器确保了对象的成员变量都是有意义的数据。
什么是抽象类
被abstract修饰的类叫做抽象类。
特点:
- 抽象类不能实例化。可以借助子类实例化。
- 抽象类中才能有抽象方法。抽象类中还可以有普通方法。
- 构造方法和static修饰的方法不能是抽象的。
- abstract不能与final并列修饰同一个类。
- abstract 不能与private、static、final或native并列修饰同一个方法。
实例:
抽象类:
public abstract class Develop {
public abstract void work();
public abstract void motion();
public abstract void eat();
}
//具体的子类:可以实例化对象
public class AbstractTest extends Develop{
public static void main(String[] args) {
//子类对象
AbstractTest abstractTest =new AbstractTest ();
abstractTest.work();
abstractTest.motion();
abstractTest.eat();
}
@Override
public void work() {
System.out.println("写程序");
}
@Override
public void motion() {
System.out.println("写完程序了去做会运动,放松一下吧");
}
public void eat() {
System.out.println("做完运动饿了,吃点东西");
}
}
运行结果:
写程序
写完程序了去做会运动,放松一下吧
做完运动饿了,吃点东西
注意:
Java中的抽象方法不能同时和static、final、private公用。原因如下:
- static:在抽象类中定义抽象方法时是不能定义static(静态)的,否则编译器会报错,因为静态方法属于类,所以静态方法必须满足给类调用,而抽象方法是只能在子类中才能被调用的,所以两者同时使用冲突。
- final:abstract修饰的类是需要子类继承的,abstract修饰的方法是需要子类重写的,但是final修饰的类不能被继承,final修饰的方法也不能被重写。
- private:abstract修饰的方法必须通过子类重写才有效,而被private修饰的方法对子类不可见。
补充
类的加载顺序(JVM)
实例化类对象时,如果类里有代码块、静态代码块、构造方法、静态成员、非静态成员时,它们的加载顺序是:
静态成员/代码块→非静态成员/代码块→构造方法
public class TestMain {
//实例化代码块.每次生成类实例,都会执行.并且,实例化代码块的执行 优先于 构造器.
{
System.out.println("这里是普通代码块");
}
//静态语句块,在类初始化时,仅仅执行一次.
static{
System.out.println("这里是静态代码块");
}
//类实例
public static TestMain t1 = new TestMain();
//构造器方法
TestMain(){
System.out.println("这里是构造器");
}
public static void main(String[] args)
{
//类实例
TestMain t2 = new TestMain();
}
}
运行结果:
这里是静态代码块
这里是普通代码块
这里是构造器
这里是普通代码块
这里是构造器