1.基本概念:
面向对象:是将过程封装与对象;
面向过程;即面向方法编程,其粒度更细
类,对象,实例,方法:类是对象的抽象,对象是类的实例。经典类比就是类是汽车图纸,根据图纸生成的汽车就是对象。方法就是函数,也是类的行为。
面向对象的特征:封装;继承;多态(后面具体阐述)
类的描述:属性-----也就是成员变量
方法-----类里面的函数
构造函数;(函数名与类名一致,默认是无参数的,可不写。可通过函数重载写带参数的,用于初始化)
匿名对象:就是没有变量名,直接new 类名();
封装就是把属性隐藏,用private修饰,外部只能通过公有的get,set调用
class Dog
{
private String name="wangcai";
public static String breed="Shiba";
private int age;
private String color;
public void cry()
{
System.out.println("wang..wang..!"+" "+breed+" "+name+" "+color+" "+age);
}
public void setName(String name)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public void setColor(String color)
{
this.color=color;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String getColor()
{
return color;
}
public String getBreed()
{
return breed;
}
//构造函数 默认(无参数)
public Dog()
{}
//带参数
public Dog(String name)
{
setName(name);
}
public Dog(int age)
{
setAge(age);
}
public Dog(String name, int age)
{
setName(name);
setAge(age);
}
}
2.内存(存储分为三个部分,方法区和堆区,栈区)
方法区: 方法区也是线程共享的区域,用于存储已经被虚拟机加载的类信息,常量,静态变量和即时编译器(JIT)编译后的代码等数据。
堆区:数组+对象,每个实例都有内存地址,当该地址没被任何引用时,地址会被在不确定时间回收
栈区:存储局部变量是线程私有的,生命周期与线程相同。每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
修改堆栈的最大内存是在java -mx
java -ss
<span style="font-size:18px;"> public static void main(String[] args)
{
Dog dog1=new Dog();
dog1.cry();
Dog dog2=new Dog("dogA");
dog2.setColor("black");
dog2.cry();
Dog dog3=new Dog("dogB",2);
dog3.setColor("white");
dog3.cry();
new Dog().cry();
System.out.println("Hello World!");
}</span>
以这段代码为例(从main()函数入口,再在堆区的创建对象dog1,在调用方法cry,cry结束后弹栈到main(),再继续之后的方法压栈)
Q1:成员变量和局部变量的区别:
成员变量定义与类中,整个类都可以访问,存在于对象的堆内存中,随对象的建立而创建,有默认值(int为0,char为null)
局部变量定义于局部范围内,作用于范围内,结束后自动释放,存放于栈中,无默认值。
3.代码块的概念(就是用{}括起来的程序段)
(1)构造代码块:在类中出现{...}的就是构造代码块,是类的成员,和成员变量和成员函数同级构造代码块先于构造函数运行
(2)局部代码块:在方法内部定义,其变量只作用于代码块内部(所以不能用static修饰),即{int x;}{int x;}是没问题的。
(3)静态代码块:在构造代码块前面加static修饰。在类加载的时候执行,并且只执行一次。(注意类加载和类创建是不同概念)。它是在加载到方法区中。
Class.forName(String,boolean initialize,ClassLoader)可以控制加载时是否初始化。