- “万事万物皆对象”
- 在java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
- 涉及到Java语言与前端、后端的数据库交互时,前后端的结构在java层面交互时,都体现为类、对象
- 对象数组的内存解析
-
public class CuTest{ public static void main(String[] args){ Cu[] c1=new Cu[5];//这一行代码的意思是创建了一个长度为5为的数组对象,且数组类型为Cu类对象,因为每一个元素都是Cu类的对象,所以才有了下面一行代码 c1[0]= new Cu(); } } class Cu{ int number; int state; int score; }
1
-
引用数据类型没有初始化的时候只能为两个值:null 或者 地址值
-
当为null的时候,如果想要指向这一引用数据类型的下一层则会发生异常
-
-
-
匿名对象
-
特点:匿名对象只能调用一次
-
格式: new 类名()
-
使用:
package com.atguigu.java; public class PhoneTest { public static void main(String[] args) { Phone p1=new Phone(); System.out.println(p1);//输出对应类结构的地址 p1.sendEmail(); p1.playGame(); p1.price=1000; p1.pricePhone(); System.out.println("**************"); PhoneFactory p=new PhoneFactory(); p.show(new Phone()); //匿名对象 // new Phone().sendEmail(); //new Phone().price=100.0; //System.out.println(new Phone().price);//0 } } class PhoneFactory{ public void show(Phone phone){ phone.sendEmail(); phone.playGame(); } } class Phone{ double price; public void sendEmail(){ System.out.println("发送邮件"); } public void playGame(){ System.out.println("playgame"); } public void pricePhone(){ System.out.println("Phone's price is "+ price); } }
1
-
-
再谈方法
-
方法的重载
-
概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可
-
特点:与返回值类型无关,只看参数列表,且参数列表必须不同(参数个数或者参数类型)。调用时,根据方法参数列表的不同来区别
-
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
-
在通过对象调用方法时,如何确定某一个指定的方法
-
方法名--->参数列表
-
-
-
可变形参的方法
-
格式:数据类型...变量名
-
public class MethodTest{ public static void main(String[] args){ Method m=new Method(); } } class Method{ public void show(int i){ } public void show(String srt){ } public void show(String ... str){ } }
1
-
当调用可变个数形参的方法时,传入的参数个数可以是:0个、1个或者多个
-
可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载
-
-
方法参数的值传递机制
-
方法,必须由其所在类或对象调用才有意义。若方法含有参数:
-
形参:方法声明时的参数
-
实参:方法调用时实际传给形参的参数值
-
-
Java的实参值如何传入方法
-
值传递:即将实参的副本(复制品)传入方法内,而参数本身不受影响
-
形参是基本数据类型,将实参基本数据类型变量的“数据值”传递给形参
-
形参是引用数据类型,将实参引用数据类型变量的“地址值”传递给形参
-
-
-
-
递归方法
-
一个方法体内调用它自身
-
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复循环无须循环控制
-
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环
-
-
-
-
封装性
-
理解:把该隐藏的隐藏起来,该暴露的暴露出来
-
我们程序设计追求“高内聚,低耦合”
-
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
-
低耦合:仅对外暴露少量的方法用于使用
-
-
问题的引入:当我们创建一个类的对象以后,我们可以通过“对象.属性“的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。同时,我们为了避免用户再使用“对象.属性“的方式进行赋值,则需要将属性声明为私有的(private)
-
封装性的体现
-
将类的属性私有化,同时,提供公共的方法来获取(getXxx)和设置(setXxx)此属性的值
-
不对外暴露的私有的方法
-
单例模式
-
-
封装性的体现,需要权限修饰符来配合
-
Java规定的4种权限(从小到大排列):private、缺省、protected、public
-
4种权限可以用来修饰类以及类的内部结构:属性、方法、构造器、内部类
-
修饰类的话只能使用:缺省、public
-
-
-
类的结构之一:构造器
-
构造器的作用:创建对象,也可以初始化对象的属性
-
创建类的对象:new+构造器
-
-
说明
-
如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
-
定义构造器的格式:权限修饰符 类名(形参){}
-
一个类中定义的多个构造器,彼此构成重载
-
一旦我们显式的定义了类的构造器,系统就不再提供默认的空参构造器
-
一个类中,至少会有一个构造器
-
-
-
属性赋值的先后顺序
-
默认初始化值
-
显式初始化
-
构造器中赋值
-
通过对象的方式进行赋值
-
-
JavaBean
-
是一种Java语言写成的可重用组件
-
是指符合如下标准的Java类:
-
类是公共的
-
有一个无参的公共的构造器
-
有属性,且有对应的get、set方法
-
-
-
关键字:this的使用
-
this可以用来修饰:属性、方法、构造器
-
this修饰属性和方法的时候
-
用来指当前对象的东西
-
在类的方法中,可以使用“this.属性"或者"this.方法"的方式,来调用当前对象属性或方法。但是,通常情况下,我们都选择省略this。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用“this.变量“的方式,表明此变量是属性,而不是形参
-
-
this调用构造器
-
我们在类的构造器中,可以显式的使用“this(形参列表)”方式,来调用本类中的其他构造器
-
构造器不能通过this来调用自己
-
如果一个类中有n个构造器,最多有n-1个构造器使用了this
-
规定:“this(形参列表)”必须在构造器的首行
-
构造器内部,最多只能声明一个this,用来调用其他的构造器
-
-
-
关键字的使用:package
-
为了更好的实现项目中类的管理,提供包的概念
-
使用package声明类或者接口所属的包,声明在源文件的首行
-
包,属于标识符,遵循标识符的命名规范(xxxyyyzzz)
-
每“.”一次,就代表一层文件目录
-
同一个包下,不能定义同名的接口、类
-
-
MVC的设计模式
-
MVC是常用的设计模式之一,将整个程序分为三个层次:视图模型层、控制器层、与数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性
-
-
关键字的使用:import
-
在源文件中使用import结构导入指定包下的类、借口
-
声明在包的声明和类的声明之间
-
如果需要导入多个结构,则并列写出即可
-
可以使用“xxx.*"的方式,表示可以导入xxx包下的所有结构
-
如果使用的类或接口是java.lang包下定义的,则可以省略import结构
-
如果使用的类或借口是本包下定义的,也可以省略import结构
-
如果在源文件中使用了不同包下的同名的类,则必须有一个类需要以全类名的方式显示
-
如果使用"xxx.*"的方法表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的类,仍需要使用import结构
-
import static:导入制定类或接口中的静态结构
-
-
继承性
-
用法:在子类的声明旁边加extends +父类名
-
好处
-
减少代码冗余,提高复用性
-
便于功能的扩展
-
为之后的多态性的使用,提供了前提
-
-
体现:一旦子类A继承父类B以后,子类A中就获取了B类中生命的结构:属性、方法
-
父类中声明为private的属性或者方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只有因为封装性的影响,使得子类不能直接调用父类的结构而已
-
子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展
-
-
Java中关于继承性的规定
-
Java只支持单继承和多层继承,不允许多重继承
-
一个子类只能有一个父类
-
一个父类能派生出多个子类
-
-
-
如果我们没有显式的声明一个类的父类的话,则此类继承于java.lang.Object类
-
即所有的java类都具有java.lang.Object类的功能
-
-
-
方法的重写
-
定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法
-
要求:
-
子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
-
子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
-
子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
-
子类不能重写父类中声明为private权限的方法
-
-
子类方法抛出的异常不能大于父类被重写方法的异常
-
-
注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法
-
-
关键字的使用:super
-
理解:可以用来调用父类的属性、方法、构造器
-
我们可以在子类的方法或构造器中。通过使用“super.属性“或”super.方法“的方式,显式的调用父类中声明的属性或者方法。通常情况下,我们习惯省略this
-
特殊情况:当子类和父类中定义了同名的属性时,我们想在子类中调用父类中声明的属性,则必须显性的使用“super.属性“方式来调用父类中的属性
-
当子类重写了父类的方法以后,我们想在子类的方法中调用父类被重写的方法。我们想在子类中调用父类中声明的方法,则必须显性的使用“super.方法“方式来调用父类中的方法
-
super调用构造器
-
我们可以在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
-
“super(形参列表)”的使用,必须声明在子类构造器的首行
-
我们在类的构造器中,针对于this(形参列表)或者super(形参列表)只能二选一,不能同时出现
-
当我们在构造器的首行,既没有this也没有super,则默认调用的是父类中空参的构造器,即super()
-
-
-
子类对象实例化过程
-
从结果上来看:
-
子类继承父类以后,就获取了父类中声明的属性或者方法
-
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
-
-
从过程上来看:
-
当我们通过子类的构造器创造子类的对象时,我们一定会直接或者间接调用其父类构造器,进而调用父类的父类的构造器,直到调用java.lang.Object类中空参的构造器为止,正因为加载所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑调用
-
明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即new的子类的对象
-
-
-
多态性
-
对象的多态性:父类的引用指向子类的对象
-可以直接应用在抽象类和接口上 - 理解:一个事物的多种形态
- 多态的使用:当调用子父类同名同参数的方法,实际执行的是子类重写父类的方法---虚拟方法的调用;无法调用子类拓展的方法。
- 多态的使用:虚拟方法调用
- 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法。但是在执行期,我们实际执行的是子类重写父类的方法。
- 总结:编译,看左边;执行,看右边
- 使用前提:
- 类的继承关系
- 方法要重写
- 对象的多态性只适用于方法,不适用于属性
-
Java Day07
最新推荐文章于 2024-06-17 13:56:54 发布