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赋值给p2Phone p2=p;//两个对象的地址相同System.out.println(p2);//Phone@4554617cSystem.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~200if(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类的构造函数");
} }
java package com.hdzx_06;
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()```javapackage 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/setpublic 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;}@Overridepublic 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());}}
