面向对象本质:以类的方式来组织代码,以对象的方式来封装数据
1.引用类型
2.类的属性
类的属性如果没有初始化的话,会执行默认初始;而函数内的局部变量没有被初始化的话,则它的值是未定义的
3.类的方法
Java只有值传递,没有引用传递
4.内存分析
内存分析示例代码1:
public class Student {
//属性
String name;
int id;
int age;
String gender;
int weight;
//方法
public void study()
{
System.out.println(name+"在学习");
}
public void say(String sname)
{
System.out.println(name+"在向"+sname+"问好!");
}
public static void main(String[] args)
{
Student s1=new Student();
s1.name="张三";
s1.study();
Student s2=new Student();
s2.age=18;
s2.name="李四";
s2.say(s1.name);
}
}
图解内存:
内存分析示例代码2:
Student.java
public class Student {
//属性
String name;
int id;
int age;
String gender;
int weight;
Computer c;
//方法
public void study()
{
System.out.println(name+"在学习");
}
public void say(String sname)
{
System.out.println(name+"在向"+sname+"问好!");
}
}
Computer.java
public class Computer {
String brand;
int cpuSpeed;
}
Test2.java
public class Test2 {
public static void main(String[] args)
{
Student s1=new Student();
s1.name="张三";
s1.age=18;
Computer c=new Computer();
c.brand="联想";
c.cpuSpeed=100;
s1.c=c;
c.brand="戴尔";
System.out.print(s1.c.brand);
}
}
图解内存2:
常量池在创建的时候,会检查其他常量池中是否已经有该常量,有的话不会重复
最后从结果发现,操作对象就是在操作引用,s1对象中存放的只是c的引用(内存地址),所以改变c的值,会改变s1中属性c的值
5.垃圾回收机制
垃圾回收是回收没有人使用的对象
6.构造方法
唯一的功能:构造类的对象,经常用来初始化类的属性
构造方法本质上会返回构造好的对象的地址,但不需要我们来定义
7.static关键字
示例及内存分析:
Student.java
public class Student {
//属性
String name;
int id;
static int ss;
public static void printSS()
{
System.out.println(ss);
}
public void study()
{
System.out.println(name+"在学习");
}
}
Test.java
public class Test2 {
public static void main(String[] args)
{
Student.ss=24;
Student.printSS();
Student s1=new Student();
}
}
在静态方法中不能调用非静态属性和方法,因为静态方法从属于类,非静态方法从属于对象,而在静态方法被加载的时候,不一定存在对象,即便存在对象,那到底调用哪个对象的属性和方法呢
但可以在非静态方法中调用静态属性和方法,因为在对象被创建的时候,静态属性和方法早就加载好了,而且调用的地址也是唯一的,在方法区中,所以它的调用完全是清晰明了的
8.this关键字
因为代码跟对象是分开的,所以对象的方法要通过传入this参数来区分this指针
this不能用于static是因为static方法不能调用非static属性和方法
this的另一特殊用法:使用"this(参数)"在一个构造函数中调用另一个构造函数,并且只能放在第一条语句
class Student
{
String name;
public Student(String name)
{
this();
this.name=name;
}
public Student()
{
System.out.print(name);
}
}