Java面向对象(上)
面向对象思想概述
通过调用对象,来对一些步骤与功能封装好的类完成对应复杂的操作。而不是面向过程一步一步的实现需求。
面向过程:强调的是每一个功能的步骤。
面向对象:强调的是对象,然后由对象取调用功能。
特点:是一种符合我们思考习惯的思想;
可以将复杂的事情简单化;
让我们从执行者变成了指挥者;
类与对象
我们如何表示现实世界的事物呢?
A:属性 就是事物的描述性息
B:行为 就是事物能做什么
类: 是一组相关属性和行为的集合;
对象: 就是该事物的具体表现
类的定义
类的定义:类是用来描述现实事物的
事物:属性
行为
类如何和事物进行对应的呢?
类: 成员变量
成员方法
成员变量与普通变量的区别:
位置不同:定义在类中并且在方法外;
初始值:成员变量不需要给初始化值也可以使用,因为他有默认值;
成员方法与普通方法区别:
去掉了修饰符中的static关键字;
定义一个学生类;
public class Student {
String name;
int age;
public void study(){
System.out.println("学习");
}
public void eat(){
System.out.println("吃饭");
}
}
类的使用
类的使用:
其实就是使用该类的成员(成员变量和成员方法)
我们想要使用一个类的成员,必须要先拥有该类的对象。
如何拥有一个类的对象?
创建一个类的对象(格式: 类名 对象名 = new 类名() )
成员变量: 对象名.成员变量
成员方法:对象名.成员方法
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
System.out.println("s:"+s);
System.out.println(s.name);
System.out.println(s.age);
s.eat();
s.study();
s.name = "姚明";
s.age = 20;
System.out.println(s.name);
System.out.println(s.age);
}
}
对象内存图
一个对象的内存图:
两个对象的内存图:
两个对象指向同一个堆内存(跟两个数组指向一个堆内存一个道理)
成员变量和局部变量的区别
成员变量与局部变量区别:
1.在类中的位置不同
成员变量:在类中,方法外;
局部变量:在方法内或者方法声明上(形式变量);
2.在内存中的位置不同
成员变量:在堆内存中;
局部变量:在栈内存中;
3.生命周期不同
成员变量:随着对象创建而存在,随着对象消失而消失;
局部变量:随着方法调用而存在,随着方法调用完毕而消失;
4.初始化值不同
成员变量:有默认初始值;
局部变量:必须先赋值后使用;
private关键字
直接使用对象名访问成员变量,会存在数据安全问题;
使用private关键字实现保证数据安全;
private:
是一个修饰符;
可以修饰成员变量和成员方法;
被private修饰的成员只在本类中才能访问
针对被private修饰的成员变量,我们会相应的给出getXxx()和setXxx()用于获取和设置成员变量值
方法用public修饰
public class Student {
private String name;
private int age;
public void setAge(int a){
if (a<0 || a>200){
System.out.println("给出年龄有误");
}
else {
age = a;
}
}
public int getAge(){
return age;
}
封装
封装的概述:面向对象三大特征之一
是面向对象编程语言对客观世界的模拟,客观世界里的成员变量都是隐藏在对象内部的,
外界无法直接进行操作和修改。
封装的原则:
将不需要对外提供的内容都隐藏起来
把属性隐藏,提供公共方法对其访问
private,提供对应的getXxx()/setXxx()访问
好处:通过控制成员变量的操作提高代码安全性;把代码用方法进行封装提高了代码的复用性。
this关键字
public class Student {
private String name;
private int age;
public void setAge(int age){
if (a<0 || a>200){
System.out.println("给出年龄有误");
}
else {
this.age = age;
}
}
public int getAge(){
return age;
}
代码需要坐待参数名能够“见名知意”;但是如果改成一样就不知道哪个是形式参数,
哪个是对象的成员变量。所以用this关键字来指定对象的成员变量;
this:代表所在类的对象引用
方法被哪个对象调用,this就代表谁
构造方法
用于给对象数据进行初始化
格式:
方法名与类名相同;
没有返回值类型,连void都不能写;
没有具体的返回值;
通过 new 来调用构造方法
public class Student {
public Student(){
System.out.println("构造方法");
}
}
public class StudentTest {
public static void main(String[] args) {
Student std = new Student();
}
}
构造方法的注意事项:
1.如果我们没给出构造方法,那么系统会给一个默认的无参数构造方法;
2.如果我们给出了构造方法,系统将不再提供默认的构造方法,
这个时候我们必须自己提供无参构造方法;
3.构造方法是可以重载的;
public class Student {
private String name;
private int age;
public Student(){
System.out.println("构造方法");
}
public Student(String name){
this.name = name;
}
public Student(int age){
this.age = age;
}
public Student(int age,String name){
this.age = age;
this.name = name;
}
}
标准类的代码写法与测试
类
1.成员变量(被private修饰)
2.构造方法 (无参构造方法与带参构造方法)
3.成员方法
getXxx()
setXxx()
给成员变量赋值的方式
1.无参构造方法+setXxx()
2.带参构造方法
package com.scy;
public class Student {
private String name;
private int age;
public Student(){}
public Student(int age,String name){
this.age = age;
this.name = name;
}
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.scy;
public class StudentTest {
public static void main(String[] args) {
Student std = new Student();
std.setAge(10);
std.setName("wang");
System.out.println(std.getAge()+"---"+std.getName());
Student std2 = new Student(11,"liu");
System.out.println(std2.getAge()+"---"+std2.getName());
}
}