1.面向对象与面向过程
(1).都是解决问题的思维方式,都是代码组织的方式。
(2).解决简单问题可以使用面向过程
(3).解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程。
2.面向对象思考方式
遇到复杂问题,先从问题中找名词,然后确立这些名词哪些可以作为类,再根据问题需求确定类的属性和方法,确定类之间的关系。
一个经典的比喻:面向对象是盖浇饭、面向过程是蛋炒饭。盖浇饭的好处就是“菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是“可维护性”比较好,“饭” 和“菜”的耦合度比较低。
3.面向对象内存分析
对象空间的分配:使用new关键字创建对象即可
对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达”对象的内存空间
栈的特点如下:
(1). 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
(2). JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
(3). 栈属于线程私有,不能实现线程间的共享!
(4). 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆的特点如下:
(1). 堆用于存储创建好的对象和数组(数组也是对象)
(2). JVM只有一个堆,被所有线程共享
(3). 堆是一个不连续的内存空间,分配灵活,速度慢!
方法区(又叫静态区)特点如下:
(1). JVM只有一个方法区,被所有线程共享!
(2). 方法区实际也是堆,只是用于存储类、常量相关的信息!
(3). 用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
4.构造方法
构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
重载:形参类型、形参个数、形参顺序不同
1 public class User { 2 int id; // id 3 String name; // 账户名 4 String pwd; // 密码 5 public User() { 6 7 } 8 public User(int id, String name) { 9 super(); 10 this.id = id; 11 this.name = name; 12 } 13 public User(int id, String name, String pwd) { 14 this.id = id; 15 this.name = name; 16 this.pwd = pwd; 17 } 18 public static void main(String[] args) { 19 User u1 = new User(); 20 User u2 = new User(101, "张三"); 21 User u3 = new User(100, "李四", "1234"); 22 } 23 }
5.this
创建一个对象分为如下四步:
(1). 分配对象空间,并将对象成员变量初始化为0或空
(2). 执行属性值的显示初始化
(3). 执行构造方法
(4). 返回对象的地址给相关的变量
this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。
this不能用于static方法中。
6.static
在static方法中不可直接访问非static的成员。
static修饰的成员变量和方法,从属于类。
普通变量和方法从属于对象的。
1 public class User2 { 2 int id; // id 3 String name; // 账户名 4 String pwd; // 密码 5 6 static String company = "阿里巴巴"; // 公司名称 7 8 9 public User2(int id, String name) { 10 this.id = id; //不写this,无法区分局部变量id和成员变量id 11 this.name = name; 12 } 13 14 public void login() { 15 printCompany(); 16 System.out.println(company); 17 System.out.println("登录:" + name); 18 } 19 20 public static void printCompany() { 21 // login();//调用非静态成员,编译就会报错 22 System.out.println(company); 23 } 24 25 public static void main(String[] args) { 26 User2 u = new User2(111, "小七"); 27 User2.printCompany(); 28 User2.company = "阿里巴巴"; 29 User2.printCompany(); 30 } 31 }
7.静态初始化块
构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序:
(1). 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
(2). 构造方法执行顺序和上面顺序一样。
1 public class User3 { 2 int id; //id 3 String name; //账户名 4 String pwd; //密码 5 static String company; //公司名称 6 static { 7 System.out.println("执行类的初始化工作"); 8 company = "阿里巴巴"; 9 printCompany(); 10 } 11 public static void printCompany(){ 12 System.out.println(company); 13 } 14 public static void main(String[] args) { 15 User3 u3 = new User3(); 16 } 17 }
8.package
1. 通常是类的第一句非注释性语句。
2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。
1 package com.chb.test
9.包
如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
JDK中的主要包 |
|
Java中的常用包 |
说明 |
java.lang |
包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。 |
java.awt |
包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。 |
java.net |
包含执行与网络相关的操作的类。 |
java.io |
包含能提供多种输入/输出功能的类。 |
java.util |
包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。 |
(1). Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
(2). 如果导入两个同名的类,只能用包名+类名来显示调用相关类:
(3).静态导入(static import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。
1 package com.chb; 2 //以下两种静态导入的方式二选一即可 3 import static java.lang.Math.*;//导入Math类的所有静态属性 4 import static java.lang.Math.PI;//导入Math类的PI属性 5 6 public class Test2{ 7 public static void main(String [] args){ 8 System.out.println(PI); 9 System.out.println(random()); 10 } 11 }