本文涉及的知识有入口、JavaBean、POJO、构造器、封装、继承、多态、权限修饰符、static、final、工具类、代码块、单例、常量、枚举、接口、内部类以及在IDEA里的操作。
1、入口
java下新建一个java类
前者为包名,后者为类名。
IDEA里输入“main”或者“psvm”,然后回车
生成main方法
这里就是项目执行的入口。
2、创建实体类(JavaBean)
包下创建类People
定义2个变量name和age
默认自带无参构造器,如果添加了有参构造器,则无参构造器需要自己来写。
可以用IDEA自动生成。
不选参数生成无参构造器
选择参数生成有参构造器
然后可以用IDEA生成getter /setter 方法
到这里为止就是一个POJO类,而JavaBean当中可以有其它的方法 。
比如添加个eat的方法。
3、调用
在入口Test.java的main方法里声明对象调用。
4、静态成员变量
上面的name和age是实例成员变量,需要声明对象调用。
而有些需要共享的信息,比如在线人数,可以定义为静态成员变量,入口处可以直接用类来调用。
上面的System.out.println可以在IDEA里直接输入sout回车,或者 输出内容.sout
5、静态成员方法
和静态成员变量相似,静态成员方法也可以直接用类来访问。
为了区分,我把对象people换成对象p。在IDEA里选中要修改的变量名按Shift+F6,然后就可以直接编辑,编辑完后按回车就完成了批量替换。
6、工具类
工具类是为了代码更好的复用。
比如生成验证码,注册、登录、实名认证等都可能会用到,写一个工具类,其他地方调用即可。
新建一个工具类Tool
package com.yftyzs; import java.util.Random; public class Tool { /** * 工具类构造器私有化,不让创造对象,直接用类方法使用,省内存。 */ private Tool() { } public static String code(int n) { String code=""; String data="abcdefghijklmnopqrstuvwxyz123456789"; Random r=new Random(); for (int i = 0; i <n ; i++) { int index=r.nextInt(data.length()); code+=data.charAt(index); } return code; } }
创建一个私有的无参构造器,这样别人想创建对象就会报错,从而可以直接用类方法调用,节省内存。
在IDEA里写for循环可以直接输入fori然后回车自动生成。如果需要数组或者集合的长度来设置i的大小,可以输入数组集合的名称.fori。
然后创建一个静态成员方法code根据参数长短来生成验证码。
7、代码块
代码块分为静态代码块和构造代码块。
静态代码块static{} 随着类加载,自动触发,只加载一次。用于类加载时静态数据初始化。
构造代码块{} 创建对象时执行,在构造器执行前执行。初始化实例资源。
8、单例
饿汉单例
用类获取对象时,对象已创建好。
构造器私有,定义静态变量存储对象。
创建个新类Epeople,提前创建好静态对象。
用IDEA生成getter /setter 方法
不管调用几次,构造器只执行了一次,对象是提前定义好的,节省资源。
懒汉单例
真正需要一个对象时,才去创建。
类的构造器私有
静态变量存储对象
提供一个返回单例对象的方法
也定义好name和age ,生成getter /setter 方法
9、继承
新建一个子类Man继承People,创建一个独有的方法manEat
相同名称方法的调用
会调用自己的getMax方法取小的。
如果调用父类的同名方法前面需要加super
返回结果
私有方法不能被重写,子类的访问权限应该大于或者等于父类
10、包
相同包下的类可以直接访问
不同包下的类必须要导包才能使用 import 包名.类名
如果需要的不同类的名称一样,只能导入一个类,另外的需要带包名访问。
11、权限修饰符
12、final
用final来修饰类,类不能被继承 工具类是被直接使用的可以加final
final修饰方法,方法不能被重写
final修饰变量,变量仅能赋值一次
13、常量
常量可用于系统的配置信息
使用public static final来修饰
英文单词全部大写,多个单词用下划线连接
14、枚举
枚举是用来做信息的标志和信息的分类
修饰符 enum 枚举名称{}
枚举是最终类,不能被继承
枚举的构造器私有,对外不能创建对象
入参约束严谨
15、抽象类
用abstract修饰类,这个类就是抽象类,用abstract修饰方法,这个方法就是抽象方法。
抽象方法,只有方法签名,没有方法体。
一个类如果定义了抽象方法,这个类必须声明成抽象类。
抽象类是作为父类被继承的。
子类必须要重写父类全部的抽象方法,否则子类也必须定义成抽象类。
目的是子类必须要重写父类的抽象方法。
使用场景例:抽象类来写通用邮件模板,子类重写可替代的部份。
新建个抽象类,邮件模板类EmailDemo,包含抽象方法content。邮件的头和尾做成模板。
再建个子类Email,重写邮件的内容部份。
16、接口
常量里的public static final可以省略不写
抽象方法里的public abstract可以省略不写
创建一个接口Woman
创建一个抽象方法eat,注意public abstract已省略,创建一个常量DREAM,public static final已省略
创建一个实现类Girl重写eat方法
运行结果
一个接口可以继承多个接口,这样可以整合多个接口为一个接口,方便实现类去实现。
JDK8之后,接口可以增加实例方法,前面需要加default来修饰
静态方法只能用接口名来调用,不能用子类来调用
JDK9之后可以加私有方法
17、多态
新建个软件包
创建父类People 子类Man、Woman 入口Test
发现父类声明的子类的对象 方法运行是按右边子类的来,而变量运行是按左边父类的来。
多态不能使用子类独有的功能
18、内部类
静态内部类
声明静态内部类需要加static
静态内部类可以访问外部类静态成员,不能访问实例成员。
声明对象是这样声明Outer.Inner inner=new Outer.Inner();
成员外部类
类的声明不需要static
声明对象是这样声明Outer.Inner inner=new Outer().new Inner();
静态内部类可以访问外部类静态成员,也可以访问实例成员。
静态内部类无法访问gjname而成员内部类可以
局部内部类
局部内部类放在方法、代码块、构造器等执行体里。
匿名内部类
目的是为了方便创建子类对象,简化代码
这样就可以不用再创建子类Man了
匿名内部内写出来就创建了一个匿名内部类对象