该博文是以下资料的学习笔记:
传智播客Java基础视频
该博文仅为个人学习使用,谢谢
成员变量、局部变量区别:
成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数、语句、局部代码块中,只在所属的区域类有效。
成员变量存在于堆内存的对象中,随着对象的创建而存在,随着对象的消失而消失。
局部变量存在于栈内存的方法中,随着所属区域代码的执行而存在,所属区域代码执行完即消失。
成员变量都有默认初始化值,局部变量没有默认初始化值。
匿名对象:当对象对属性、方法仅进行一次使用的时候,就可以简化为匿名对象
基本数据类型和引用数据类型参数传递的区别,参考06面向对象13。
封装:隐藏对象的属性和实现细节,仅对外提供公共的访问方式。便于使用,提高安全性
private:权限修饰符,用于修饰成员,不能修饰局部,私有的内容只能在本类中访问
构造函数:
函数名与类名相同,不用定义返回值类型,没有具体返回值。
作用:给对象进行初始化。创建对象都必须要通过构造函数进行初始化,一般类中,如果没有定义构造函数,则会执行默认的空参数的构造函数,如果在类中定义了构造函数,则类中默认的构造函数就没有了
多个构造函数是以重载的形式存在的。
构造函数:对象创建时,就会调用与之对应的构造函数,并且只调用一次,对对象进行初始化
在描述事物时,该事物一存在就具备一些内容时,这些内容就定义在构造函数中。
细节:
class Person{
private String name;
private int age;
void Person(){} // 前边加了void,这个方法就不是构造函数了,而是一般函数,只不过,该方法不符合首字母小写的规范
// 如果下边语句被注释掉,那么Person p = new Person();语句就会报错
// 原因是自定义了构造函数,默认的空参数的构造函数就没有了
// Person(String name,int age){}
}
this关键字:
当成员变量和局部变量重名时,可以用关键字this来区分
class Person{
private String name;
//第一种写法:
Person(String n){
name = n;
}
//第二种写法:
/*Person(String name){
name = name;
}*/
void speak(){
System.out.println(name);
}
}
Person p = new Person("zhangsan");
p.speak();//上边的第一种写法,该处打印结果是:zhangsan,第二种写法打印结果是:null
哪个对象调用了this所在的函数,this就代表哪个对象。相关图参考07面向对象7this关键字原理图解。
在构造函数中调用构造函数:
class Person{
private String name;
private int age;
Person(String name,int age){
// this();//The constructor Person() is undefined
// this("lisi");//this可以在构造函数中调用其他构造函数,对构造函数的调用必须是函数的第一个语句
// this.name = name;
this.age = age;
}
Person(String name){
this.name = name;
}
void speak(){
System.out.println(name+"..."+age);
}
}
static关键字:
用于修饰成员,static修饰的成员被所有对象所共享,优先于对象存在,static的成员随着类的加载就已经存在了,所以多了一种调用方式,可以直接被类名调用:类名.静态成员。static修饰的数据是共享数据,对象中存储的是特有数据。
成员变量(实例变量)和静态变量(类变量)的区别:
1、生命周期不同
成员变量:随着对象的存在(销毁)而存在(销毁)
静态变量:随着类的加载(消失)而存在(消失)
2、调用方式不同
成员变量:只能被对象调用
静态变量:可以被对象和类名调用
3、别名不同
成员变量:也称为实例变量
静态变量:也称为类变量
4、存储位置不同:
成员变量:存储在堆内存的对象中,是对象的特有数据
静态变量:存储在方法区(又叫共享数据区)的静态区,是对象的共享数据
使用静态的注意事项:
1、无法从静态上下文中引用非静态变量(方法),静态方法只能访问静态成员。
2、静态方法中不可以使用this或super关键字
3、如果一个类的所有对象的某个成员变量的值都相同,那么这个成员变量就可以考虑用static修饰,如果一个函数没有访问到非静态的成员变量,那么,仅为调用该方法而创建对象是没有意义的,这时候就可以将该函数定义为静态
关于主函数:
public class StaticDemo {
public static void main(String[] args) {
System.out.println(args.length);//0
}
public static void main(int args) {
//主函数是固定格式的,所以该函数只是主函数的一个重载函数,并不会报错
}
}
静态代码块:
随着类的加载而执行,而且只执行一次,作用是给类进行初始化
如果一个类的所有成员都是静态的,就不需要创建对象,可以用静态代码块来对类进行初始化
构造代码块:
给所有对象进行初始化
在函数中定义的叫做局部代码块,是为了限制变量的生命周期
public class StaticDemo {
static{
System.out.println("静态代码块main");
}
{
System.out.println("构造代码块main");
}
public static void main(String[] args) {
new People().show();
new People().show();
}
}
class People{
static{
System.out.println("静态代码块People");
}
{
System.out.println("构造代码块People");
}
People(){
System.out.println("People构造函数");
}
public void show(){
System.out.println("show...");
}
}
输出结果是:
静态代码块main
静态代码块People
构造代码块People
People构造函数
show...
构造代码块People
People构造函数
show...