文章目录
类和对象
什么是对象
客观存在的事物皆为对象 ,所以我们也常常说万物皆对象
什么是类
类的理解
- 类是对现实生活中一类具有共同属性和行为的事物
- 类的对象的数据类型,类是具有相同属性和行为的一组对象的集合
- 简单理解:类就是对现实事物的一种描述
类的组成
- 属性: 指事物的特征,例如:手机事物(品牌,价格,尺寸)
- 行为:指事物能执行的操作.例如:手机事物(打电话,发短信)
类和对象的关系
- 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
- 对象:是能够看的到摸得到的真实存在实体
- 简单理解: 类是对事物的一种描述,对象则为具体存在的事物
类的定义
类的总要性:是java程序的基本组成单位.
类是什么: 是一类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为。
类的组成是由属性和行为两部分组成
- 属性:在类中通过成员变量来体现(类中方法外的变量)
- 行为:在类中通过成员变量来体现(和前面的方法相比去掉static关键字即可)
类的定义步骤:
1.定义类
2.编写类的成员变量
3.编写类的成员方法
package com.itdemo_01;
/*
类的定义
类名:phone
成员变量
品牌价格
成员方法
打电话发短信
*/
public class Phone {
//成员变量
//品牌
String brand;
//价格
int price;
//成员方法
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
}
对象的使用
创建对象的格式:
- 类名 对象名 = new 类名();
调用成员变量:
- 对象名.成员变量
- 对象名.成员方法();
package com.itdemo_01;
/*
创建对象
格式: 类名 对象名 =new 类名();
使用对象:
使用成员变量
格式 对象名.变量名
使用成员方法
格式 对象名.方法名();
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
//使用成员变量
p.brand = "小米";
p.price =2999;
System.out.println(p.brand);
System.out.println(p.price);
//使用成员方法
p.call();
p.sendMessage();
}
}
案例:学生
需求:首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法 的使用
分析
成员变量: 姓名,年龄
成员方法:学习,做作业
package com.itdemo_02;
public class Student {
//成员变量
String name;
int age;
//成员方法
public void study(){
System.out.println("好好学习,天天向上");
}
public void dohomework(){
System.out.println("键盘敲烂,月薪百万");
}
}
package com.itdemo_02;
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name+", "+s.age);
s.name="小乔";
s.age=15;
System.out.println(s.name+", "+s.age);
//使用方法
s.study();
s.dohomework();
}
}
对象内存图
单个对象
多个对象
package com.itdemo_02;
public class StudentTest02 {
public static void main(String[] args) {
//创建第一个对象并使用
Student s1= new Student();
s1.name ="林青霞";
s1.age = 30;
System.out.println(s1.name+","+s1.age);
s1.study();
s1.dohomework();
//创建第二个对象
Student s2 = new Student();
s2.name="张曼玉";
s2.age=23;
System.out.println(s2.name+","+s2.age);
s2.study();
s2.dohomework();
}
}
多个对象指向相同
总结:
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据
package com.itdemo_02;
public class StudentTest03 {
public static void main(String[] args) {
//创建第一个对象
Student s1= new Student();
s1.name="小乔";
s1.age = 18;
System.out.println(s1.name+","+s1.age);
//把前一个对象的地址赋值给第二个对象
Student s2 =s1;
s2.name="大乔";
s2.age=20;
System.out.println(s1.name+","+s1.age);
System.out.println(s2.name+","+s2.age);
}
}
成员变量和局部变量
成员变量和局部变量的区别
类中位置不同:
成员变量(类中方法外)
局部变量(方法内部或方法声明上)
内存中位置不同:
成员变量(堆内存)
局部变量(栈内存)
生命周期不同:
成员变量(随着对象的存在而存在,随着对象的消失而消失)
局部变量(随着方法的调用而 存在,醉着方法的调用完毕而消失)
初始化值不同:
成员变量(有默认初始化值)
局部变量(没有默认初始化值,必须先定义,赋值才能使用)
封装
private关键字
private 是一个修饰符,可以用来修饰成员(成员变量,成员方法)
- 被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
- 提供get变量名()方法,用于获取成员变量的值,方法用public修饰
- 提供set变量名()方法,用于设置成员变量的值,方法用public修饰
/*
学生类
*/
package com.itdemo_02;
public class Student01 {
//成员变量
String name;
private int age;
//提供get/set方法
public void setAge(int a){
if(a<0||a>120){
System.out.println("年龄有误");
}else{
age=a;
}
}
public int getAge(){
return age;
}
public void show(){
System.out.println(name+","+age);
}
}
/*
学生测试类
*/
package com.itdemo_02;
public class StudentTest04 {
public static void main(String[] args) {
//创建对象
Student01 s = new Student01();
//给成员变量赋值
s.name="小乔";
// s.setAge(18);
s.setAge(1000);
//调用show成员方法
s.show();
}
}
private关键字的使用
一个标准类的编写
- 把成员变量用private修饰
- 提供对应的getXxx()/setXxx()方法
package com.itdemo_02;
/*
学生类
*/
public class Student02 {
//成员变量
private String name ;
private int age;
//get/set方法
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
public int getAge(){
return age;
}
public void setAge(int a){
age =a;
}
public void show(){
System.out.println(name+","+age);
}
}
package com.itdemo_02;
/*
学生测试类
*/
public class StudentTest05 {
public static void main(String[] args){
//创建对象
Student02 s = new Student02();
//使用set方法给成员赋值
s.setName("林青霞");
s.setAge(30);
s.show();
//使用get方法获取成员变量的值
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s.getName()+","+s.getAge());
}
}
this关键字
- this关键字
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名.不带this修饰的变量指的是成员变量
- 什么时候使用this呢? 解决局部变量隐藏成员变量
- this:代表所在类的对象引用
- 记住: 方法被哪个对象调用,this就代表哪个对象
- 记住: 方法被哪个对象调用,this就代表哪个对象
package com.itdemo_02;
/*
student类
*/
public class Student03 {
//创建成员变量
private String name;
private int age;
//set/get方法
public String getName(){
return name;
}
public void setName(String name){
//name =name ;
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
// age =age;因在局部变量所以被认为成形参,而不是成员变量
this.age = age;
}
//show方法
public void show(){
System.out.println(name+","+age);
}
}
package com.itdemo_02;
/*
学生测试类
*/
public class StudentTest06 {
public static void main(String[] args) {
//创建对象
Student03 student03 = new Student03();
//使用set方法给成员变量赋值
student03.setName("林宥嘉");
student03.setAge(30);
student03.show();
}
}
this内存原理
:
封装
- 封装概述:
是面向对象三大特征之一(封装,继承,多态)是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的 - 封装原则:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,成员变量private,提供对应的getXxx()/setXxx()方法 - 封装的好处
- 通过方法来控制成员变量的操作,提高了代码的安全性,
- 把代码用方法进行封装,提高了代码的复用性
构造方法
构造方法概述
构造方法是一种特殊的方法
作用:创建对象
格式
public class 类名{
修饰符 类名(参数){
}
}
功能主要是完成对象数据初始化
package com.itdemo_02;
/*
学生类
构造方法
修饰符一班用public
*/
public class Student04 {
private String name;
private int age;
//构造方法
public Student04(){
System.out.println("无参构造方法");
}
public void show(){
System.out.println(name+","+age);
}
}
package com.itdemo_02;
/*
学生测试类
*/
public class StudentTest07 {
public static void main(String[] args) {
//创建对象
Student04 student04 = new Student04();
student04.show();
}
}
构造方法的注意事项
- 构造方法的创建
- 如果没有定义构造方法,系统将会给出一个默认的无参数构造方法,
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 构造方法的重载
- 如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
- 推荐的使用方法
- 无论是否使用,都手工书写无参数构造方法
- 重要功能
- 可以使用带参构造,为成员变量进行初始化
package com.itdemo_02;
/*
学生类
*/
public class Student05 {
private String name;
private int age;
public Student05(){}
public Student05(String name){
this.name = name;
}
public Student05(int age){
this.age =age;
}
public Student05(String name,int age){
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+","+age);
}
}
package com.itdemo_02;
/*
测试类
*/
public class StudentTest08 {
public static void main(String[] args) {
//创建对象
Student05 s1 = new Student05();
s1.show();
//public Student05(String name)
Student05 s2 = new Student05("林青霞");
s2.show();
//public Student05(int age)
Student05 s3 = new Student05(30);
s3.show();
//public Student(String name,int age)
Student05 s4 = new Student05("林青霞",30);
s4.show();
}
}
标准类的制作
- 成员变量
- 使用private修饰
- 构造方法
- 提供一个无参构造方法
- 提供一个带多个参数的构造方法
- 成员变量
- 提供每一个成员变量对应的setXxx()/getXxx()
- 提供一个显示对象信息的show()
- 创建对象并为其成员变量赋值的两种方式
- 无参数方法创建对象后使用setXxx()赋值
- 使用带参数构造方法直接创建带有属性值的对象
package com.itdemo_02;
/*
学生类
构造方法
提供一个无参构造方法
提供一个带多个参数的构造方法
*/
public class Student06 {
//成员变量
private String name;
private int age;
//构造方法
public Student06(){}
public Student06(String name ,int age){
this.name = name;
this.age = age;
}
//成员方法
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age= age;
}
public void show(){
System.out.println(name+","+age);
}
}
package com.itdemo_02;
/*
测试类
*/
public class StudentTest09 {
public static void main(String[] args) {
//无参构造方法创建对象后使用setXxx赋值
Student06 s1 = new Student06();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用带参构造方法直接创建带属性值的对象
Student06 s2 = new Student06("林青霞",30);
s2.show();
}
}