黑马java基础简记

发布时间 2023-12-04 21:27:47作者: 小柴cyl

day02——数据类型、运算符

1660832924103

需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的

- 比如23,它默认就为int类型;如果加上后缀L,则为long类型;
- 比如23.8,它默认为double类型;如果加上后缀F,则为float类型;

		// 如果希望随便写一个整型字面量是long类型的,需要在其后面加上L/l
        long number4 = 73642422442424L;

        //如果希望这个小数是float类型的,需要在后面加上:F/f
        float score1 = 99.5F;
        double score2 = 99.8; // 默认定义方案。

3.1 自动类型转换

除了byte和int之间的转换之外,其他类型也可以转换,转换顺序如下图所示

1660837456261

  • 表达式的自动类型转换
1.多种数据类型参与运算,其结果以大的数据类型为准
2.byte,short,char 三种类型数据在和其他类型数据运算时,都会转换为int类型再运算

3.2 强制类型转换

  • 强制类型转换的原理

    强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险

问题1:下面的代码否有问题?
    byte x = 10;
    byte y = 30;
	x = x + y;  //这句代码有问题,因为两个byte类型数据相加,会提升为int类型;
	
问题2:下面的代码是否有问题?
	byte x = 10;
	byte y = 30;
	x+=3; //这句代码没有问题,因为这里有隐含的强制类型转换
		  //x+=3; 等价于 byte x = (byte)(x+y);

五、案例技术:获取用户键盘输入的数据

下面是完整代码演示

public class ScannerDemo1 {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);

        int age = sc.nextInt(); 
        // 执行到这儿,会开始等待用户输入一个整数,直到用户按了回车键,才会拿到数据。

        String name = sc.next(); 
        // 执行到这儿,会开始等待用户输入一个字符串,直到用户按了回车键,才会拿到数据。
    }
}

day03——程序流程控制

String week = "周三";
switch (week){
    case "周一":
        System.out.println("埋头苦干,解决bug");
        break;
    case "周二":
        System.out.println("请求大牛程序员帮忙");
        break;
    default:
        System.out.println("您输入的星期信息不存在~~~");
}
- 1.表达式类型只能是byte、short、int、char
	JDK5开始支持枚举,JDK7开始支持String
	不支持double、float、double
    
- 2.case给出的值不允许重复,且只能是字面量,不能是变量。
		
- 3.正常使用switch的时候,不要忘记写break,否则会出现穿透现象。
// 1、导包。import java.util.Random; (idea会自动完成)
import java.util.Random;
public class RandomDemo1 {
    public static void main(String[] args) {
        Random r = new Random();
        int data = r.nextInt(10); // 0 - 9
    }
}

day04——Java数组

int[] array = {20,10,80,60,90};
String[] names = {"牛二", "西门", "全蛋"};

静态初始化格式:

数据类型[] 变量名 = new 数据类型[]{元素1,元素2,元素3};

int[] ages = new int[]{12, 24, 36}
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};

int[] ages = {12, 24, 36}
double[] scores = {89.9, 99.5, 59.5, 88.0};
int[] ages = {12, 24, 36};
for (int i = 0; i < ages.length; i++) {
    System.out.println(ages[i]); 
}

动态初始化

//数据类型[]  数组名 = new 数据类型[长度];
int[] arr = new int[3];

1661417981361

3.1 数组的执行原理,Java程序的执行原理

Java为了便于虚拟机执行Java程序,将虚拟机的内存划分为 方法区、栈、堆、本地方法栈、寄存器 这5块区域。同学们需要重点关注的是 方法区、栈、堆

下面把每一个块内存区域作用介绍一下,我们大致只需要知道每一部分存储什么内容就行。

  • 方法区:字节码文件先加载到这里
  • :方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块区域中
  • :存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在这块区域。

下面是上面案例执行的内存原理如下图所示,按照① ② ③ ④ ⑤ ⑥ 的标记的顺序来看

1661438278304

总结一下int a = 10int[] arr = new int[]{11,22,33}的区别

  • a是一个变量,在栈内存中,a变量中存储的数据就是10这个值。
  • arr也是一个变量,在栈中,存储的是数组对象在堆内存中的地址值
// 这里的int a是一个基本类型变量,存储的是一个数值
int a = 10 ; 
//这里的int[] arr是一个  引用类型  的变量,存储的是一个地址值
int[] arr = new int[]{44,55,66};


int [] a = new int[]{10,20,30};
System.out.println(a);
//[I@119d7047

day05——方法

public class MethodDemo1 {
    public static void main(String[] args) {
    }

    public static int sum(int a,int b) {
        int c = a + b;
        return c;
    }
}

我们知道Java程序的运行,都是在内存中执行的,而内存区域又分为栈、堆和方法区。那Java的方法是在哪个内存区域中执行呢?

答案是栈内存。 每次调用方法,方法都会进栈执行;执行完后,又会弹栈出去。

先记住一个结论:Java的参数传递机制都是:值传递

八、方法重载

1.什么是方法重载?
	答:一个类中,多个方法的名称相同,但它们形参列表不同。
