面向对象思想
把步骤和功能进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。
面向对象思想特点
1.是一种更符合我们思想习惯的思想;
2.可以将复杂的事情简单化;
3.将我们从执行者变成了指挥者;
面向对象特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
类和对象的概念
类:是一组相关的属性和行为的集合;
对象:是该类事物的具体体现;
事物 ------------------ 类
属性 ----------------- 成员变量
行为 ----------------- 成员方法
定义类其实就是定义类的成员(成员变量和成员方法)
成员变量: 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
成员方法: 和以前定义方法是一样的,只不过把static去掉。
属性 ----- 成员变量
行为 ----- 成员方法
如何使用类
类是一个抽象的概念,你无法直接使用,要使用类中的属性功能,必须创建该类对象;
1.文件名问题
在一个java文件中写两个类:一个基本的类,一个测试类。
建议:文件名称和测试类名称一致。
2.如何使用呢?
创建对象使用。
3.如何创建对象呢?
格式:类名 对象名 = new 类名();
4.如何使用成员变量呢?
格式:对象名.变量名
5.如何使用成员方法呢?
格式:对象名.方法名(…)
成员变量和局部变量的区别
1.在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上(形参)
2.在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
3.生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4.初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意:局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
方法的形式参数是类名的时候如何调用
1.Java中参数传递问题
形式参数
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
2.方法的参数是类名
如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
基本数据类型,作为参数传递,形参的改变,不影响实参
引用输入类型,作为参数传递,形参的改变,会影响实参
public class MyTest {
public static void main(String[] args) {
//基本数据类型,作为参数传递,形参的改变,不影响实参
//引用输入类型,作为参数传递,形参的改变,会影响实参
//引用数据类型:数组,类,接口
Dog dog = new Dog();
//如果你以后看到一个方法的形参,要一个 类 类型 那么你就传一个该类的对象
String name = "小花";
int num = 100;
dog.show(dog, name, num);
System.out.println(dog.name);// kitty
System.out.println(dog.age);// 101
System.out.println(name);// 小花
System.out.println(num);// 100
}
}
class Dog {
String name;
int age;
public void show(Dog dog1, String name, int num) {
System.out.println("这个方法调用了");
name = "kitty";
num = 100 + 1;
dog.name = name;
dog.age = num;
System.out.println(name);// kitty
System.out.println(num);//101
}
}
匿名对象
1.什么是匿名对象?
就是没有名字的对象;
2.匿名对象应用场景
a:调用方法,仅仅只调用一次的时候;
b:匿名对象可以作为实际参数传递。
封装
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
1.封装好处
隐藏实现细节,提供公共的访问方式;
提高了代码的复用性;
提高安全性;
2.封装原则
将不需要对外提供的内容都隐藏起来;
把属性隐藏,提供公共方法对其访问;
private关键字
1.特点
a:是一个权限修饰符;
b:可以修饰成员变量和成员方法;
c:被其修饰的成员只能在本类中被访问;
2.private最常见的应用:
1)把成员变量用private修饰;
2)提供对应的getXxx()和setXxx()方法;
public class MyTest {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(20);
String name = student.getName();
int age = student.getAge();
System.out.println("姓名:" + name + "=== 年龄" + age);
student.eat();
student.sleep();
System.out.println("-------------------");
Student student1 = new Student();
student1.setName("李四");
student1.setAge(24);
String name1 = student1.getName();
int age1 = student1.getAge();
System.out.println("姓名:" + name1 + "=== 年龄" + age1);
student1.eat();
student1.sleep();
}
}
public class Student {
private String name;
private int age;
//提供公共的set方法,让外界调用set方法来给成员变量设置
public void setName(String mingzi) {
name = mingzi;
}
public void setAge(int nianling) {
age = nianling;
}
//提供get方法,让外界通过get方法,来获取成员变量的值
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void sleep() {
System.out.println("睡觉");
}
public void eat() {
System.out.println("吃饭");
}
}
this关键字
1.为什么要有this?
当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致局部变量隐藏成员变量。
2.this关键字特点?
是当前类的对象引用。
简单的记,它就代表当前类的一个对象。谁调用这个方法,那么该方法内部的this就代表谁。
3.this的应用场景?
解决局部变量隐藏成员变量。
public class MyTest {
public static void main(String[] args) {
Teacher teacher = new Teacher();
System.out.println("teacher的地址值" + teacher);
//通过set方法,来给成员变量设置值
teacher.setName("沈某某");
teacher.setAge(18);
//通过get方法来获取值
String name = teacher.getName();
int age = teacher.getAge();
System.out.println(name);
System.out.println(age);
//this:代表本类的一个引用,你可以理解为本类的一个对象,哪个对象调用某个方法,那么方法中的this就代表这个对象
System.out.println("--------------------");
Teacher teacher1 = new Teacher();
System.out.println("teacher1" + teacher1);
teacher1.setName("王五");
teacher1.setAge(25);
String name1 = teacher1.getName();
int age1 = teacher1.getAge();
System.out.println(name1);
System.out.println(age1);
}
}
public class Teacher {
//私有成员变量
private String name;
private int age;
//提供公共的set方法
public void setName(String name) { //成员变量和局部变量重名了
System.out.println("this代表的那个对象" + this);
this.name = name;
//teacher.name=name;
}
public void setAge(int age) { //成员变量和局部变量重名了
System.out.println("this代表的那个对象" + this);
this.age = age;
}
//提供的公共的get方法
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void teache() {
System.out.println("教书");
}
}
构造方法
1.作用
创建对象,给对象中的成员进行初始化。
2.构造方法格式特点
a:方法名与类名相同;
b:没有返回值类型,连void都没有;
c:没有具体的返回值;
3.构造方法注意事项
a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法。
4.给成员变量赋值的两种方式
setXxx()方法
构造方法
public class Student {
private String name;
private int age;
//我们自定义的一个类中,默认就会存在一个空参的构造方法
//构造方法,就是用来初始化这个类的,完成对类的实例化
public Student() {
System.out.println("空参的构造方法执行了");
}
public Student(String name) {
System.out.println(name);
System.out.println("一个参数的构造方法,执行了");
}
public Student(String name, int age) {
//System.out.println(name);
//System.out.println(age);
System.out.println("两个参数的构造方法,执行了");
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 class MyTest {
public static void main(String[] args) {
//类,是一个抽象的概念,不能直接使用,要使用类中的属性和功能,必须对类进行实例化
// 我们可以使用关键字new
//我们在创建对象时,除了使用关键字new 之外 还得借助构造方法,来完成对类的实例化。
//借助空参的构造方法创建对象
Student student = new Student();
//借助有参的构造方法,创建对象
//Student student1 = new Student("zhangsan");
Student student2 = new Student("lisi", 24);
//System.out.println(student2.name);
//System.out.println(student2.age);
}
}
public class MyTest2 {
public static void main(String[] args) {
//采用空参构造来创建对象
Student student = new Student();
student.setName("zhangsan");
student.setAge(13);
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println("--------------------------------");
//采用有参构造来创建对象,在创建对象的同时,就可以给成员变量赋值
Student student1 = new Student("wangwu", 25);
System.out.println(student1.getName());
System.out.println(student1.getAge());
}
}
定义一个长方形(RectangleDemo) 类, 定义求周长(length) 和面积(area) 的方法,然后定义一个测试类Test,进行测试。
public class MyTest {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.setHeight(100);
rectangle.setWidth(200);
double perimeter = rectangle.getPerimeter();
double area = rectangle.getArea();
System.out.println("面积是"+area+"==周长是"+perimeter);
System.out.println("-------------------");
Rectangle rectangle1 = new Rectangle(10.3, 190.6);
double perimeter1 = rectangle1.getPerimeter();
double area1 = rectangle1.getArea();
System.out.println("面积是" + area1 + "==周长是" + perimeter1);
}
}
public class Rectangle {
//定义属性
private double width;
private double height;
//提供构造方法
public Rectangle() {
}
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
//提供get set 方法
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
//提供获取周长的方法
public double getPerimeter() {
return (width + height) * 2;
}
//提供获取面积的方法
public double getArea() {
return width * height;
}
}
static关键字
特点:
1.随着类的加载而加载;
2.优先于对象存在;
3.被类的所有对象共享;
什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
注意:
1.在静态方法中是没有this关键字的;
2.静态方法只能访问静态的成员变量和静态的成员方法;
静态只能访问静态,非静态可以访问静态的也可以访问非静态的。
静态变量和成员变量的区别
1.所属不同
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
2.内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
3.内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
4.调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用