一、面向对象思想
面向对象是一种思想,这种思想可以让我们写代码的思路更贴切于生活
二、类和对象
类:是一组相关属性和行为的集合,将其理解是对象的一张设计图
对象:根据类(设计图)创建出来的实体
关系:根据类创建对象,一个类可以创建出多个对象
Java中想要创建对象,必须先要有类的存在
1、类的组成
属性(名词):成员变量: 跟之前定义变量的格式一样,只不过位置需要放在方法的外面
行为(动词):成员方法: 跟之前定义方法的格式一样,只不过需要去掉static关键字
public class Student { String name = "张三";//成员对象,一般不赋值,使用对象时输出null(堆里面的默认值),成员变量不赋值也不会出错 int age = 23; public void study(){//成员方法 System.out.println("学习Java"); public void eat(){ System.out.println("吃饭"); } }2、创建对象、使用对象
创建对象
类名 对象名=new 类名();变量的使用格式
对象名.变量名;方法的使用格式
对象名.方法名(实际参数);public class TestStudent { public static void main(String[] args){ //创建对象格式: //类名 对象名= new 类名(); Student stu = new Student(); //使用成员变量格式: //对象名.变量名 System.out.println(stu.name); System.out.println(stu.age); stu.name ="李四";//每创建完一个对象都应该赋值 stu.age = 24; System.out.println(stu.name); System.out.println(stu.age); System.out.println(stu);//2,打印对象名,看到的是内存地址 //com.itheima.oop.Student@b4c966a //com.itheima.oop.Student全类名 //使用成员方法格式: //对象名.方法名(实际参数); stu.study(); stu.eat(); }3、练习
package com.itheima.oop; public class Phone { String brand; String color; int price; public void call(string name){ System.out.println("给"+ name + "打电话"); public void sendMessage() { System.out.println("群发短信"); }package com.itheima.oop; public class PhoneTest { public static void main(string[] args){ Phone p1 =new Phone(); p1.brand="小米"; p1.color="白色"; pl.price =4999; Phone p2 = new Phone(); p2.brand="华为"; p2.color="黑色"; p2.price = 6999; System.out.println(p1.brand + "---"+ p1.color + "---"+ p1.price); System.out.println(p2.brand + "---" + p2.color + "---" + p2.price); p1.call(name:"张三"); p1.sendMessage(); p2.call(name:"李四"); p2.sendMessage(); } }4、类和对象内存图
5、成员变量和局部变量
区别
6、this关键字
当局部变量和成员变量重名的时候,Java使用的是:就近原则
this的作用:调用本类的成员
另外,成员变量在方法中为紫色字体
package com.itheima.mthis; public class Person { int num = 10; public void show() { int num = 20; System.out.println(num);//20 System.out.println(this.num);//this.本类成员变量;10 } public void print() { System.out.println("Print..."); } public void method() { System.out.println(num);//如果不涉及重名问题,this.可以省略不写;10 print();//this.本类成员方法();this.可以直接省略不写 } }this介绍
代表当前类对象的引用(地址) 哪一个对象调用的方法,方法中的this,就代表哪一个对象 p1.print()--->this--->p1的地址 p2.print()--->this--->p2的地址
this内存图
7、构造方法
又名构造器
初始化一个新建的对象
构建、创造对象的时候,所调用的方法
执行时机:创建对象的时候被调用执行,每创建一次对象,都要执行
(1)格式
1.方法名与类名相同,大小写也要一致
2.没有返回值类型,连void都没有
3.没有具体的返回值(不能由return带回结果数据)
(2)构造方法的作用
1.本质的作用:创建对象
2.结合执行时机:在创建对象的时候,给成员变量赋值
构造方法
package com.itheima.constructor; public class Student { String name; int age; public Student(string name,int age){//构造方法 this.name = name; this.age = age; } } package com.itheima.constructor; public class StudentTest { public static void main(string[] args){ Student stu1 = new Student("张三",23);//使用构造方法new一个stu1出来,实参传递给构造方法,初始化stu1的name和age System.out.println(stu1.name + "---" + stu1.age); Student stu2 = new Student(name:"李四",age:24); System.out.println(stu2.name + "---" + stu2.age); stu1.Student("王五",25);//错误!构造方法不能单独拿出来使用,只能在new对象时使用 } }(3)构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
(4)快捷创建带参构造方法
在类中右键-->Generate-->Constructor-->ctrl+a全选-->确定
(5)执行流程
三、封装
1、面向对象三大特征
封装、继承、多态
2、封装
封装就是将数据(属性)和操作数据的方法捆绑在一起
组成一个整体,也就是类
同时,通过访问修饰符来控制对类中属性和方法的访问权限,从而实现信息隐藏
3、优点
更好的维护数据。使用者无需关心内部实现,只要知道如何使用即可
4、权限修饰符
private 同一个类中
(defalut)什么都不写 同一个类中 同一个包中
protected 同一个类中 同一个包中 不同包的子类
public 任意位置
四、JavaBean
实体类
这个类中的成员变量都要私有,并且要对类中提供无参,带参构造方法。
向外提供相应的getXxx,setXxx方法
快捷创建get、set方法
在类中右键-->Generate-->get、set--Constructor-->ctrl+a全选-->确定
实体类的应用场景是什么? 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
五、static修饰成员变量
static是静态的意思,可以修饰成员变量,也可以修饰成员方法
static成员变量用于共享数据
static修饰成员的特点:
被其修饰的成员,被该类的所有对象所共享
多了一种调用方式,可以通过类名调用
随着类的加载而加载,优先于对象存在
class User { String name; int age; static int onLineNumber;//被其修饰的成员,被该类的所有对象所共享 } public class StaticTest1{ public static void main(String[] args){ User.onLineNumber++;//多了一种调用方式,可以通过类名调用 User u1 = new User(); u1.name="张三"; u1.age = 23; sout(u1.name + "---" + u1.age + "---" + User.onLineNumber); User.onLineNumber++; User u2 = new User(); u2.name = "李四"; u2.age = 24; sout(u2.name + "..." +u2.age + "---" + User.onLineNumber); } }1、内存图
六、static修饰成员方法
用于常用工具类
类中创建工具类,需要用new方法访问,占用内存
public class ArrayTools { public int getMax(int[] arr) { int max=arr[0]; for (int i = 1;i < arr.length;i++){ if (arr[i]> max) { max=arr[i]; } } return max; } } public class ArrayToolsTest{ public static void main(string[]args){ ArrayTools tools =new ArrayTools();//不用static时 int[] arr ={11,22,33,44,55}; int max = tools.getMax(arr); } }使用static修饰方法时
public class ArrayTools{ private ArrayTools(){}//将new对象私有化,防止new对象重复加载工具占用内存 public static int getMax(int[] arr) {//使用static修饰工具时,工具直接加载到公共static内存 int max= arr[0]; for (int i=1; i<arr.length;i++){ if (arr[i]> max) { max= arr[i]; } } return max; } } public class ArrayToolsTest { public static void main(string[] args){ ArrayTools tools = new ArrayTools();//不可new对象,因为无法访问private修饰的构造方法 int[]arr ={11,22,33,44,55}; int max = ArrayTools.getMax(arr); //直接使用类名.方法名即可 } }七、制作工具类的阅读文档
在每个方法上面输入/**回车
/** *这是一个数组的工具类,内部提供了很多数组的便捷操作 *求最大值,求最小值,追历打印数组 * @version 1.0 * @author ys */ public class ArrayTools { private ArrayTools(){} /** *此方法可以从传入的数组中查找最大值并返回 *@paramarr需要求最大值的数组 *@return返回找到的最大值 */ public static int getMax(int[] arr) { int max=arr[0]; for (int i=1;i<arr.length;i++){ if Carr[i]> max) { max=arr[i]; } } return max; } }上侧工具栏展开,tools,Generate JavaDoc
选择File
Output Directory选择生成路径
下面勾选框勾上@author、@version
Generate生成
找到文件夹中的index.html
1、static注意事项
static中只能访问静态成员(直接访问)
static中没有this关键字
public class StaticTest2 { static int num =10;//加上static之后主方法才能访问 public static void main(string[] args){ System.out.println(num); System.out.println(this);//报错!静态变量仅加载到堆内存,当前变量的地址并没有创建 method(); } } public static void method() {//加上static之后主方法才能访问 System.out.println("method..."); }八、重新认识main方法
控制台:
public class HelloWorld { public static void main(String[] args){ System.out.println("Helloworld"); } }public:被JVM调用,访问权限足够大
static:被JVM调用,不用创建对象
因为main方法是静态的,所以测试类中其他方法也需要是静态的
void:被JVM调用,不需要给JVM返回值
main:一个通用的名称,虽然不是关键字,但是被JVM识别
String[] args:以前用于接收键盘录入数据的,现在没用
String[] args的使用
public class MainTest { public static void main(String[] args){ for (int i = 0;i < args.length; i++){ System.out.println(args[i]); } }