## 类与对象
1、面向对象 三大特征
- 封装、继承、多态
2、类 和 对象
- 什么是类?
- 答:抽象的概念,一个模板,现实世界不存在。对象则是实际存在的个体。类就是一个模板,对象就是根据模板创建出来的个体。类中描述的是所有对象的共同特征。
- 对象还有另一个名字叫实例。
- 通过类可以实例化一个对象。
3、类的定义
-
语法格式:修饰符 class 类名{
类体 = 属性+方法;
}
修饰符列表可以省略。- 属性:在代码上以 变量 形式存在的。因为属性 是以 数据类型存在的。
-
-
public class Student{ String name; int age; int num; //学号 boolean sex; String address; //这些都是属性,又叫做成员变量。 }
-
-
创建对象的语法:new 类名(); new是一个运算符,专门用来对象的创建。
-
Student s = new Student(); // int a = 1; 道理是一样的
-
java 中所有的类 都是 引用数据类型。
- Student 既是一个类,也是一个引用数据类型。
- 即类名 就是一种引用 数据类型。
-
-
- 对象的创建和使用
- 堆内存中存储对象以及对象的实例变量。
- 凡是new 运算符出来的对象,都存储在堆中。
- 像 s 这种保存了对象地址的变量叫做引用。
例如:Student s = new Student();
-
- 怎么访问实例变量
- 语法:引用.实例变量名
- 通过赋值方式将内存中的实例变量修改
public class User{ int id; //用户id String name; String password; }
public class UserTest{ public static void main(String[] args){ User u1 = new User(); u1.id = 111; u1.name = "小明"; u1.password = "qwe123"; System.out,println(u1.id); System.out,println(u1.name); System.out,println(u1.password); } }
-
3.住址类
public class Address{ String city; //城市 String street;//街道 String zipcode;//邮编 }
public class User{ Stirng name; String password; Address addr; }
-
4.画内存图,内存图中体现的是数据,所以不要在上面写代码
- *内存图是非常重要的(有助于程序的调试)
- 按先后顺序画(一步一步来)
- 画板cmd打开(mspaint)
- 运行顺序:
- 1.类加载(方法区最先有数据)
- 2.调用类,从main 方法开始压栈
- 注意:程序员没有权利直接操作堆内存,想要使用必须通过引用。
- 只有地址指向对象,事实上凡是方法中的变量都在栈内存中开辟了空间,自然每个变量都有他自身的地址。
Address k = new Address(); Address m = k; //是将k中保存的地址赋给了变量m
-
5.代码拆分
class User{ int id; String password; Address addr; } class Address{ String city; String street; String zipcode; } public class Test{ public static void main(String[] args){ Address a = new Address(); a.city = "西安"; a.street = "建工路"; a.zipcode = "不知道"; User u = new User(); u.id = 123; u.password = "qwe123"; u.addr = a; System.out.println(u.addr.city); // 是否可将 u.addr.city 进行拆分 // Address add = u.addr; // String zhuzhi = add.city; // System.out.println(zhuzhi); //记住一点,里面有啥 就可以 点 啥 } }
-
*记住,实例变量必须通过对象才能访问。
-
*对象,是堆里new出来的,引用 是 保存对象内存地址的。
-
引用一定是局部变量吗?
答:不一定。栈中的是局部变量,堆里的是实例变量(成员变量)。
-
-
6.属性是引用类型怎么访问
public class T{ A a; public static void main(String[] args){ D d = new D(); C c = new C(); B b = new B(); A a = new A(); T t = new T(); //编写代码通过t来访问d中的i System.out.println(t.a.b.c.d.i); } } class A { B b; } class B { C c; } class C { D d; } class D{ int i; }
-
7.空指针异常
-
举例:
public class NullPointerException{ public static void main(String[] args){ Customer s = new Customer(); s.id = 110; } } class Customer{ int id; }
-
当没有引用指向对象时,堆内存程序员是无法操作的。gc 会将这个垃圾对象释放掉。
-
java 中的垃圾回收器(gc)主要针对的是堆内存中的数据。当没有任何引用指向该对象的时候,会判定为垃圾。
-
出现空指针异常的前提条件是什么?
-
答:“空引用”访问实例相关的数据,都会出现空指针异常。
-
-
8.方法调用时参数传递问题?
public class Test{ public static void main(String[] args){ int i = 100 a(i); //10 System.out.println(i); } public static void a(int i){ i++; System.out.println(i); //11 } }
-
注意:java规定:参数在传递时,与类型无关,不管是基本数据类型还是引用数据类型,都是将“盒子” 中保存的值 复制 一份·,传递下去。
只是这个值,可能是一个数字,也可能是一个对象的地址。
public class Test1{ public static void main(String[] args){ Preson p = new Person(); p.age = 100; add(p); System.out.println(p.age);//101 } } public static void add(Preson p){ p.age++; System.out.println(p.age)//101 } class Preson{ int age; }
-