一》类与对象的关系
类:就是对现实生活中事物的描述。
对象:就是这类事物,实实在在存在的实体(个体)。
二》成员变量和局部变量
1.区别:
a.作用域不同:
成员变量:作用于整个类中:
局部变量:作用于函数中,语句中;
b.在内存中的位置不同:
成员变量:在堆内存中,因为对象的存在,才在内存中存在。
局部变量:存在于栈内存中。
三》封装
1.封装的好处:
a.将变化隔离
b.便于使用
c.提高重用性
d.提高安全性
2.封装原则:
a.将不需要对外提供的内容都隐藏起来。
b.把属性都隐藏,提供公共方法对其访问。
3.如何隐藏(private):
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数)。
注意:私有仅仅是封装的一种表现形式;
将需要隐藏的成员私有化,提供set(),get()方法对其操作(属性)。
将需要隐藏的方法私有化,提供另一个对外方法,对其调用。
四》this关键字在构造函数间的调用:
this语句:用于构造函数之间互相调用(只限于构造函数);
This语句只能定义在构造函数的第一行。因为初始化要先执行。
五》static关键字:
1.static:静态;
用法:是一个修饰符,用于修饰成员(成员变量,成员方法);
当成员被静态修饰后,就多了个调用方式,除了可以被对象调用外,还可以直接被类名调 用。
2.被修饰后的成员具备以下特点:
a.随着累的加载而加载
b.优先于对象存在
c.被所有对象所共享
d.可以直接被类名调用
3.使用注意事项:
a.静态方法只能访问静态成员
b.静态方法中不可以写this,super关键字,因为优先于对象存在。
3.实例变量和类变量的区别:
a.存在位置:
类变量随着类的加载而存在于方法区中,
实例变量随着对象的建立而存在于堆内存中。
b.生命周期:
类变量生命周期最长,随着类的消失而消失,
实例变量生命周期随着对象的消失而消失。
七》main函数:
1.主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。
2.主函数的定义:
Public:代表着该函数访问权限是最大的。
Static:代表主函数随着类的加载就已经存在了。
Void:主函数没有具体的返回值。
Main:不是关键字,是一个特殊的单词,可以被jvm识别。
(String【】 args):函数的参数,参数类型是一个数组,该数组中的元素是字符串。
3.主函数是固定格式的:jvm识别。
唯一能改变的就是参数名args;一般不变;
八》静态什么时候使用:
1.什么时候使用静态?
要从两方面下手:
a.因为静态修饰符的内容有成员变量和函数;
什么时候定义静态变量(类变量)那?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态,存在于堆内存中。
什么时候定义静态函数那?
当功能内部没有访问到非静态数据(对象的特有数据),
那么该功能可以定义成静态的。
九》静态代码块
1.静态代码块格式:
Static
{
执行语句;
}
2.特点:
随着类的加载而执行,只执行一次,并优先于主函数执行。
3.用于给类进行初始化的。
4.构造代码块
StaticCode()
{
System.out.println("b");
}
static
{
System.out.println("a");
}
{
System.out.println("c");
}
结果为:a c b
执行顺序:构造函数<构造代码块<静态代码块;
十》对象的初始化过程:
class Person
{
private String name;
private int age;
private static String country = "CN";
Person(String name,int age)
{
this.name = name;
this.age = age;
}
{
System.out.println(name+"..."+age);
}
public void setName(String name)
{
this.name = name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country = "+country);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person("张三",20);
}
}
Person p = new Person("张三",20); 该句话都做了什么事情?
1.因为new用到了Person.class文件,所以会先找到Person.class文件并加载到内存中。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性,并进行默认初始化。
5.对属性进行显式初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给内存中的p变量。