1.概述
*面向对象思想就是指创建对象,使用对象
*class是用来描述生活中的事务
*属性:特征------>成员变量
*行为:能做什么事------>成员方法
*类:一组相同属性和行为的集合体
*对象:就是该类其中的一个具体事务
*面向对象的特点
*强调对象
*自己是指挥者的角度
*可以将复杂的事情简单化
*面向对象的三大特征
*封装
*多态
*继承
2.成员变量和局部变量的区别
*在类中的位置不同
*局部变量:在方法内
*成员变量:在类中,方法外
*在内存中的位置不同
*局部变量:在栈内,变量为赋值不能使用
*成员变量:在堆内存中,因为有初始化值,直接可以拿来用
*生命周期不同
*局部变量:随着方法的调用而存在,随着方法的结束而消失
*随着类的对象的创建而存在,随着对象的消失而消失
*初始化值不同
*局部变量:没有默认的初始化值
*成员变量:有默认的初始化值
package com.text;
/*
* 成员变量和局部变量的区别:
* A:在类中的位置不同
* 成员变量:类中,方法外
* 局部变量:方法中或者方法声明上(形式参数)
* B:在内存中的位置不同
* 成员变量:堆内存
* 局部变量:栈内存
* C:生命周期不同
* 成员变量:随着对象的创建而存在,随着对象的消失而消失
* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值的问题
* 成员变量:有默认值
* 局部变量:没有默认值。必须先定义,赋值,最后使用
*/
public class Variable {
int x;
public void show() {
int y = 0;
System.out.println(x);
System.out.println(y);
}
}
3.封装
*private关键字
*是一个权限修饰符
*可以修饰成员变量
*被private修饰的成员只能在本类中访问
*常用来修饰成员变量
*提供公共的getter和setter方法
package com.text;
/*
* 学生类
*
* 通过对象直接访问成员变量,会存在数据安全问题
* 这个时候,我们就想能不能不让外界的对象直接访问成员变量呢?
* 能。
* 如何实现呢?
* private关键字
*
* private:
* 是一个修饰符
* 可以修饰成员变量,也可以修饰成员方法
* 被private修饰的成员只能在本类中被访问
*
* 针对private修饰的成员变量,我们会相应的提供getXxx()和setXxx()用于获取和设置成员变量的值,方法用public修饰
*/
public class Student {
String name;
//int age;
private int age;
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+",年龄是:"+age);
}
}
package com.text_01;
/*
* 学生类的测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建学生对象
Student s = new Student();
s.show();
s.name = "小明";
//s.age = 28;
//s.age = -28;
//s.setAge(-28);
s.setAge(28);
s.show();
}
}
*封装的概述
*是面向对象的三大特性之一
*是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改
*封装的原则:
*将不需要对外提供的内容都隐藏起来
*把属性隐藏,提供公共的方法对其访问
*成员变量private,提供对应的getter和setter方法
*好处
*通过方法来控制成员变量的操作,提过了代码的安全性
*把代码用方法进行封装,提高代码的复用性
*this关键字
*this代表所在类的对象引用
*方法被那个对象调用,this就代表那个对象(谁调用代表谁)
*this的使用场景
*局部变量和成员变量重名
4.面向对象的构造方法
*构造方法
*主要用来给对象的数据进行初始化
*构造方法的格式
*方法名与类名相同
*没有返回值类型
*没有具体的返回值
*构造方法和普通方法的区别
*构造方法没有返回值,连void都没有
*构造方法的方法名必须和类名一致
*构造方法是通过new来调用,用来给属性在堆内存开辟空间,而普通方法是通过对象来调用的
package com.text;
/*
* 构造方法:
* 给对象的数据进行初始化
*
* 格式:
* 方法名和类名相同
* 没有返回值类型,连void都不能写
* 没有具体的返回值
*
*/
public class Student {
public Student() {
System.out.println("这是构造方法");
}
}
*构造方法的调用
package com.text;
public class StudentDemo {
public static void main(String[] args) {
//如何调用构造方法呢?
//通过new关键字调用
//格式:类名 对象名 = new 构造方法(...);
Student s = new Student();
}
}
*构造方法的注意事项与重载
*不提供无参构造方法,系统会给出默认的无参构造方法
*如果提供了构造方法,系统就不会提供默认的构造方法
*构造方法也可以重载
package com.text;
/*
* 构造方法:
* 给对象的数据进行初始化
*
* 格式:
* 方法名和类名相同
* 没有返回值类型,连void都不能写
* 没有具体的返回值
*
* 构造方法的注意事项:
* A:如果我们没有给出构造方法,系统将会提供一个默认的无参构造方法供我们使用。
* B:如果我们给出了构造方法,系统将不在提供默认的无参构造方法供我们使用。
* 这个时候,如果我们想使用无参构造方法,就必须自己提供。
* 推荐:自己给无参构造方法
* C:构造方法也是可以重载的
*
* 成员变量赋值:
* A:setXxx()方法
* B:带参构造方法
*/
public class Student {
private String name;
private int age;
/*
public Student() {
System.out.println("这是构造方法");
}
*/
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
package com.text;
public class StudentDemo {
public static void main(String[] args) {
//如何调用构造方法呢?
//通过new关键字调用
//格式:类名 对象名 = new 构造方法(...);
Student s = new Student();
s.show();
//public Student(String name)
Student s2 = new Student("小红");
s2.show();
//public Student(int age)
Student s3 = new Student(28);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("小红",28);
s4.show();
}
}
*标准学生类代码
*类
*成员变量
*构造方法
*有参和无参
*成员方法
*getter和setter方法
*给成员变量赋值的方式
*无参构造+setter方法
*有参构造
package com.text;
/*
* 学生类
*/
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成员方法
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;
}
}
5.类名作为形参和返回值
*类名作为形参
package com.text;
public class Student {
public void study() {
System.out.println("好好学习,天天向上");
}
}
package com.text_01;
public class Teacher {
public void test(Student s) {//接收传递过来的Student对象的地址值
s.study();
}
}
package com.txt_02;
//需求: 调用Teacher的test方法
//类名作为形式参数:其实这里需要的是该类对象。
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student();
t.test(s);
}
}
*类名作为返回值
package com.text;
public class Student {
public void study() {
System.out.println("好好学习,天天向上");
}
}
package com.text;
public class Teacher {
public Student getStudent() {
Student s = new Student();
return s;//返回的是Student对象的地址值
}
}
package com.text;
//需求: 通过Teacher得到Student对象,然后调用Student类的方法
//如果方法的返回值是类名:其实返回的是该类的对象
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = t.getStudent();
s.study();
}
}