一、代码块
1构造代码块
1.格式:
{
代码
}
2.执行特点:
优先于构造方法执行,而且构造方法执行几次,构造代码块就执行几次
public class Person {
public Person(){
System.out.println("我是Person的无参构造");
}
//构造代码块
{
System.out.println("我是Person的构造代码块");
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
}
}
2静态代码块
1.格式:
static{
代码
}
2.执行特点:
优先于构造方法以及构造代码块执行,只执行一次
public class Person {
public Person(){
System.out.println("我是Person的无参构造");
}
//构造代码块
{
System.out.println("我是Person的构造代码块");
}
//静态代码块
static{
System.out.println("我是Person的静态代码块");
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
}
}
静态代码块以及构造代码块还有构造方法的执行顺序
静态代码块>构造代码块>构造方法
3.静态代码块使用场景
如果有一些数据需要先初始化,而且是需要初始化一次,那么这些数据就可以放到静态代码块中
二、内部类
1.什么时候使用内部类:
当一个事物的内部,还有一个部分需要完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类
比如:人类都有心脏,人类本身需要用属性,行为去描述,那么人类内部的心脏也需要心脏特殊的属性和行为来描述,此时心脏就可以定义成内部类,人类中的一个内部类
当一个类内部的成员也需要用属性和行为描述时,就可以定义成内部类了
2.在java中允许一个类的定义位于另外一个类内部,前者就称之为内部类,后者称之为外部类
class A{
class B{
}
}
A就是B的外部类
B就是A的内部类
3.分类:
成员内部类(静态,非静态)
局部内部类
匿名内部类(重点) -> 匿名内部类属于局部内部类一种
1 静态成员内部类
1.格式:直接在定义内部类的时候加上static关键字即可
public class A{
static class B{
}
}
2.注意:
a.内部类中可以定义属性,方法,构造等
b.静态内部类可以被final或者abstract修饰
给final修饰,不能被继承
被abstract修饰,不能new
c.静态内部类不能调用外部的非静态成员
d.内部类还可以被四种权限修饰符修饰
3.调用静态内部类成员:
外部类.内部类 对象名 = new 外部类.内部类()
public class Person {
public void eat(){
System.out.println("人要吃饭");
}
/**
* 静态成员内部类
*/
static class Heart{
public void jump(){
System.out.println("心脏在咣咣咣地跳");
}
}
}
public class Test01 {
public static void main(String[] args) {
Person.Heart heart = new Person().new Heart();
heart.jump();
}
}
外部类的成员变量和内部类的成员变量以及内部类的局部变量重名时,怎么区分?
public class Student {
String name = "张三";
class Heart{
String name = "李四";
public void display(String name){
System.out.println(name);//参数name 就近原则,先访问局部的
System.out.println(this.name);//本类name 李四
System.out.println(Student.this.name);//外部类name 张三
}
}
}
3.局部内部类
1.局部内部类基本操作
1.可以定义在方法中,代码块中,构造方法中
public class Person {
public void eat(){
//局部内部类
class Heart{
public void jump(){
System.out.println("跳跳跳跳");
}
}
Heart heart = new Heart();
heart.jump();
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
person.eat();
}
}
2.局部内部类实际操作
1.接口类型作为方法参数传递和返回
接口作为方法参数传递,传递的是实现类对象
接口作为方法返回值返回,返回的也是实现类对象
public interface USB {
public abstract void open();
}
public class Mouse implements USB{
@Override
public void open() {
System.out.println("鼠标打开了");
}
}
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
method(mouse);
System.out.println("==============");
USB usb = method02();//USB usb = mouse
usb.open();
}
public static void method(USB usb){//USB usb = mouse
usb.open();
}
public static USB method02(){
Mouse mouse = new Mouse();
return mouse;
}
}
2.抽象类作为方法参数和返回值
1.抽象类作为方法参数传递,传递的是子类对象
2.抽象类作为方法返回值返回,返回的也是子类对象
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
public class Test01 {
public static void main(String[] args) {
Dog dog = new Dog();
method01(dog);
System.out.println("============");
Animal animal = method02();
animal.eat();
}
public static void method01(Animal animal){//Animal animal = dog
animal.eat();
}
public static Animal method02(){
return new Dog();
}
}
3.普通类做方法参数和返回值
1.普通类做方法参数传递,传递的是对象
2.普通类做方法返回值返回,返回的也是对象
public class Person {
public void eat(){
System.out.println("人要吃饭");
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
method(person);
System.out.println("==============");
Person person1 = method01();
person1.eat();
}
public static void method(Person person){
person.eat();
}
public static Person method01(){
return new Person();
}
}
4.局部内部类实际操作
public interface USB {
public abstract void open();
}
public class Test01 {
public static void main(String[] args) {
USB usb = method();
usb.open();
}
/**
* 接口类型作为方法返回值返回,我们应该返回的是USB的实现类对象
* @return
*/
public static USB method(){
class Mouse implements USB{
@Override
public void open() {
System.out.println("USB开启");
}
}
return new Mouse();
}
}
4.匿名内部类(重点)
1.之前写的局部内部类我们是显式的声明出了这个内部类叫啥,所以我们可以理解为这个叫做有名的内部类,而且这个内部类都是做了接口的实现类使用
2.匿名内部类:没有显式地定义出来的内部类(咱们看不见定义内部类这个操作),这个匿名内部类,也是做接口的实现类使用
3.如何快速学习匿名内部类:
a.知道所谓的匿名内部类就是没有显式定义出来的内部类
b.直接从new匿名内部类的对象开始学习
1.匿名内部类基本使用
1.格式1:利用匿名对象的方式来创建匿名内部类对象
new 接口/抽象类(){
重写方法
}.重写的方法();
好比是: new Person().eat()
2.格式2:利用有名对象的方式来创建匿名内部类对象
接口名/抽象类名 对象名 = new 接口/抽象类(){
重写方法
};
对象名.重写的方法();
好比是: Person p = new Person()
p.eat()
3.作用:
假如,我们就只临时实现一下某个接口的某个抽象方法,然后临时调用一次这个重写的方法,我们之前的做法:
a.定义一个实现类
b.实现这个接口
c.重写我们要调用的方法
d.创建这个实现类对象,调用重写的方法
如果接口中的方法只调用一次,我们就没有必要写以上四步了,因为为了简单的一次调用做以上四步操作,麻烦
所以我们可以考虑使用匿名内部类方式去实现想要调用的方法
从格式上来看,我们使用匿名内部类去实现想要调用的方法,我们用了一种格式代替了以上四步骤 -> 四合一
public interface USB {
void open();
}
public class Test01 {
public static void main(String[] args) {
/*
1.格式1:利用匿名对象的方式来创建匿名内部类对象
new 接口/抽象类(){
重写方法
}.重写的方法();
好比是: new Person().eat()
*/
new USB(){
@Override
public void open() {
System.out.println("USB打开了");
}
}.open();
System.out.println("========================");
/*
2.格式2:利用有名对象的方式来创建匿名内部类对象
接口名/抽象类名 对象名 = new 接口/抽象类(){
重写方法
};
对象名.重写的方法();
好比是: Person p = new Person()
p.eat()
*/
USB usb = new USB(){
@Override
public void open() {
System.out.println("usb又打开了");
}
};
usb.open();
}
}
2 匿名内部类复杂用法_当参数传递
public interface USB {
public abstract void open();
}
public class Test {
public static void main(String[] args) {
method(new USB() {
@Override
public void open() {
System.out.println("open");
}
});
}
public static void method(USB usb){
usb.open();
}
}
3 匿名内部类复杂用法_当返回值返回
public interface USB {
public abstract void open();
}
public class Test02 {
public static void main(String[] args) {
USB usb = method();
usb.open();
}
public static USB method(){
return new USB() {
@Override
public void open() {
System.out.println("usb打开了");
}
};
/*USB usb = new USB() {
@Override
public void open() {
System.out.println("usb打开了");
}
};
return usb;*/
}
}
三、lombok
如何导入第三方jar包:
1.在当前模块下创建文件夹-> 右键 -> new -> Directory(文件夹) -> 取名为lib或者libs
2.将想要导入的jar包粘贴到lib文件夹下
3.解压jar包 -> 对着想要解压的jar包或者对着lib文件夹右键 -> add as library -> level选项中选择module,此时上面名字叫做name的输入框会变成空的-> ok
1.概述:属于第三方工具
2.作用:简化javabean开发
3.使用:
a.导入jar包
b.使用里面的注解
1.lombok介绍
Lombok通过增加一些“处理程序”,可以让javabean变得简洁、快速。
Lombok能以注解形式来简化java代码,提高开发效率。开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
2.lombok常用注解
1.@Getter和@Setter
-
作用:生成成员变量的get和set方法。
-
写在成员变量上,指对当前成员变量有效。
-
写在类上,对所有成员变量有效。
-
注意:静态成员变量无效。
2.@ToString
-
作用:生成toString()方法。
-
注解只能写在类上。
3.@NoArgsConstructor和@AllArgsConstructor
-
@NoArgsConstructor:无参数构造方法。
-
@AllArgsConstructor:满参数构造方法。
-
注解只能写在类上。
4.@EqualsAndHashCode
-
作用:生成hashCode()和equals()方法。
-
注解只能写在类上。
5.@Data
-
作用:生成get/set,toString,hashCode,equals,无参构造方法
-
注解只能写在类上。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private int age;
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
person.setName("涛哥");
person.setAge(18);
System.out.println(person.getName()+"..."+person.getAge());
System.out.println("=======================");
Person person2 = new Person("小明", 18);
System.out.println(person2.getName()+"..."+person2.getAge());
}
}
四、单元测试
1.Junit介绍
1.概述:单元测试框架
2.作用:代替main方法测试其他开发好的方法是否能运行成功,以及查看结果
3.使用:导入Junit的jar包
2.Junit的基本使用(重点)
1.在要测试的方法上面用注解: @Test
public class Demo01Junit {
@Test
public void test01(){
System.out.println("我是@Test");
}
}
3.Junit的注意事项
1.@Test不能修饰带参数的方法
2.@Test不能修饰带返回值的方法
3.@Test不能修饰静态方法
4.Junit相关注解
@Before:在@Test之前执行,有多少个@Test一起执行@Before就执行多少次 -> 初始化数据
@After:在@Test之后执行,有多少个@Test一起执行@After就执行多少次 -> 销毁对象使用
public class Demo01Junit {
@Test
public void test01(){
System.out.println("我是@Test");
}
@Test
public void test02(){
System.out.println("我是@Test");
}
@Before
public void testBef(){
System.out.println("我是@Before");
}
@After
public void testAft(){
System.out.println("我是@After");
}
}
5.@Test以后怎么使用
public class Demo02CategoryJunit {
/**
* 测试添加商品分类的方法
*/
@Test
public void insert(){
CategoryImpl category = new CategoryImpl();
boolean result = category.insertCategory("服装", "箱包", "手机", "电脑");
System.out.println("result = " + result);
}
/**
* 测试查询所有商品分类的方法
*/
@Test
public void selectAll(){
CategoryImpl category = new CategoryImpl();
ArrayList<String> list = category.selectAllCategory();
System.out.println(list);
}
}
public class CategoryImpl {
/**
* 添加功能
*/
public boolean insertCategory(String...str){
/*
创建集合-> ArrayList
<String> 规定集合中能存储什么类型的数据
*/
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
//将元素放到集合中
list.add(str[i]);
}
return true;
}
/**
* 查询所有分类
*/
public ArrayList<String> selectAllCategory(){
ArrayList<String> list = new ArrayList<>();
list.add("手机");
list.add("电脑");
list.add("服装");
list.add("图书");
list.add("食品");
list.add("运动");
list.add("家电");
list.add("家具");
list.add("食品");
return list;
}
}
标签:Java,void,零到,Person,Day11,println,new,public,out
From: https://blog.csdn.net/NJG1013/article/details/145152101