07.01 成员变量和局部变量的区别
1.在类中的位置不同
成员变量 类中方法外
局部变量 方法内或者方法声明上
2.在内存中的位置不同
成员变量 堆内存
局部变量 栈内存
3.生命周期不同
成员变量 随着对象的存在而存在,随着对象的消失而消失
局部变量 随着方法的调用而存在,随着方法的调用完毕而消失
4.初始化值不同
成员变量 有默认的初始化值
局部变量 没有默认的初始化值,必须先定义,赋值,才能使用。
07.02 方法的形式参数是类名的调用
例:
1 class Demo 2 { 3 public static void main(String[] args) 4 { 5 //创建学生对象 6 Student s = new Student(); 7 StudentDemo sd = new StudentDemo(); 8 sd.method(s); 9 } 10 } 11 class StudentDemo 12 { 13 //形式参数是引用类型 14 public void method(Student s) 15 { 16 s.show(); 17 } 18 } 19 class Student 20 { 21 public void show() 22 { 23 System.out.println("学生爱学习"); 24 } 25 }
07.03 匿名对象的概述和应用
匿名对象:就是没有名字的对象。是对象的一种简化表示形式
匿名对象的两种使用情况:
1.对象调用方法仅仅一次的时候
2.作为实际参数传递
例:
1 class Demo 2 { 3 public static void main(String[] args) 4 { 5 //匿名对象调用方法 6 new Student().show(); 7 } 8 } 9 class Student 10 { 11 public void show() 12 { 13 System.out.println("学生爱学习"); 14 } 15 }
匿名对象调用完毕就是垃圾,垃圾回收器会在适当的时间回收,提高内存的使用效率
07.04 封装的概述
封装概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
例:
1 class Student 2 { 3 String name; 4 //将age私有,只能在Student类中访问 5 private int age; 6 7 //提供对外访问的方法获取age的值 8 public int getAge() 9 { 10 return age; 11 } 12 //提供对外访问的方法,并可以对传入的a的值进行判断,满足条件则赋值给age,不满足则不赋值 13 public void setAge(int a) 14 { 15 age = a; 16 } 17 public void show() 18 { 19 System.out.println("姓名:"+name+" "+"年龄:"+age); 20 } 21 }
07.05 封装的好处和设计原则
封装好处:
1.隐藏实现细节,提供公共的访问方式
2.提高了代码的复用性
3.提高安全性
封装原则:将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公共方法对其访问。
07.06 private关键字的概述和特点
private关键字:是一个权限修饰符。可以修饰成员(成员变量和成员方法),被private修饰的成员只在本类中才能访问。
private最常见的应用:
1.把成员变量用private修饰
2.提供对应的getXxx()/setXxx()方法
07.07 private的应用标准案例
1 class Demo 2 { 3 public static void main(String[] args) 4 { 5 Student s = new Student(); 6 //给成员变量赋值 7 s.setName("小强"); 8 s.setAge(25); 9 10 System.out.println(s.getName()+":"+s.getAge()); 11 } 12 } 13 class Student 14 { 15 private String name; 16 //将age私有,只能在Student类中访问 17 private int age; 18 19 //提供对外访问的方法获取name的值 20 public String getName() 21 { 22 return name; 23 } 24 //提供对外访问的方法设置name的值 25 public void setName(String n) 26 { 27 name = n; 28 } 29 //提供对外访问的方法获取age的值 30 public int getAge() 31 { 32 return age; 33 } 34 //提供对外访问的方法设置age的值 35 public void setAge(int a) 36 { 37 age = a; 38 } 39 }
07.08 this关键字的概述和应用
this:代表所在类的对象引用
方法被哪个对象调用,this就代表那个对象
当局部变量隐藏成员变量时使用this
例:
1 class Student 2 { 3 private String name; 4 //将age私有,只能在Student类中访问 5 private int age; 6 7 //提供对外访问的方法获取name的值 8 public String getName() 9 { 10 return name; 11 } 12 //提供对外访问的方法设置name的值 13 public void setName(String name) 14 { 15 this.name = name; 16 } 17 //提供对外访问的方法获取age的值 18 public int getAge() 19 { 20 return age; 21 } 22 //提供对外访问的方法设置age的值 23 public void setAge(int age) 24 { 25 this.age = age; 26 } 27 }
07.09 this关键字的内存图解
07.10 标准的手机类代码及其测试
1 class Demo 2 { 3 public static void main(String[] args) 4 { 5 Phone p = new Phone(); 6 System.out.println("品牌:"+p.getBrand()+" 价格:"+p.getPrice()+" 颜色:"+p.getColor()); 7 p.setBrand("小米"); 8 p.setPrice(1999); 9 p.setColor("白色"); 10 System.out.println("品牌:"+p.getBrand()+" 价格:"+p.getPrice()+" 颜色:"+p.getColor()); 11 } 12 } 13 class Phone 14 { 15 private String brand;//品牌 16 private int price;//价格 17 private String color;//颜色 18 19 public String getBrand() 20 { 21 return brand; 22 } 23 public void setBrand(String brand) 24 { 25 this.brand = brand; 26 } 27 28 public int getPrice() 29 { 30 return price; 31 } 32 public void setPrice(int price) 33 { 34 this.price = price; 35 } 36 37 public String getColor() 38 { 39 return color; 40 } 41 public void setColor(String color) 42 { 43 this.color = color; 44 } 45 }
运行结果:
品牌:null 价格:0 颜色:null 品牌:小米价格:1999 颜色:白色
07.11 构造方法概述和格式
构造方法作用概述:给对象的数据进行初始化
构造方法格式:
1.方法名与类名相同
2.没有返回值类型,连void都没有
3.没有具体的返回值
例:
07.12 构造方法的重载及注意事项
构造方法注意事项:
1.如果不提供构造方法,系统会给出默认构造方法
2.如果提供了构造方法,系统将不再提供
3.构造方法也是可以重载的
07.13 成员方法的分类及使用
方法具体划分:
根据返回值:1.有明确返回值方法 2.返回void类型的方法
根据形式参数:1.无参方法 2.带参方法
例:
1 class Demo 2 { 3 public static void main(String[] args) 4 { 5 Student s = new Student(); 6 String str = s.getString(); 7 System.out.println(str); 8 s.show(); 9 s.method("小强"); 10 } 11 } 12 class Student 13 { 14 private String name; 15 private int age; 16 //有明确返回值的无参方法 17 public String getString() 18 { 19 return "hello"; 20 } 21 //返回void类型的无参方法 22 public void show() 23 { 24 System.out.println("show run"); 25 } 26 //返回void类型的带参方法 27 public void method(String name) 28 { 29 System.out.println("name:"+name); 30 } 31 }
07.14 一个标准学生类的代码及测试
类的组成:
1.成员变量
2.构造方法[无参构造方法 / 带参构造方法]
3.成员方法[getXxx() / setXxx()]
给成员变量赋值的方式
1.无参构造方法 + setXxx()
2.带参构造方法
1 /* 2 学生类: 3 成员变量:name,age 4 构造方法:无参,带两个参 5 成员方法:getXxx()/setXxx() 6 show():输出该类的所有成员变量值 7 8 给成员变量赋值: 9 A:setXxx()方法 10 B:构造方法 11 12 输出成员变量值的方式: 13 A:通过getXxx()分别获取然后拼接 14 B:通过调用show()方法搞定 15 */ 16 //测试类 17 class Demo 18 { 19 public static void main(String[] args) 20 { 21 //方式1给成员变量赋值 22 //无参构造+setXxx() 23 Student s1 = new Student(); 24 s1.setName("小明"); 25 s1.setAge(27); 26 //输出值 27 System.out.println(s1.getName()+"---"+s1.getAge()); 28 System.out.println("----------------------------"); 29 30 //方式2给成员变量赋值 31 Student s2 = new Student("小强",30); 32 s2.show(); 33 } 34 } 35 36 class Student 37 { 38 //姓名 39 private String name; 40 //年龄 41 private int age; 42 43 //构造方法 44 public Student() 45 { 46 } 47 48 public Student(String name,int age) 49 { 50 this.name = name; 51 this.age = age; 52 } 53 54 public String getName() 55 { 56 return name; 57 } 58 59 public void setName(String name) 60 { 61 this.name = name; 62 } 63 64 public int getAge() 65 { 66 return age; 67 } 68 69 public void setAge(int age) 70 { 71 this.age = age; 72 } 73 74 //输出所有的成员变量值 75 public void show() 76 { 77 System.out.println(name+"---"+age); 78 } 79 }
07.15 一个标准的手机的代码及测试
1 //测试类 2 class Demo 3 { 4 public static void main(String[] args) 5 { 6 //创建对象 7 Phone p = new Phone(); 8 9 //给成员变量赋值 10 p.setBrand("小米"); 11 p.setPrice(2299); 12 p.setColor("白色"); 13 14 //获取值 15 System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor()); 16 } 17 } 18 19 //定义手机类 20 class Phone 21 { 22 //品牌 23 private String brand; 24 //价格 25 private int price; 26 //颜色 27 private String color; 28 29 //无参构造方法 30 public Phone() 31 { 32 } 33 34 //getXxx()和setXxx()方法 35 public String getBrand() 36 { 37 return brand; 38 } 39 public void setBrand(String brand) 40 { 41 this.brand = brand; 42 } 43 44 public int getPrice() 45 { 46 return price; 47 } 48 public void setPrice(int price) 49 { 50 this.price = price; 51 } 52 53 public String getColor() 54 { 55 return color; 56 } 57 public void setColor(String color) 58 { 59 this.color = color; 60 } 61 }
07.16 创建对象做了哪些事情
Student s = new Student();在内存中做了哪些事情?
1.加载Student.class文件进内存
2.在栈内存为s开辟空间
3.在堆内存为学生对象开辟空间
4.对学生对象的成员变量进行默认初始化
5.对学生对象的成员变量进行显示初始化
6.通过构造方法对学生对象的成员变量赋值
7.学生对象初始化完毕,把对象地址赋值给s变量
07.17 什么时候定义成员变量
如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量。变量的范围越小越好,因为能及时的被回收。
07.18 长方形案例练习
定义一个长方形类,定义求周长和面积的方法,然后定义一个测试类Demo,进行测试。
1 /* 2 成员变量:长,宽 3 成员方法: 4 求周长:(长+宽)*2; 5 求面积:长*宽 6 */ 7 import java.util.Scanner; 8 class ChangFangXing 9 { 10 //长方形的长 11 private int length; 12 //长方形的宽 13 private int width; 14 15 public ChangFangXing() 16 { 17 } 18 19 //仅仅提供setXxx()即可 20 public void setLength(int length) 21 { 22 this.length = length; 23 } 24 25 public void setWidth(int width) 26 { 27 this.width = width; 28 } 29 30 //求周长 31 public int getZhouChang() 32 { 33 return (length + width) * 2; 34 } 35 36 //求面积 37 public int getArea() 38 { 39 return length * width; 40 } 41 } 42 43 //测试类 44 class Demo 45 { 46 public static void main(String[] args) 47 { 48 //创建键盘录入对象 49 Scanner sc = new Scanner(System.in); 50 51 System.out.println("请输入长方形的长:"); 52 int length = sc.nextInt(); 53 System.out.println("请输入长方形的宽:"); 54 int width = sc.nextInt(); 55 56 //创建对象 57 ChangFangXing cfx = new ChangFangXing(); 58 //先给成员变量赋值 59 cfx.setLength(length); 60 cfx.setWidth(width); 61 62 System.out.println("周长是:"+cfx.getZhouChang()); 63 System.out.println("面积是:"+cfx.getArea()); 64 } 65 }
07.19 员工类案例练习
1 /* 2 成员变量:员工编号,姓名,年龄 3 构造方法:无参构造方法 4 成员方法: 5 getXxx()/setXxx(); 6 show(); 7 */ 8 9 class Employee 10 { 11 //员工编号 12 private String employeeId; 13 //姓名 14 private String name; 15 //年龄 16 private int age; 17 18 //构造方法 19 public Employee() 20 { 21 } 22 23 //getXxx()/setXxx() 24 public String getEmployeeId() 25 { 26 return employeeId; 27 } 28 29 public void setEmployeeId(String employeeId) 30 { 31 this.employeeId = employeeId; 32 } 33 34 public String getName() 35 { 36 return name; 37 } 38 39 public void setName(String name) 40 { 41 this.name = name; 42 } 43 44 public int getAge() 45 { 46 return age; 47 } 48 49 public void setAge(int age) 50 { 51 this.age = age; 52 } 53 54 //显示所有成员信息的方法 55 public void show() 56 { 57 System.out.println("员工编号:"+employeeId+" 姓名:"+name+" 年龄:"+age); 58 } 59 } 60 61 //测试类 62 class Demo 63 { 64 public static void main(String[] args) 65 { 66 //创建对象 67 Employee e = new Employee(); 68 69 //给成员变量赋值 70 e.setEmployeeId("ID8899"); 71 e.setName("旺财"); 72 e.setAge(18); 73 74 //获取数据 75 //System.out.println(e.getEmployeeId()+"---"+e.getName()+"---"+e.getAge()); 76 77 //使用show方法 78 e.show(); 79 } 80 }
07.20 实现加减乘除并测试
1 import java.util.Scanner; 2 class MyMath 3 { 4 //加法功能 5 public int add(int a,int b) 6 { 7 return a + b; 8 } 9 10 //减法功能 11 public int sub(int a,int b) 12 { 13 return a - b; 14 } 15 16 //乘法功能 17 public int mul(int a,int b) 18 { 19 return a * b; 20 } 21 22 //除法功能 23 public int div(int a,int b) 24 { 25 return a / b; 26 } 27 } 28 29 //测试类 30 class Demo 31 { 32 public static void main(String[] args) 33 { 34 //创建键盘录入对象 35 Scanner sc = new Scanner(System.in); 36 37 System.out.println("请输入第一个操作数:"); 38 int num1 = sc.nextInt(); 39 System.out.println("请输入第二个操作数:"); 40 int num2 = sc.nextInt(); 41 42 //创建MyMath对象,并使用 43 MyMath mm = new MyMath(); 44 45 System.out.println(num1+"+"+num2+"="+mm.add(num1,num2)); 46 System.out.println(num1+"-"+num2+"="+mm.sub(num1,num2)); 47 System.out.println(num1+"*"+num2+"="+mm.mul(num1,num2)); 48 System.out.println(num1+"/"+num2+"="+mm.div(num1,num2)); 49 } 50 }
运行结果:
请输入第一个操作数: 8 请输入第二个操作数: 2 8+2=10 8-2=6 8*2=16 8/2=4
07.21 static关键字的引入
例:
1 class Person 2 { 3 String name; 4 //使用static修饰的数据称为对象的共享数据 5 static String country = "中国"; 6 public void show() 7 { 8 System.out.println("姓名:"+name+" 国家:"+country); 9 } 10 } 11 12 class Demo 13 { 14 public static void main(String[] args) 15 { 16 Person p1 = new Person(); 17 p1.name = "小明"; 18 p1.show(); 19 20 Person p2 = new Person(); 21 p2.name = "小红"; 22 p2.country = "美国"; 23 p2.show(); 24 p1.show(); 25 26 } 27 }
运行结果:
姓名:小明 国家:中国
姓名:小红 国家:美国
姓名:小明 国家:美国
07.22 static关键字的特点
1.static是一个修饰符,用于修饰成员(成员变量和成员函数)
2.static修饰的成员被所有的对象共享
3.static优先于对象存在,因为static成员随着类的加载就已经存在了
4.static修饰的成员可以被对象调用,也可以直接被类名调用,格式为:类名.静态成员
5.static修饰的数据是共享数据,对象中存储的是特有数据
07.23 static的内存图解
07.24 static的注意事项
1.在静态方法中是没有this关键字的
2.静态方法只能访问静态的成员变量和静态的成员方法
3.主函数是静态的,如果要在主函数中调用非静态成员可以创建一个对象来调用
07.25 静态变量和成员变量的区别
1.所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
2.内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
3.内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
4.调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
07.26 main方法的格式详细解释