面向对象简单理解定义
面向:找、拿
对象:能干活的东西
面向对象:拿东西解决对应的问题
//例如: //监听控制台输出的呢内容,并且获取到相应的内容 Scanner sc=new Scanner(System.in); //获取内容 String name=sc.nextLine();
面向对象符合人类的思维习惯,使编程更简单
要求:学会设计并使用
学会获取并使用
面向对象01
一、类的定义和对象的创建
1.类:
是现实世界中实体的抽象,是对一类事物的描述;在软件设计中,类是一个模板,是一个设计图,它定义了此种类通用的属性(变量)和行为(方法)。
-
类是共同特征的描述
2.对象:
是真实存在的具体东西。在java中,必须先设计类,才能获得对象
3.如何定义类
public class 类名{ 1.成员变量(代表属性,一般是名词) 2.成员方法(代表行为,一般是动词) public void Method(){ } 可以有返回值,也可以无返回值 3.构造器 4.代码块 5.内部类 }
类名 对象名=new 类名();
4.访问修饰符
控制被修饰变量或方法的访问权限
5.定义类的补充事项
-
类名首字母大写,驼峰
-
一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
-
实际开发中建议还是一个文件定义一个class类成员
-
变量的完整定义格式是:数据类型 变量名称=初始化值;一般无需指定初始化值,存在默认值(成员变量未赋初值)
-
默认值:整数类型->0
小数类型->0.0
布尔类型->false
引用类型->null
6.练习(登录页面,考试系统(增删改查))
二、方法的定义和方法的获取
1.方法(method)
对象的行为
-
无参无返回值
访问修饰符 void 方法名称(){ 无参无返回值 }
-
无参有返回值
访问修饰符 返回值类型 方法名称(){ return值;//值类型必须与返回类型一致 }
-
有参有返回值
访问修饰符 返回值类型 方法名称(参数类型 参数名){ return值;//值类型必须与返回类型一致 }
-
有参有返回值(多参数)
访问修饰符 返回值类型 方法名称(参数类型 参数名,参数类型 参数名2){ return值;//值类型必须与返回类型一致 }
2.方法的调用
psvm { 对象.方法(); 对象.方法(参数值); 返回值类型 返回值=对象.方法(参数值); }
三、方法的通用格式
public 返回值类型 方法名(参数) { 方法体; return 数据; }
方法的通用格式:
-
public 修饰符,目前先记住这个格式
-
返回值类型 方法操作完毕之后返回的数据的数据类型如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
-
方法名 调用方法时候使用的标识
-
参数 由数据类型和变量名组成,多个参数之间用逗号隔开
-
方法体 完成功能的代码块
-
return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
四、方法重载(重点)
1.定义
方法重载至同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
-
多个方法在统一个类中
-
多个方法具有相同的方法名
-
多个方法的参数不相同或者类型不同或者数量不同
2.特点
-
类型不同或者数量不同重载仅对应方法的定义,与方法的调用无关
-
重载仅针对同一个类中方法的名称与参数进行书别,与返回值无关(不能通过返回值来判定两个方法是否相互构成重载)
五、方法的注意事项
-
方法不能嵌套定义
-
void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
面向对象02
一、对象内存图
1.java内存分配
栈:所有局部变量都会在占内存中创建
-
局部变量:定义在方法中的变量或者方法声明上的变量
-
方法执行会加载到栈中进行
-
局部变量特点:随着方法的调用而存在,随着方法的调用完毕而消失
Student s = new Student();
-
堆:所有对象及其对应的实例变量和数组都将存储在此处
-
简单理解为:new出来的东西,都存储在堆内存
-
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器
-
空闲时被回收实例变量(成员变量)有初始化值:
基本数据类型:整数:0,浮点数:0.0,布尔:false,字符:空字符
引用数据类型:null
2.多个引用可以指向同一个对象
public class StudentTest03 { public static void main(String[] args) { //创建第一个对象并使用 Student s1 = new Student(); s1.name = "林青霞"; s1.age = 30; System.out.println(s1.name + "," + s1.age); //把第一个对象的地址赋值给第二个对象 Student s2 = s1; s2.name = "张曼玉"; s2.age = 28; System.out.println(s1.name + "," + s1.age); System.out.println(s2.name + "," + s2.age); } }
二、private
-
是一个权限修饰符
-
可以修饰成员(成员变量和成员方法)
-
作用是保护成员不被别的类使用,被 private 修饰的成员只在本类中才能访问针对 private 修饰的成员变量,如果需要被其他类使用,提供两个相应的操作:
-
提供“get变量名()”方法,用于获取成员变量的值,方法用 public 修饰
-
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用 public 修饰
三、this
-
this限定的变量用于代指成员变量
-
this解决局部变量隐藏成员变量
四、封装
1.概述
是面向对象的三大特征之一
2.原则
将类的某些信息隐藏在类内部private,不允许外部程序直接访问,只能通过get、set方法实现
3.好处
通过方法控制成员变量的操作,提高安全性
把代码用方法进行封装,提高代码的复用性
五、构造方法
1.格式
特殊的方法
//格式: public class 类名{ 修饰符 类名(参数){ } }
创建对象时执行了构造方法:空参构造,有参构造;
2.构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法如果定义了构造方法,系统将不再提供默认的构造方法
3.构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
4.推荐的使用方式
永远提供无参数构造方法
Day06面向对象(高级)
一、继承
1.定义
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。
继承就是子类继承父类的属性和行为(成员变量和成员方法),使得子类对象具有与父类相同的属性、相同的行为。
-
子类可以直接访问父类中的非私有的属性和行为
-
继承是单继承的
-
类与类之间产生了关系,是多态的前提
-
父类的成员方法,实际上就是去定义,子类当中通用的功能
-
其实在子类构造方法的第一行,隐式调用了父类中的构造方法super();而且只在第一行
2.格式
class 父类 { ... } class 子类 extends 父类 { ... }
3.方法的重写(重点)
子类当中定义和父类相同方法名字的方法,称为方法的重写
-
在子类和父类中,不在同一个类中
-
方法的名字一样
-
参数一样
4.方法重载(重点)
-
同一个类中
-
方法的名字一样
-
方法的参数不一样(数量不一样、类型不一样、顺序不一样)
二、修饰符
1.权限修饰符
private 同一个类中
default 同一个类中 同一个包中子类无关类
protected 同一个类中 同一个包中子类无关类 不同包的子类
public 同一个类中 同一个包中子类无关类 不同包的子类 不同包的无关类
2.状态修饰符
static
(1)含义
关键字是静态的意思,可以修饰成员方法,成员变量
static静态修饰为所有对象使用
(2)特点
被类的所有对象共享,这也是判断是否使用静态关键字的条件
可以通过类名调用,当然也可以通过对象名调用,推荐使用类名调用
(3)访问特点
非静态的成员方法
-
能访问静态的成员变量
-
能访问非静态的成员变量
-
能访问静态的成员方法
-
能访问非静态的成员方法
静态的成员方法
-
能访问静态的成员变量
-
能访问静态的成员方法
总结成一句话就是:静态成员方法只能访问静态成员
final
(1)含义
final 关键字是最终的意思,可以修饰成员方法,成员变量,类
(2)final 修饰的特点
-
修饰方法:表明该方法是最终方法,不能被重写
-
修饰变量:表明该变量是常量,不能再次被赋值
-
修饰类:表明该类是最终类,不能被继承
(3)final 修饰局部变量
-
变量是基本类型:final 修饰指的是基本类型的数据值不能发生改变
-
变量是引用类型:final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
三、包
四、抽象类
1.定义
一种特殊的父类里面可以写抽象方法
2.格式
方法
访问修饰符 abstract 返回值类型 方法();(没有方法体)
类
访问修饰符 abstract class 类名{}
注意
-
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类(因果关系)
-
抽象方法无法实例化 ---无法通过new去创建自身的对象的【new 构造方法】
-
存在构造方法 ---交给子类通过super进行访问的
-
抽象类中可以存在普通方法 ---让子类继承并且使用
-
抽象类的子类 ---要么重写抽象类的所有方法 ---要么也是一个抽象类
3.Abstract关键字冲突
-
final:被abstract修饰的方法,强制要求重写子类,被final修饰的方法子类不能重写
-
private:被abstract修饰的方法,强制要求重写子类,被private修饰的方法子类不能重写
-
static:被static修饰的方法可以直接类名调用,类名调用抽象方法没有意义
五、接口
1.概述
-
接口体现的思想就是对规则的声明
-
Java中的接口更多的体现在对行为的抽象
-
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
2.语法
//接口用关键字interface修饰 public interface 接口名 { public abstract 返回值类型 方法(); … }
实现
1.public class 类名 implements 接口{ 重写方法; } 2.创建一个抽象类
3.接口特点
不能直接实例化【new出来】=>如果能new,就可以直接通过对象变量调用方法,毫无意义
4.接口成员特点
-
构造方法 : 没有,因为接口主要是扩展功能的,而没有具体实例。
-
成员变量 : 只能是常量 默认修饰符:public static final
-
成员方法 : 只能是抽象方法 默认修饰符:public abstract
5.类和接口的关系
-
类和类的关系
继承关系,只能单继承,但是可以多层继承
-
类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
-
接口和接口的关系
继承关系,可以单继承,也可以多继承
6.抽象类和接口的区别
成员区别
抽象类 :变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口 : 常量;抽象方法
关系区别
类与类 继承,单继承
类与接口 实现,可以单实现,也可以多实现
接口与接口 继承,单继承,多继承
设计理念区别
抽象类 对类抽象,包括属性、行为
接口 对行为抽象,主要是行为,目的是制定规范
六、多态
1.概述
指的是同一个对象,在不同时刻表现出来的多种形态多态的前提和体现
-
有继承/实现关系
-
有方法重写
-
有父类引用指向子类对象
对象多态:方法的形参定义为父亲类型,这个元素就可以接受该父类的任意子类对象了
行为多态:同一个方法,具有多种不同的表现,或形态能力
2.多态中成员访问特点(重点)
成员变量
编译看左边,执行看左边
成员方法
编译看左边,执行看右边
原因
因为成员方法有重写,而成员变量没有
3.多态中的转型
-
向上转型
从子到父
父类引用指向子类对象
-
向下转型(强制转型)
从父到子
父类引用转为子类对象
注意:如果被转型的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException
对象名 instanceof 类型 //判断一个对象是否是一个类的实例 // 通俗理解:判断关键字的左边的对象,是否是右边的类型,返回boolean类型结果
七、代码块
使用{}括起来的代码被称为代码块
1.局部代码块
位置:方法中定义
作用:限定变量的生命周期,及早释放,提高内存利用率构
2.构造代码块
位置:类中方法外定义
特点:每次构造方法执行的时候,都会执行该代码块中的代码,并且在构造方法执行前执行作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
3.静态代码块
位置:类中方法外定义
特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次作用:在类加载的时候做一些数据初始化的操作