1.面向过程的代表语言:C语言
2.面向对象
2.1面向对象:是以对象为基础的编程—分析需求,找到对象,利用对象去处理业务
2.2什么是对象?
万物皆对象--看得见摸得着的东西<br />(1)特征(属性)--名词<br />(2)特征(方法)--动词
2.3面向对象的特点
(1)高效—-节省代码量,可以进行封装,将一些共有的属性和方法进行打包
(2)可以将程序中的逻辑进行抽象—-把对象中的共有的属性进行提取—>封装
2.4面向对象的特征:封装、继承、多态
封装:实际上就是把一些共有的属性和方法进行抽象之后打包—-后面可以灵活地调用
继承:子类可以继承父类的属性和方法—还可以拓展父类的功能
多态:贯穿于整个oop的,灵活地比较难理解的点—一个对象多种状态
2.5我们学习Java中的最基本的单位(层级结构)—-类
类可以封装数据
类:是一组相关的属性和行为的集合
对象:是该类事物的具体体现
2.6定义类其实就是定义类的成员(成员变量和成员方法)
成员变量:就是事物的属性
定义成员变量,在类中,方法外
成员方法:就是事物的行为
定义成员方法,就是一种方法,只不过不用static
调用类:创建一个对象
格式:类名 对象名=new 类名();
匿名对象:new 类名();只能调用一次。
调用成员变量:对象名.成员变量
调用成员方法:对象名.成员方法
案例:
/**
* @author Lynn
* @create 2020-11-23-10:44
*/
/**
* 需求:封装一个学生类
*
* 学生的事物:
* 特征:姓名,年龄····
* 行为:学习,吃饭····
*
* 成员变量(全局变量):声明在类中,方法外
* 初始化:不必要
*
* 成员方法:其实就是方法,只不过不能加static
*/
public class Student {
//成员变量---属性
String name;
int age;
public void study(){
//成员方法---行为
System.out.println("good good study");
}
public void eat(){
System.out.println("干饭啦");
}
}
/**
* @author Lynn
* @create 2020-11-23-11:04
*/
/**
* Student 是一个类,用来描述学生的信息
* 利用demo这个类来实例化Student
*
* 对象的实例化---new 对象
* 格式:
* 类名 对象名=new 类名()
*
* 访问对象的属性
* 成员变量:对象名.成员变量
* 成员方法:对象名.成员方法
*/
public class StudentDemo {
public static void main(String[] args) {
//实例化对象
Student s=new Student();
//查看对象
System.out.println("s"+s);//sStudent@4554617c(是一个地址,表示当前这个Student在内存中的地址)
//调用属性和方法
System.out.println("姓名:"+s.name);//姓名:null(null 表示空,对象是存在的,但是没有值--对象类型)
System.out.println("年龄:"+s.age);//年龄:0(基本类型)
//给成员变量赋值
System.out.println("-------------------------");
s.name="Lynn";
s.age=18;
// s.sex="男";// 没有这个属性,所以不能直接调用
System.out.println(s.name);
System.out.println(s.age);
System.out.println("-------------------------");
//调用成员方法
s.study();
s.eat();
}
}
练习
/**
* @author Lynn
* @create 2020-11-23-11:19
*/
public class Phone {
// 定义成员变量
String brand;
int price;
String color;
//定义成员方法
public void call(){
System.out.println("你的电话响啦!");
}
public void send(){
System.out.println("该干饭啦!");
}
public void paly(){
System.out.println("TiMi");
}
}
2.7Java语言的特点:
强类型语言:必须经过编译才可以运行的
可移植性:一处编写,到处运行
面向对象
/**
* @author Lynn
* @create 2020-11-23-11:24
*/
/**
* 强类型语言:必须经过编译才可以运行的
* 可移植性:一处编写,到处运行
* 面向对象
*
* 编译期:程序员写好代码之后,按下保存按钮之后的事情--将Java代码编译成二进制的字节码文件,即.class,保存在bin目录下
* 运行期:代码执行的期间
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象调用类
Phone p=new Phone();
//调用成员变量
p.brand="华为";
p.price=5699;
p.color="红色";
System.out.println("品牌:"+p.brand);
System.out.println("价格:"+p.price);
System.out.println("颜色:"+p.color);
//调用方法
p.call("Lynn");//实参
p.send();
p.paly();
}
}
/**
* @author Lynn
* @create 2020-11-23-14:30
*/
/**
*
*/
public class PhoneDemo02 {
public static void main(String[] args) {
//实例化第一个对象
Phone p1=new Phone();
p1.brand="索尼";
p1.price=1999;
p1.color="黑色";
System.out.println(p1.brand+","+p1.price+","+p1.color);
//实力化第二个对象
Phone p2=new Phone();
p2.brand="iPhone";
p2.price=6999;
p2.color="黑色";
System.out.println(p2.brand+","+p2.price+","+p2.color);
}
}
/**
* @author Lynn
* @create 2020-11-23-14:34
*/
public class PhoneDemo03 {
//main方法,程序的主入口,必须写成字符串类型(String[]),args是一个参数(形参)
public static void main(String[] args) {
//创建对象调用类
Phone p=new Phone();
//调用成员变量(赋值)
p.brand="华为";
p.price=5699;
p.color="红色";
System.out.println(p.brand+","+p.price+","+p.color);
//把对象p赋值给p2
Phone p2=p;
//两个对象的地址相同
System.out.println(p2);//Phone@4554617c
System.out.println(p);//Phone@4554617c
//为p2进行再赋值
p2.brand="iPhone";
p2.price=6999;
p2.color="黑色";
System.out.println(p2.brand+","+p2.price+","+p2.color);//iPhone,6999,黑色
System.out.println(p.brand+","+p.price+","+p.color);//iPhone,6999,黑色
}
}
2.8成员变量和局部变量的区别:
1.在类中位置不同
成员变量:在类中,方法外
局部变量:方法内或者声明上(参数列表)
2.在内存中的位置不同
成员变量—-堆内存中
局部变量—-栈内存中
3.生命周期不同
成员变量—-随着对象的存在而存在,随着对象的消失而消失
局部变量—-随着方法的调用而存在,随着方法的运行完毕而消失
4.初始化值不同—Java中规定的
成员变量—-有默认的初始化值
局部变量—-没有默认的初始化值—-必须先声明,赋值,才能使用
/**
* @author Lynn
* @create 2020-11-23-15:05
*/
/**
* 成员变量和局部变量的区别:
* 1.在类中位置不同
* 成员变量:在类中,方法外
* 局部变量:方法内或者声明上(参数列表)
*
* 2.在内存中的位置不同
* 成员变量---堆内存中
* 局部变量---栈内存中
*
* 3.生命周期不同
* 成员变量---随着对象的存在而存在,随着对象的消失而消失
* 局部变量---随着方法的调用而存在,随着方法的运行完毕而消失
*
* 4.初始化值不同--Java中规定的
* 成员变量---有默认的初始化值
* 局部变量---没有默认的初始化值---必须先声明,赋值,才能使用
*/
public class VailableDemo {
//成员变量
int x;
public void show(){
//方法内可以直接调用成员变量
System.out.println(x);
//局部变量
int y=9;
System.out.println(y);
}
public static void main(String[] args) {
//调用show方法
//1.首先要实例化对象(即创建对象)
VailableDemo v=new VailableDemo();
v.x=618;
v.show();
}
}
2.9 private:
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问。
/**
* @author Lynn
* @create 2020-11-23-15:22
*/
/**
* 当前案例中讲解数据的安全性
* 通过private这个关键字用于修饰数据进行数据的私有处理
*
* private:私有的
* 是一个权限修饰符
* 可以修饰变量方法
* 被private修饰的数据只能在本类中被访问
*
* 如果其他类中如要访问私有数据,可以申请访问:
* 即在当前类中声明get/set方法
*/
public class Student01 {
//成员变量---属性
String name;
private int age;
//声明set方法
public void setAge(int a){
//正常人的年龄0~200
if(a<0 || a>200){
System.out.println("非人类");
}else{
age=a;
}
}
//声明get方法
public int getAge(){
return age;
}
//展示学生信息
public void show(){
System.out.println("姓名:"+name+","+"年龄:"+age);
}
}
import java.sql.SQLOutput;
/**
* @author Lynn
* @create 2020-11-23-15:23
*/
public class StudentDemo01 {
public static void main(String[] args) {
Student01 s=new Student01();
System.out.println(s.getAge());//申请访问age属性
s.show();
//赋值
s.name="张三丰";
s.setAge(150);// 走setAge方法
// s.setAge(250);// 走setAge方法
//展示信息
s.show();
}
}
结果:
0
姓名:null,年龄:0
非人类 //这个数据显示在前面是因为,150这个数据在Student01中开始没有被打印,
//250这个数据显示打印出来,然后在调用show方法中
姓名:张三丰,年龄:150
private最常见的应用:
把成员变量用private修饰
提供对应的getXxx()/setXxx()方法
一个标准的案例的使用
3.封装
封装概述
是面向对象三大特征之一
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。就像上章说的年龄。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
成员变量private,提供对应的getXxx()/setXxx()方法
好处:
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
3.2this关键字
this: 代表所在类的对象引用
记住:方法被哪个对象调用,this就代表那个对象
什么时候使用this呢? 局部变量隐藏成员变量
package com.igeek_02;
/**
* @ClassName: Student
* @Description: 学生类
* @date 2017年11月10日 下午5:14:25
* Company www.igeekhome.com
*
* 起名字我们要求做到见名知意。
* 而我们现在的代码中的n和a就没有做到见名知意,所以我们要改进。
*
* 如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近原则。
*
* 我们有没有办法把局部变量的name赋值给成员变量的name呢?有
*
* 什么办法呢?
* 用this关键字就可以解决这个问题。
*
* this: 代表所在类的对象引用
* 方法被哪个对象调用,this就代表那个对象
*
* 使用场景: 局部变量隐藏成员变量
*/
public class Student {
/**
* @Fields name : 姓名
*/
private String name;
/**
* @Fields age : 年龄
*/
private int age;
/**
* @Title: setName
* @Description: 设置姓名
* @param n
*/
public void setName(String name){//吴京
//name=name;
this.name=name;
}
/**
* @Title: getName
* @Description: 获取姓名
* @return
*/
public String getName(){
return name;
}
/**
* @Title: setAge
* @Description: 设置年龄
* @param a
*/
public void setAge(int age){
//age=age;
this.age=age;
}
/**
* @Title: getAge
* @Description: 获取年龄
* @return
*/
public int getAge(){
return age;
}
}
package com.igeek_02;
/**
* @ClassName: StudentDemo
* @Description: 学生类的测试类
* @date 2017年11月10日 下午5:17:34
* Company www.igeekhome.com
*
*/
public class StudentDemo {
public static void main(String[] args) {
//创建学生对象
Student s=new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("吴京");
s.setAge(35);
System.out.println(s.getName()+"---"+s.getAge());
}
}
4.构造方法
4.1构造方法作用概述
给对象的数据进行初始化
构造函数:
- 又称为构造器
- 作用:初始化全(成)员参数—主要是在构造函数中初始化的参数,在整个的类中都可以直接调用
4.2构造方法格式
方法名与类名相同
没有返回值类型,连void都没有
没有具体的返回值 ```java package com.hdzx_06;
import javax.sound.midi.Soundbank;
/**
- @author Lynn
- @create 2020-11-23-16:18 */
/**
- 构造函数:
- 又称为构造器
- 作用:初始化全(成)员参数—主要是在构造函数中初始化的参数,在整个的类中都可以直接调用 *
- 格式:
- 1.构造函数的方法名与类名完全一致(包括大小写)
- 2.没有返回值类型,不需要写void
3.没有具体的返回值—没有return */ public class Student { //声明两个属性 private String name; private int 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 Student(){
System.out.println("我是一个Student类的构造函数");
} }
import java.sql.SQLOutput;
/**
- @author Lynn
- @create 2020-11-23-16:18
*/
public class StudentDemo {
public static void main(String[] args) {
// System.out.println(s); // s.setName(“宋祖儿”); // s.setAge(18); // System.out.println(s.getName()+””+s.getAge()); }//调用了构造函数--实例化Student这个类
Student s=new Student();
}
<a name="qNyWd"></a>
### 4.3构造方法注意事项
如果你不提供构造方法,系统会给出默认构造方法 <br />如果你提供了构造方法,系统将不再提供 <br />构造方法也是可以重载的
<a name="wqQ5u"></a>
#### 方法重载:在Java中,同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(method overloading)。
说明:
- 参数列表不同包括:个数不同、顺序不同、类型不同。
- 仅仅参数变量名称不同是不可以的。
- 跟成员方法一样,构造方法也可以重载。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重载,但是能够被在此声明。
<a name="5CULd"></a>
#### 方法的重载的规则:(同一个类,相同方法名,参数列表不同)
- 方法名称必须相同。
- 参数列表必须不同。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以称为方法的重载。
判断是否是重载:<br />跟权限修饰符、返回值类型、形参变量名、方法体都没有关系
<a name="OebXJ"></a>
# 5.标准类的代码写法和测试
<a name="TN7LW"></a>
### 5.1 类
- 成员变量 <br />- 构造方法 <br /> 无参构造方法 <br /> 带参构造方法 <br />- 成员方法 <br /> getXxx()<br /> setXxx()
```java
package com.hdzx_06;
/**
* @author Lynn
* @create 2020-11-23-16:38
*/
/**
* 这是一个实体类的模板
* 实体:将抽象的东西进行实体化的类就是实体类
* 通常需要封装属性,方法,get/set方法,toString方法,equals方法(后面讲解)
*/
public class Person {
//属性
private String name;
private int age;
private String sex;
//定义构造函数,目的是初始化全员参数,为了避免创建对象报错的问题,就讲有参和无参都写上
public Person(){
}
//定义有参构造函数
public Person(String name,int age,String sex){
//初始化参数
this.name=name;
this.age=age;
this.sex=sex;
}
// get/set
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
package com.hdzx_06;
/**
* @author Lynn
* @create 2020-11-23-16:45
*/
public class PersonTest {
public static void main(String[] args) {
//实例化对象
Person s1=new Person();
Person s2=new Person("王俊凯",21,"中国");
System.out.println(s1);
System.out.println(s2);
System.out.println(s2.getName());
}
}
5.2给成员变量赋值的方式
无参构造方法+setXxx()
带参构造方法
package com.igeek_04;
/**
* @ClassName: StudentDemo
* @Description: 学生类的测试类
* @date 2017年11月11日 上午9:26:15
* Company www.igeekhome.com
*
*/
public class StudentDemo {
public static void main(String[] args) {
//无参构造方法+setXxx()方法
Student s=new Student();
s.setName("吴京");
s.setAge(35);
System.out.println(s.getName()+"---"+s.getAge());
//带参构造方法
Student s2=new Student("吴京", 35);
System.out.println(s2.getName()+"---"+s2.getAge());
}
}