1.1面向对象思想概述:
- java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,这里的对象泛指现实中的一切事物,每种事物都具备自己的属性和行为。
- 特点:面向对象思想是一种更符合我们思考习惯的思想,它可以将简单的事情复杂化,并将我们从执行者变成指挥者。
- 面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾
起来- 面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来
- 面向过程:强调步骤。
- 面向对象:强调对象,这里的对象就是洗衣机。
- 面向对象的语言中,包含了三大基本特征,即封装、继承和多态。
1.2 类与对象:
- 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
- 现实中,描述一类事物:
- 属性:就是该事物的状态信息。
- 行为:就是该事物能够做什么。
- 举例:猫
- 属性:名字、体重、年龄、颜色。
- 行为:走、跑、叫。
- 对象:是一类事物的具体体现。对象是类的一个实例,必然具备该事物的属性和行为。
- 现实中,一类事物的一个实例:一只小猫。
- 举例:一只小猫。
- 属性:jack、10kg、1years、yellow
- 行为:溜墙根走、蹦跶的跑、喵喵叫
1.3 类与对象的关系:
- 类是对一类事物的描述,是抽象的。
- 对象是一类事物的实例,是具体的。
- 类是对象的模板,对象是类的实体。
1 .4类的定义:
- 现实世界中的一类事物:
属性:事物的状态信息。 行为:事物能够做什么。
- java中用class描述事物也是如此:
成员变量:对应事物的属性。 成员方法:对应事物的行为。
- 类的定义格式:
public class 类名{
//成员变量
//成员方法
}
- 定义类:就是定义类的成员,包括成员变量和成员方法。
- 成员变量:和以前定义变量几乎是一样的,只不过是位置发生了改变。在类中,方法外。
- 成员方法:和以前定义方法几乎是一样的,只不过把static去掉。
public class Student {
//成员变量
private String name;
private int age;
private double score;
//成员方法
public void eat(){
System.out.println("吃个蛋炒饭");
}
public void sleep(){
System.out.println("学习java累了要睡觉");
}
}
1.5 对象的使用:
对象的使用格式
创建对象: 类名 对象名=new 类名();
使用对象访问类中的成员:
对象名.成员变量;
对象名.成员方法;
public class Student_Test01 {
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);
System.out.println("-------------");
//给成员变量赋值
s.name="马云";
s.age=19;
System.out.println("姓名:"+s.name);
System.out.println("年龄:"+s.age);
//调用成员方法
s.eat();
s.sleep();
}
}
1.6 成员变量的默认值:
数据类型 | 默认值 | |
基本数据类型 | 整型(byte,short,int,long) | 0 |
浮点数(float,double) | 0.0 | |
字符(char) | '\u0000' | |
布尔(boolean) | false | |
引用数据类型 | 数组,类,接口 | null |
2.1成员变量和局部变量的区别:
public class Car {
int x;//类中方法外的变量是成员变量
public void run(int speed){
int a=10;//方法中或参数上的变量都是局部变量
}
}
- 什么是成员变量:放在类中方法外的变量
- 什么是局部变量:放在方法中或参数上的变量
- 成员变量和局部变量的区别:
- (在类中的位置不同)
- 成员变量:放在类中方法外
- 局部变量:放在方法中或参数上的变量
- (作用范围不一样)
- 成员变量:类中都可以使用
- 局部变量:本方法中能用
- (初始化值不同)
- 成员变量:有默认值
- 局部变量:没有默认值,不赋值不能用
- (在内存中的位置不同)
- 成员变量:堆内存
- 局部变量:栈内存
- (生命周期不同)
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
3.1 面向对象三大特性:封装、继承、多态
- 封装:
- 人的属性:姓名,年龄,身高,性别,三围,银行卡密码,钱包等。
- 人有很多属性,但是有些属性是隐私的,不能暴露出来。
- 封装的原则(步骤):
- 将隐私的内容私有。
- 提供get/set方法(get表示获取/set表示修改)
- 如何将成员变量私有:
- 使用private关键字。
- private表示私有,只有本类可以使用。
- private可以修饰成员变量和成员方法。
- private修饰成员变量格式:
- private 数据类型 变量名(如:private String name)
- 封装的好处:提高代码的安全性。
4.1 this关键字:
- 成员变量和局部变量重名了(就近原则),使用局部变量。
- this关键字的作用:用来区分局部变量和成员变量
- this.变量名 表示成员变量
- this到底是什么东西呢?谁调用方法,this就是谁
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
name = name;
age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.setAge(18);
p.setName("马云");
System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());
}
}
- 虽然使用了p.setAge和p.setName给成员变量赋值了,但是打印出来结果还是姓名:null年龄:0 。这是因为get/set方法中name/age还是局部变量,并没有赋值给成员变量。需要加上this关键字解决,this.name代表成员变量的name,则this.name=name,这样就将值赋给成员变量了。
- 成员变量赋值失败了,也就是说,在修改了setXxx() 的形参(方法小括号中的String name为形参)变量名后,方
法并没有给成员变量赋值!这是由于形参变量名(name)与成员变量名(name)重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字解决问题。
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("this="+this);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
System.out.println("p="+p);
p.setAge(18);
p.setName("马云");
System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());
}
}
- 输出结果:
p=Test.Person@58ceff1 this=Test.Person@58ceff1 姓名:马云年龄:18
在上面的代码中,我们把对象p和this打印出来,发现p和this的地址值是一样 的,都是 @58ceff1,说明是同一个对象,p调用了setName方法 ,setName中的this地址和p一样,所以,谁调用了方法,this就是谁。
5.1 构造方法:
- 什么是构造方法:构造方法也是一个方法,在创建对象的时候执行一次(早)
- 构造方法的作用:在创建对象的时候给成员变量赋值(给对象初始化)
- 构造方法格式:
public 类名(){ }
- 特点:
- 没有返回值,连void都不能写。
- 构造方法名称和类名一致。
- 一个类不写构造方法,java会默认赠送一个无参构造。
- 当我们自己添加了构造方法,就没有默认的无参构造方法了。
- 构造方法可以重载。
- 构造方法什么时候调用:
- 类名 对象名 = new 类名();
Person p = new Person
new :表示在堆中申请一块内存空间
类名():表示调用构造方法
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
System.out.println("p="+p);
/*
问题1:如果代码太多,可能会忘记赋值,最终没值
问题2:如果有50个成员变量赋值,需要写50个set方法,麻烦
有没有什么办法一创建出对象,成员变量就有值了,后面直接使用
这时就需要使用有参构造方法
*/
p.setAge(18);
p.setName("马云");
System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());
System.out.println("-------------------------");
//创建对象,使用有参构造
Person p2 = new Person("马化腾",19);
System.out.println("姓名:"+p2.getName()+"年龄:"+p2.getAge());
}
}
public class Person {
private String name;
private int age;
public Person() {
System.out.println("我是无参构造");
}
public Person(String name, int age) {
System.out.println("我是有参构造");
this.name = name;//将参数赋值给成员变量
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("this="+this);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
构造方法可以给成员变量赋值,set方法也可以给成员变量赋值,他们的区别是:
- 构造方法会在创建对象的时候走一次,一个对象只能执行一次构造方法。
- set方法是在对象创建好之后,通过对象调用set方法,一个对象可以多次调用set方法,这样就可以修改值。(比如年龄今年是18岁,过了一年变成19,那么就需要通过set方法去修改值)
版权申明:本文为博主原创文章,转载请注明出处https://blog.csdn.net/Huangyuhua068/article/details/81417223
如有错误,欢迎批评指正,联系邮箱:[email protected]