面向对象的思想
面向对象思想:强调对象,由对象去调用功能
- 1-是一种符合我们思考习惯的思想
- 2-将复杂变简单
- 3-将我们从执行者变成指挥者
类
如何表示事物:
-
1-属性
-
2-行为
-
例如-学生
-
Java语言最基本的单位是类:一组相关的属性和行为的集合
-
对象:就是该事物的具体体现
-
举例:
-
类-学生
-
对象-学生
类的简单定义
- 类的定义:属性和方法
- 类:
-
成员变量:和普通变量的定义是一样的,只是位置不同(类中,方法外),不需要给初始化
-
成员方法:和普通方法的定义是一样的,只是要去掉static关键字
package com.object1;
/*
* 手机类的定义:
* 变量:品牌、价格、颜色
* 方法:短信、电话
*/
public class Phone {
//变量
String brand;
int price;
String color;
//方法
public void call(String name) {
System.out.println("给"+name+"打电话");
}
public void mess(String name) {
System.out.println("给"+name+"发信息");
}
}
package com.object1;
public class PhoneDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Phone p=new Phone();
//变量赋值
p.brand="锤子";
p.color="黑色";
p.price=2999;
//输出变量
System.out.println("品牌:"+p.brand);
System.out.println("颜色:"+p.color);
System.out.println("价格:"+p.price);
//调用方法
p.call("wang");
p.mess("li");
Phone p2=new Phone();
//变量赋值
p2.brand="小米";
p2.color="白色";
p2.price=1999;
//输出变量
System.out.println("品牌:"+p2.brand);
System.out.println("颜色:"+p2.color);
System.out.println("价格:"+p2.price);
//调用方法
p2.call("jiang");
p2.mess("shi");
//在创建新对象
Phone p3=p;
p3.brand="OPPO";
p3.color="紫色";
p3.price=3999;
//此时p的值p3是一致的(两个引用指向同一个对象)
System.out.println("---------------------");
System.out.println("品牌:"+p.brand);
System.out.println("颜色:"+p.color);
System.out.println("价格:"+p.price);
System.out.println("品牌:"+p3.brand);
System.out.println("颜色:"+p3.color);
System.out.println("价格:"+p3.price);
}
}
成员变量和局部变量
成员变量和局部变量:
-
A- 成员变量:类中,方法外
-
局部变量:方法中或方法声明上(形式参数)
-
B- 在内存中的位置不同:
-
成员变量:堆内存
-
局部变量:栈内存
-
C- 生命周期不同
-
成员变量:随独享的创建存在,随对象的消失而消失
-
局部变量:随着方法的调用存在,随着方法调用完毕而消失
-
D- 初始化
-
成员变量:有默认值
-
局部变量:没有默认值,必须先定义再使用
private修饰
package com.object3;
/*
* 通过对象直接访问成员变量,会存在数据安全问题
* 使用private不让外界直接访问成员变量
* private修饰符:可以修饰成员变量和成员方法,被修饰后只能在本类中使用
*
* 针对private修饰的成员变量,我们会相应的提供getXXX()和setXXX()方法用于获取和设置成员变量的值,
* 方法用public修饰
*/
public class Student {
//属性-姓名、年龄---
//方法-学习、吃饭
//成员变量
String name;
private int age;
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
if (a<0||a>200) {
System.out.println("年龄设置有误");
}else {
age=a;
}
}
public int getAge() {
return age;
}
//方法
public void show() {
System.out.println("name:"+name+";"+"age:"+age);
}
public void study() {
System.out.println("认真学习");
}
public void eat() {
System.out.println("好好吃饭");
}
}
package com.object3;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s=new Student();
s.show();
s.setAge(28);
s.setName("wang");
s.show();
}
}
封装-面向对象的三大特征之一(继承和多态)
封装的原则:把不需要对外提供的内容隐藏
把属性隐藏,提供公共方法对其访问
private修饰的成员变量,我们会相应的提供getXXX()和setXXX()方法用于
获取和设置成员变量的值,方法用public修饰
this 关键字
如果局部变量和成员变量同名,在局部使用时,采用就近原则
- this关键字(解决局部变量隐藏成员变量的问题):代表所在类的对象引用
- 方法被哪个对象调用,this就代表那个对象
package com.object4;
public class Student {
//成员变量
String name;
private int age;
public void setName(String name) {
//name=name;
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age=age;
this.age=age;
}
public int getAge() {
return age;
}
//方法
public void show() {
System.out.println("name:"+name+";"+"age:"+age);
}
}
构造方法
给对象的数据进行初始化
构造方法的格式:
方法名和类名相同
没有返回值类型,连void都不能写
没有具体的返回值
构造方法的调用
通过new关键字调用
格式为:
-
类名 对象名 = new 构造方法(.....);
构造方法的注意:
-
1-如果我们没有构造方法,那么系统会默认提供一个无参的构造方法
-
2-如果我们给出了构造方法,系统将不再提供无参的构造方法,如果想使用必须自己提供
-
3-构造方法也是可以重载的
成员变量赋值:
-
1-setXX方法
-
2-带参构造方法
package com.object5;
public class Student {
private String name;
private int age;
public Student() {
System.out.println("这是无参构造方法");
}
public Student(String name) {
System.out.println("这是带一个参数的构造方法");
this.name = name;
}
public Student(String name,int age) {
System.out.println("这是带两个参数的构造方法");
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
一个完整的类的书写方式如下:
package com.object6;
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
System.out.println("无参构造方法");
}
public Student(String name,int age) {
System.out.println("有参构造方法");
this.name = name;
this.age = age;
}
//成员方法-get和set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
package com.object6;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//无参方法进行赋值
Student s = new Student();
s.setName("wang");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
//另一种构造方法进行赋值
Student s1 =new Student("tong",27);
System.out.println(s1.getName()+"---"+s1.getAge());
}
}