Java学习笔记(7)
构造函数:
构造函数的作用:给对应的对象进行初始化。
构造函数定义的格式:
修饰符 函数名(形式参数){
函数体...
}
构造函数要注意的细节:
- 构造函数是没有返回值类型的
- 构造函数的函数名必须与类名一致
- 构造函数并不是我们手动调用的,而是在创建对应的对象时,jvm就会主动调用到对应的构造函数
- 如果一个类没有显式的写上一个构造方法时,那么Java编译器会为该类添加一个无参的构造函数的。
- 如果一个类已经显式写上一个构造方法时,那么java编译器则不会再为该类添加一个无参的构造方法。
- 构造函数时可以在一个类中以函数重载的形式存在多个的
java编译器为我们添加的构造方法的权限修饰符与类的权限修饰符一致/
jdk提供了一个开发工具(javap.exe)给我们进行反编译。
javap反编译工具的使用格式:
javap -c(反编译代码) -l(打印行号和本地变量表) -private (显示类和所有成员) 类名
构造函数与普通函数的区别:
- 构造函数时没有返回值类型的
- 普通函数是有返回值类型的,即使函数没有返回值,返回值类型也要写上void
- 构造函数的函数名必须要与类名一致
- 普通函数的函数名只要符合标识符的命名规则即可
- 构造函数是在创建的时候由jvm调用的
- 普通函数是由我们使用对象调用的,一个对象可以调用多次普通的函数
- 构造函数的作用用于初始化一个对象
- 普通函数是用于描述一类事物的公共行为的
构造代码块:给对象进行统一的初始化。
构造代码块的格式:
{
构造代码块;
}
注意:构造代码块的大括号必须位于成员位置上。
代码块的类别:
- 构造代码块
- 局部代码块 大括号位于方法之内 作用:缩短局部变量的生命周期,节省一点点内存
- 静态代码块
构造代码块要注意的事项:
- java编译器b编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端。 (注意是声明,不是赋值)
- 成员变量的初始化工作其实都是在构造函数中执行的。
- 一旦经过java编译器b编译后,那么构造代码块d的代码就会被移动到构造函数中执行,是在构造函数前面执行的,构造函数中的代码是最后执行的。
- 成员变量的显式初始化与构造代码块的代码是按照当前代码的顺序执行的。
如果存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java采取的是就近原则的机制访问的。)
public class Creative {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a=new Animal();
a.eat();
}
}
class Animal{
String name="狗";
String color;
public void eat() {
String name="鸡";
System.out.println(name+"在吃.");
}
}
比如这里就是鸡在吃而不是狗在吃。
ps:栈内存又叫方法栈,一个方法要运行的时候,jvm会在栈内存中开辟一片属于这个方法的空间,让这个方法在这片空间执行
this关键字:this关键字代表了所属函数的调用者对象
this关键字的作用:
- 如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据。
- 在一个构造函数中,可以调用另外一个函数初始化对象。 this(形式参数1,形式参数2...),调用本类的对应数量参数的构造方法
this关键字要注意的事项:
- 如果存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java采取的是”就近原则“的机制访问的。)
- 如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的前面添加this关键字。
一个函数的形式参数也是属于局部变量
public Student(String name,int id) {
name=name; //这里的两个name都是局部变量的name,也就是形式参数的name,而不会对成员变量的name造成改变,相当于局部变量自己给自己赋值
id=id; //同理
}
正确的应该是这样:
public Student(String name,int id) {
this.name=name; //局部变量的name给成员变量赋值
this.id=id;
}
this的第二个作用:比如说,在两个参数的构造方法中调用一个参数的构造方法
class Student{
String name;
int id;
public Student(String name,int id) {
this(name); //调用本类中一个参数的构造方法
//this.name=name; //局部变量的name给成员变量赋值
//this(); //无参的构造方法被调用
this.id=id;
System.out.println("两个参数的构造方法被调用了");
}
public Student(String name) {
this.name=name;
System.out.println("一个参数的构造方法被调用");
}
public Student() {
System.out.println("无参构造方法被调用");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s=new Student("狗娃",110);
System.out.println("姓名: "+s.name+"身份证: "+s.id);
}
this关键字调用其他构造函数要注意的事项:
- this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句
- this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环
方法区(数据共享区):数据共享
static修饰的成员变量(静态成员变量) 只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。 但是某个修改这个静态变量,就会影响所有的对象的属性
static (静态\修饰符)
- static修饰成员变量 : 如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰
- static修饰成员函数
静态成员变量的访问方式:
- 可以使用对象进行访问 格式:对象.变量名
- 可以使用类名进行访问 格式:类名.变量名
注意:
- 非静态的成员变量只能使用对象进行访问,不能使用对象进行访问。
- 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰
static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可使用static修饰
class Emp{
static int count=;
{
count++;
}
public Emp() {
}
public void showCount() {
System.out.println("创建了"+count+"个对象");
}
}
public class Count {
public static void main(String[] args) {
// TODO Auto-generated method stub
Emp e1=new Emp();
new Emp();
new Emp();
new Emp();
new Emp();
e1.showCount();
}
}
Java学习笔记(7)的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
随机推荐
- 一个python拖库字段的小脚本
import requests import re all_column = dict() all_db = "db_zf,dg_activity,dg_activity_log,dg_ad ...
- C语言将字符串转换成对应的数字(十进制、十六进制)【转】
转自:http://wawlian.iteye.com/blog/1315133 问题1:讲一个十进制数字的字符串表示转换成对应的整数.举例:将“”转换成整数1234. C代码 收藏代码 /*将字符串 ...
- Mysql 数据库学习笔记05 触发器
一.触发器 * 是由时间来出发某个操作,这些事件可以包括 insert.update.delete.等语句.当执行这些操作时,就会触发对应的操作. * 创建一个执行语句的触发器: create tri ...
- 2:django models Making queries
这是后面要用到的类 class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextFie ...
- setTimeout(fn,0)
我们都知道setTimeout是一个延迟执行的函数 console.log(); setTimeout(function(){console.log();},); console.log(); 会得到 ...
- Django如何使文件在django自动执行
1. Django admin源码中 admin.py from django.contrib import admin # Register your models here. 在admin源码中 ...
- new、operator new、placement new
首先我们区分下几个容易混淆的关键词: new.operator new.placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的 ...
- mysql中的制表符替换
-- 问题重现set @v_t=' ';select hex(@v_t) -- 原因: -- ASCII格式的hex进展ox09对应char为(ht)制表tab,喔原来是有很多的制表符吧. ...
- Mysql优化之my.cnf参数优化
1.innodb_buffer_pool_size innodb_buffer_pool_size 参数用来设置Innodb 最主要的Buffer(Innodb_Buffer_Pool)的大小,也就是 ...
- 感受C#6.0新语法
作为一门专为程(yu)序(fa)员(tang)考虑的语言,感受一下来自微软的满满的恶意... 1. 字符串内联在之前的版本中,常用的格式化字符串: var s = String.Format(&quo ...