JAVASE基础(八)
来源:互联网 发布:淘宝会员怎么注册 编辑:程序博客网 时间:2024/05/22 06:31
一、构造函数
构造函数的作用: 给对应的对象进行初始化。
构造函数的格式:
修饰符 函数名(形式参数列表){ 初始化的语句;}
构造函数要注意的细节:
1. 构造函数是没有返回值类型的。
2. 构造函数的函数名必须 与类名一致。
3. 构造函数并不是由我们手动调用的, 构造函数是在创建对应对象的时候由jvm主动调用的(每创建一个对象就会调用一次构造函数)。
4. 如果一个类没有显式的添加一个构造函数,那么java编译器会为该类添加一个无参的构造函数。
5. 如果一个类已经显式的添加一个构造函数,那么java编译器则不会再为该类添加一个无参的构造函数。
6. 构造函数是可以以函数重载的形式存在多个的。
疑问1 :我们现在知道创建对象的时候,jvm需要调用到对应的构造方法,那么以前我们没有学构造方法,那么
jvm还会调用到构造方法吗?而且构造方法存在吗?
存在构造方法的, 但是不是java虚拟机添加的,是java编译器添加的。
疑问2:java编译器添加的无参构造函数的修饰符是什么?
无参的构造函数的权限修饰符是与类名一致的。
如何反编译: 反编译可以使用jdk给我们提供的开发工具—》javap
javap -c -l -private class文件
问题:重复代码。
构造函数的作用:给对应的对象进行初始化。
构造代码块:给所有的对象进行统一的初始化。
构造代码块格式:
{
初始化语句;
}
代码块的类型:
构造代码块: 代码块位于成员位置上。局部代码块 :代码块位于方法之内。
局部代码块的作用: 缩短局部变量的生命周期。
构造代码块要注意的细节:
1. 构造函数 的代码是位于成员变量的显式初始化 语句、构造代码块语句之后执行 的。
2. 成员变量的显式初始化语句与构造代码块的语句的先后执行顺序是按照当前代码的顺序执行的。
3. 成员变量的初始化语句和构造代码块的代码其实是在构造函数中完成的。
class Person{ //成员位置是不能编写执行语句, 只能用于声明一个变量或者是一个函数。 //构造代码块 { i = 200000000; } public Person(){ i= 30000000; } int i = 100000000; //显式初始化}class Demo5 { public static void main(String[] args) { Person p = new Person(); System.out.println("i:"+ p.i); //i==3000000 }}
this关键字
this关键字: this关键字代表的是所属函数的调用者对象。
问题: 存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,如何才能访问成员变量呢?
this关键字的作用:
1. 一个类存在着同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,我们可以通过this关键字指定
访问成员变量的数据。
2. this关键字可以在构造函数中调用其他的构造函数初始化对象使用。
this关键字要注意的细节:
1. 如果在一个函数中访问一个成员变量,而且没有存在同名的局部变量 时,那么java编译器会默认在变量的前面加上this关键字的。
2. this关键字调用 其他的构造函数时,this语句必须 位于构造函数中的第一个语句。
3. this关键字调用构造函数的时候不准出现相互调用的情况,因为是一个死循环的调用方式。
class Animal{ int id; // 编号 String name; //成员变量 String color; //颜色 public Animal(int id,String name,String color){ //this(); //调用了本类无参的构造函数。 this(name,color); //调用到两个参数的构造函数 this.id = id; } //构造函数 public Animal(String name,String color){ //形式参数也是属于局部变量。 this.name = name; this.color =color; } // this关键字代表的是所属函数的调用者对象。 public void eat(){ String name = "猫"; //局部变量 System.out.println(this.name+"在吃饭..."); } public void sleep(){ System.out.println(name+"在睡觉...."); }}class Demo7{ public static void main(String[] args) { /* Animal a1 = new Animal(); Animal a2 = new Animal(); System.out.println("a1:"+ a1); System.out.println("a2:"+ a2); */ Animal a1 = new Animal("哈巴狗","白色"); Animal a2 = new Animal(999,"沙皮狗","米黄色"); //a1.sleep(); System.out.println("名字:"+a1.name+" 颜色:"+ a1.color); System.out.println("编号:"+ a2.id+ " 名字:"+a2.name+" 颜色:"+ a2.color); }}
三、static(静态)
static(静态): 修饰符
static修饰成员变量: 如果一个数据需要被所有对象共享使用的时候,那么即可使用static修饰该成员变量。 访问方式: 方式1: 可以使用对象进行访问。 格式:对象.静态属性名 方式2: 可以使用类名进行访问。 格式: 类名.属性名。 推荐使用:可以使用类名进行访问。静态成员变量要注意的细节: 1. 静态的成员变量可以使用类名或者是对象进行访问。 2. 非静态的成员变量只能使用对象进行 访问,不能使用类名直接访问。 3. 千万不要为了方便访问而使用static修饰一个成员变量,只有这个成员变量的数据是需要被共享的时候 才使用static修饰。static修饰成员函数: 静态函数的访问方式: 方式一:使用对象访问。 格式: 对象.函数名() 方式二:使用类名访问。 格式: 类名.函数名(); 静态函数要注意的细节: 1. 非静态的函数只能使用对象调用,不能使用类名调用。 2. 静态函数可以直接访问静态的成员,但是不能直接访问非静态的成员。 原因:静态函数可以使用类名调用,而这时候对象可能还没有存在内存中,这时候非静态的数据也就不存在内存中。 3. 非静态函数可以直接访问静态以及非静态的成员。 原因:非静态函数必须要由对象调用,如果对象存在了,静态数据以及非静态数据早就存在内存中了。 4. 静态函数不能出现this以及super关键字。 原因:因为静态函数可以使用类名直接调用,而这时候可能还没有对象存在,this又要代表当前对象。什么时候使用static修饰一个函数呢? 如果一个函数没有直接访问非静态的成员,那么即可使用static修饰该函数了。(常用于工具类的方法 Arrays)非静态的成员变量与静态成员变量的区别: 数量上的区别: (n份)非静态成员变量是在每个对象中都维护一份数据 (1份)静态成员变量只会在方法中维护一份数据。 访问方式上的区别: 非静态的成员变量只能使用对象进行访问. 静态成员变量可以使用对象、类名进行访问。 存储位置上的区别; 非静态成员变量是存储在堆内存中。 静态成员变量是存储在方法区中。 生命周期的区别: 非静态成员变量是随着对象的创建而存在,随着对象的消失而消失。 静态成员变量是随着类文件的加载而存在,随着类文件(字节码文件)的消失而消失。 作用上的区别: 非静态成员变量的作用是用于描述一类事物的属性。 静态成员变量的作用是提供一个共享数据给所有对象使用的。
内存图:
static数据加载过程:
练习:
需求1 : 统计一个类创建对象的个数。 静态成员变量的应用场景之一。
利用构造代码块,创建一次对象,构造代码块执行一次
//人类class Person{ int id; String name; static int count = 0; //定义一个计数器 非静态成员变量。 //构造代码块 { count++; } public Person(){ } //构造函数 public Person(int id,String name){ this.id = id; this.name = name; System.out.println("构造函数调用了...."); }}class Demo2 { public static void main(String[] args) { Person p1 = new Person(110,"狗娃1"); Person p2 = new Person(110,"狗娃2"); Person p3 = new Person(110,"狗娃3"); System.out.println("创建对象的个数:"+Person.count); }}
需求2: 自己实现一个Arrays工具类。
toString(); 返回一个使用数组元素拼装好的字符串。
sort();
class MyArrays{ // [1,2,4] public static String toString(int[] arr){ String result = ""; for(int i = 0 ; i< arr.length ; i++){ if(i==0){ result += "["+arr[i]+","; }else if(i==(arr.length-1)){ result += arr[i]+"]"; }else{ result +=arr[i]+","; } } return result; } //排序 public static void sort(int[] arr){ for (int i = 0 ; i< arr.length-1 ;i++ ){ for(int j = 0 ; j<arr.length-1-i ; j++){ if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }}class Demo3 { public static void main(String[] args) { int[] arr = {12,11,19,14}; MyArrays.sort(arr); String info = MyArrays.toString(arr); System.out.println("数组的元素:"+ info); }}
- JAVASE基础(八)
- Android之JAVASe基础篇-面向对象-常用类库(八)
- JavaSE基础(一)
- JavaSE基础(二)
- JavaSE基础(三)
- JavaSE基础(四)
- JavaSE基础(五)
- JavaSE基础(六)
- JAVASE基础(一)
- JAVASE基础(二)
- JAVASE基础(三)
- JAVASE基础(四)
- JAVASE基础(七)
- JAVASE基础(九)
- JAVASE基础(十)
- JAVASE基础(十一)
- JAVASE基础(十二)
- JAVASE基础(十五)
- Python3笔记-廖雪峰
- React 如何阻止事件冒泡?
- JavaScript
- Java 数组的插入排序
- Cookie/Session机制详解
- JAVASE基础(八)
- LOJ6212-「美团 CodeM 决赛」melon
- CSS变量variable
- linux 配置网络
- java 多态
- 策略模式(Strategy Pattern)
- ConcurrentHashMap实现原理
- 【Java编程】编写一个计算N个整数平均值的程序
- 2017多校联合四1011/hdu6077Time To Get Up(模拟)