2.方法重载需要注意什么?
	- 一个类中,只要一些方法的名称相同、形参列表不同,那么它们就是方法重载了,
	  其它的都不管(如:修饰符,返回值类型是否一样都无所谓)。
	
	- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。

day07——面向对象基础

总结一些:所谓编写对象编程,就是把要处理的数据交给对象,让对象来处理。

所以面向对象编程的好处,用一句话总结就是:面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。

一句话总结,对象其实就是一张数据表,表当中记录什么数据,对象就处理什么数据。

一句总结:对象可以理解成一张数据表,而数据表中可以有哪些数据,是有类来设计的。

三、对象在计算机中的执行原理

其实Student s1 = new Student();这句话中的原理如下

  • Student s1表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1

  • new Student()在堆内存中创建一个对象,而对象中包含学生的属性名和属性值

    同时系统会为这个Student对象分配一个地址值0x4f3f5b24

  • 接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象

  • 当执行s1.name=“播妞”时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为播妞;

四、类和对象的一些注意事项

第一条:一个代码文件中,可以写多个class类,但是只能有一个是public修饰,且public修饰的类必须和文件名相同。

第二条:对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。

五、this关键字

this是什么呢?

this就是一个变量,用在方法中,可以拿到当前类的对象。

哪一个对象调用方法方法中的this就是哪一个对象

六、构造器

  • 什么是构造器?

    构造器其实是一种特殊的方法,但是这个方法没有返回值类型,方法名必须和类名相同。

    如下图所示:下面有一个Student类,构造器名称也必须叫Student;也有空参数构造器,也可以有有参数构造器。

    public student()

  • 构造器的特点?

    在创建对象时,会调用构造器。

关于构造器的特点,我们记住一句话:new 对象就是在执行构造方法

  • 构造器的应用场景?

    其实构造器就是用来创建对象的。可以在创建对象时给对象的属性做一些初始化操作。

  • 构造器的注意事项?

    1.在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
    2.一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。
    
1.什么是构造器?
	答:构造器其实是一种特殊的方法,但是这个方法没有返回值类型,方法名必须和类名相同。
	
2.构造器什么时候执行?
	答:new 对象就是在执行构造方法;

3.构造方法的应用场景是什么?
	答:在创建对象时,可以用构造方法给成员变量赋值

4.构造方法有哪些注意事项?
	1)在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
	2)一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。

七、封装性

1. 什么是封装呢?

所谓封装,就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理数据的方法,都设计到一个对象中去。

封装的设计规范用8个字总结,就是:合理隐藏、合理暴露

2. 封装在代码中的体现

知道什么是封装之后,那封装在代码中如何体现呢?一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。

这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问。

当你想获取socre变量的值时,就得调用对外暴露的另一个方法 getScore()

八、实体JavaBean

接下来,我们学习一个面向对象编程中,经常写的一种类——叫实体JavaBean类。我们先来看什么是实体类?

1. 什么是实体类?

实体类就是一种特殊的类,它需要满足下面的要求:

这个类中的成员变量都要私有,并且要对外提供相应的get,set方法

类中必须要有一个公共的无参的构造器

实体类仅仅只是用来封装数据用的。

2. 实体类的应用场景

在实际开发中,实体类仅仅只用来封装数据,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。如下图所示

在实际应用中,会将类作为一种数据类型使用。如下图所示,在StudentOperator类中,定义一个Student类型的成员变量student,然后使用构造器给student成员变量赋值。

1662337507608

1.JavaBean实体类是什么?有啥特点
	JavaBean实体类,是一种特殊的;它需要私有化成员变量,有空参数构造方法、同时提供getXxx和setXxx方法;
	
	JavaBean实体类仅仅只用来封装数据,只提供对数据进行存和取的方法
 
2.JavaBean的应用场景?
	JavaBean实体类,只负责封装数据,而把数据处理的操作放在其他类中,以实现数据和数据处理相分离。

实例说明

  1. 第一步:定义电影类

电影类仅仅只是为了封装电影的信息,所以按照JavaBean类的标准写法来写就行。

  1. 第二步:定义电影操作类
public class MovieOperator {
    private Movie[] movies;
    public MovieOperator(Movie[] movies){
        this.movies = movies;
    }

    public void printAllMovies(){
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println("编号:" + m.getId());
            System.out.println("名称:" + m.getName());
            System.out.println("价格:" + m.getPrice());
        }
    }
}
  1. 第三步:定义测试类

最后,我们需要在测试类中,准备好所有的电影数据,并用一个数组保存起来。每一部电影的数据可以封装成一个对象。然后把对象用数组存起来即可。

public class Test {
    public static void main(String[] args) {

        Movie[] movies = new Movie[4];
        movies[0] = new Movie(1,"水门桥", 38.9, 9.8, "徐克", "吴京","12万人想看");
        ...
        
        MovieOperator operator = new MovieOperator(movies);
        ...
    }
}

九、成员变量和局部变量的区别

1662371089114

面向对象的核心点就是封装,将数据和数据的处理方式,都封装到对象中; 至于对象要封装哪些数据?对数据进行怎样的处理? 需要通过类来设计。