JAVA自学笔记.docx
《JAVA自学笔记.docx》由会员分享,可在线阅读,更多相关《JAVA自学笔记.docx(55页珍藏版)》请在冰豆网上搜索。
![JAVA自学笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/6/9c08184d-cddf-43b6-ba26-b1c196e91d0f/9c08184d-cddf-43b6-ba26-b1c196e91d0f1.gif)
JAVA自学笔记
达内java学习笔记
1JAVA的面向对象编程--------课堂笔记面向对象主要针对面向过程。
面向过程的基本单元是函数。
什么是对象EVERYTHINGISOBJECT万物皆对象
所有的事物都有两个方面
有什么属性用来描述对象。
能够做什么方法告诉外界对象有那些功能。
后者以前者为基础。
大的对象的属性也可以是一个对象。
为什么要使用面向对象
首先面向对象符合人类看待事物的一般规律。
对象的方法的实现细节是屏蔽的只有对象方法的实现者了解细节。
方法的定义非常重要。
方法有参数也可能有返回值。
注意区分对象本身、对象的实现者、对象的调用者。
分析对象主要从方法开始。
我们通过类来看待对象类是对象的抽象。
其次采用面向对象方法可以使系统各部分各司其职、各尽所能。
对象之间的耦合性一定要低比如不同硬盘和不同主板之间的关系。
这样才能使每个对象本身做成最
好的。
对于对象的要求高内聚、低耦合这样容易拼装成为一个系统。
实现高内聚就是要最大限度低提高复用性复用性好是因为高内聚。
可复用性是OOP的基础。
比较面向过程的思想和面向对象的思想
面向过程的思想由过程、步骤、函数组成以过程为核心
面向对象的思想以对象为中心先开发类得到对象通过对象之间相互通信实现功能。
面向过程是先有算法后有数据结构。
面向对象是先有数据结构然后再有算法。
在用面向对象思想开发的过程中可以复用对象就进行复用如无法进行复用则开发新的对象。
开发过程是用对个简单的对象的多个简单的方法来实现复杂的功能。
从语法上来看一个类是一个新的数据类型。
在面向对象编程中除了简单数据类型就是对象类型。
定义类的格式
classStudent{
代码
}
注意类名中单词的首字母大写。
实例变量定义在类中但在任何方法之外。
New出来的均有初值诚信、创新、开放、合作达内java学习笔记
2局部变量定义在方法之中的变量。
局部变量要先赋值再进行运算而实例变量均已经赋初值。
这是局部变量和实例变量的一大区别。
实例变量的对象赋值为null。
局部变量不允许范围内定义两个同名变量。
实例变量的作用域在本类中完全有效当被其他的类调用的
时候也可能有效。
实例变量和局部变量允许命名冲突。
书写方法的格式
修饰符返回值方法名调用过程中方法体
可能出现的例外
publicint/voidaddNumber(参数)throwExcepion{}
例
publicintaddNumber(inta,intb){
}
注方法名中的参数inta,intb为局部变量
类方法中的一类特殊方法构造方法。
构造方法是当用类生成对象时系统在生成对象的过程中利用的方法。
注意构造方法在生成对象的时候会被调用但并不是构造方法生成了对象。
构造方法没有返回值。
格式为public方法名。
构造方法的方法名与类名相同。
构造方法是在对象生成的过程中自动调用不可能利用指令去调用。
在一个对象的生成周期中构造方法只用一次一旦这个对象生成那么这个构造方法失效。
用类来生成对象的语句
Students=newStudent()。
第一个Student表示这是用Student类进行定义。
“Student()”表示调用一个无参数的构造方法。
如果()中有参数则系统构造对象的过程中调用有参的方法。
此时S称为一个对象变量。
Students的存储区域存放的是地址一个对象在硬盘上占有一个连续地址首地址赋予s空间。
S称为对象Student的引用。
注意在对象变量中存放的是引用地址在简单变量中存放的是数值。
可以构造多个构造方法但多个构造方法的参数表一定不同参数顺序不同即属于不同的构造方法
publicstudent(stringname,inta){
}
publicstudent(inta,stringname){
}
为两个不同的构造方法。
如果我们未给系统提供一个构造方法那么系统会自动提供一个为空的构造方法。
练习写一个类定义一个对象定义两个构造方法一个有参一个无参。
编写一个程序验证对象的传递的值为地址
注意下面这种形式
staticvoidchangename(studentstu){stu.setName“LUCY”}
注意生成新的对象与旧对象指向无关生成新对象生命消亡与旧对象无关。
面向对象方法的重载overloading和覆盖overriding。
在有些JAVA书籍中将overriding称为重载overloading称为过载。
达内java学习笔记
3Overloading在一个类中可以定义多个同名方法各个方法的参数表
一定不同。
但修饰词可能相同
返回值也可能相同。
在程序的编译过程中根据变量类型来找相应的方法。
因此也有人认为overloading是编译时的多态
以后我们还会学到运行时多态。
为什么会存在overloading技术呢作为应对方法的细节。
利用类型的差异来影响对方法的调用。
吃可以分为吃肉吃菜吃药在一个类中可以定义多个吃方法。
构造方法也可以实现overloading。
例
publicvoidteach(){};
publicvoidteach(inta){};
publicvoidteach(Stringa){}为三种不同的方法。
Overloading方法是从低向高转。
Byte—short—float—int—long—double。
在构造方法中this表示本类的其他构造方法
student(){};
student(stringn){
this();//表示调用student()
}
如果调用student(inta)则为this(inta)。
特别注意用this调用其他构造方法时this必须为第一条语句然后才是其他语句。
This表示当前对象。
PublicvoidprintNum(){
Intnumber=40
System.out.println(this.number);
}
此时打印的是实例变量而非局部变量即定义在类中而非方法中的变量。
This.number表示实例变量。
谁调用this.number那么谁即为当前(this)对象的number方法。
封装使对象的属性尽可能私有对象的方法尽可能的公开。
用private表示此成员属性为该类的私有
属性。
Public表示该属性方法公开
Private表示该属性方法为只有本类内部可以访问类内部可见。
想用private还要用set和get方法供其他方法调用这样可以保证对属性的访问方式统一并且便于
维护访问权限以及属性数据合法性
如果没有特殊情况属性一定私有方法该公开的公开。
如果不指明谁调用方法则默认为this。
区分实例变量和局部变量时一定要写this。
11.29
继承达内java学习笔记
4父类SuperClass和子类SonClass。
父类的非私有化属性和方法可以默认继承到子类。
ClassSonextendsFather{
}
而如果父类中的私有方法被子类调用的话则编译报错。
父类的构造方法子类不可以继承更不存在覆盖的问题。
非构造方法可以
如果子类访问父类的构造方法则在编译的时候提示访问不到该方法。
JAVA中不允许多继承一个类有且只有一个父类单继承。
JAVA的数据结构为树型结构而非网状。
JAVA通过接口和内部类实现多继承
方法的覆盖overriding
方法的重载并不一定是在一个类中子类可以从父类继承一个方法也可以定义一个同名异参的方法
也称为overloading。
当子类从父类继承一个无参方法而又定义了一个同样的无参方法则子类新写的方法覆盖父类的方法
称为覆盖。
注意返回值类型也必须相同否则编译出错。
如果方法不同则成重载。
对于方法的修饰词子类方法要比父类的方法范围更加的宽泛。
父类为public那么子类为private则出现错误。
之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。
以下范围依次由严到宽
private本类访问
default表示默认不仅本类访问而且是同包可见。
Protected同包可见+不同包的子类可见
Public表示所有的地方均可见。
当构造一个对象的时候系统先构造父类对象再构造子类对象。
构造一个对象的顺序注意构造父类对象的时候也是这几步
①递归地构造父类对象
②顺序地调用本类成员属性赋初值语句
③本类的构造方法。
Super()表示调用父类的构造方法。
Super()也和this一样必须放在第一行。
This()用于调用本类的构造方法。
如果没有定义构造方法那么就会调用父类的无参构造方法即super()。
要养成良好的编程习惯就是要加上默认的父类无参的构造方法。
思考可是如果我们没有定义无参的构造方法而在程序中构造了有参的构造方法那么如果方法中没
有参数那么系统还会调用有参的构造方法么应该不会。
多态多态指的是编译时类型变化而运行时类型不变。
多态分两种
①编译时多态编译时动态重载
②运行时多态指一个对象可以具有多个类型。
对象是客观的人对对象的认识是主观的。
例达内java学习笔记
5Animala=newDog()查看格式名称
Dogd=(Dog)a。
声明父类来引用子类。
思考上面的格式
运行时多态的三原则应用时为覆盖
1、对象不变改变的是主观认识
2、对于对象的调用只能限于编译时类型的方法如调用运行时类型方法报错。
在上面的例子中Animala=newDog()对象a的编译时类型为Animal运行时类型为dog。
注意编译时类型一定要为运行时类型的父类或者同类型。
对于语句Dogd=(Dog)a。
将d强制声明为a类型此时d为Dog()此时d就可以调用运行时类型。
注意a和d指向同一对象。
3、在程序的运行时动态类型判定。
运行时调用运行时类型即它调用覆盖后的方法。
关系运算符instanceof
ainstanceofAnimal;(这个式子的结果是一个布尔表达式)
a为对象变量Animal是类名。
上面语句是判定a是否可以贴Animal标签。
如果可以贴则返回true否则返回false。
在上面的题目中ainstanceofAnimal返回True
ainstanceofDog也返回True
instanceof用于判定是否将前面的对象变量赋值后边的类名。
Instanceof一般用于在强制类型转换之前判定变量是否可以强制转换。
如果Animala=newAnimal()
Dogd=Dog()a;
此时编译无误但运行则会报错。
Animala=newDog()相当于下面语句的功能
Animala=getAnimal()
PublicstaticAnimal.getAnimal;
ReturnnewDog()
封装、继承、多态为面向对象的三大基石特性。
运行时的动态类型判定针对的是方法。
运行程序访问的属性仍为编译时属性。
Overloading针对的是编译时类型不存在运行时的多态。
习题建立一个shape类有circle和rect子类。
Shape类有zhouchang()和area()两种方法。
正方形squ为rect子类rect有cha()用于比较长宽的差。
覆盖时考虑子类的private及父类的public考虑多态之所以这样是避免调用A时出现实际调用B
的情况。
而出现错误。
11.29下午讲的是教程上的Module6
Module6-7包括面向对象高级、内部类、集合、反射暂时不讲、例外。
面向对象高级、集合和例外都是面向对象的核心内容。
面向对象高级修饰符达内java学习笔记
6static:
①可修饰变量属性②可修饰方法③可修饰代码块。
Staticintdata语句说明data为类变量为一个类的共享变量属于整个类。
Intdata为实例变量。
例
staticintdata;
m1.data=0;
m1.data++的结果为1,此时m2.data的结果也为1。
Static定义的是一块为整个类共有的一块存储区域其发生变化时访问到的数据都时经过变化的。
其变量可以通过类名去访问类名.变量名。
与通过访问对象的编译时类型访问类变量为等价的。
PublicstaticvoidprintData(){}
表明此类方法为类方法静态方法
静态方法不需要有对象可以使用类名调用。
静态方法中不允许访问类的非静态成员包括成员的变量和方法因为此时是通过类调用的没有对象
的概念。
This.data是不可用的。
一般情况下主方法是静态方法所以可调用静态方法主方法为静态方法是因为它是整个软件系统的
入口而进入入口时系统中没有任何对象只能使用类调用。
覆盖不适用于静态方法。
静态方法不可被覆盖。
允许在子类中定义同名静态方法但是没有多态严格的讲方法间没有多态
就不能称为覆盖
当static修饰代码块时注此代码块要在此类的任何一个方法之外那么这个代码块在代码被装载进
虚拟机生成对象的时候可被装载一次以后再也不执行了。
一般静态代码块被用来初始化静态成员。
Static通常用于Singleton模式开发
Singleton是一种设计模式高于语法可以保证一个类在整个系统中仅有一个对象。
11.30
final可以修饰类、属性、方法。
当用final修饰类的时候此类不可被继承即final类没有子类。
这样可以用final保证用户调用时动作
的一致性可以防止子类覆盖情况的发生。
当利用final修饰一个属性变量的时候此时的属性成为常量。
JAVA利用final定义常量注意在JAVA命名规范中常量需要全部字母都大写
FinalintAGE=10
常量的地址不可改变但在地址中保存的值即对象的属性是可以改变的。
Final可以配合static使用。
Staticfinalintage=10
在JAVA中利用publicstaticfinal的组合方式对常量进行标识固定格式。
对于在构造方法中利用final进行赋值的时候此时在构造之前系统设置的默认值相对于构造方法失效。
达内java学习笔记
7
常量这里的常量指的是实例常量即成员变量赋值
①在初始化的时候通过显式声明赋值。
Finalintx=3
②在构造的时候赋值。
局部变量可以随时赋值。
利用final定义方法这样的方法为一个不可覆盖的方法。
Publicfinalvoidprint(){}
为了保证方法的一致性即不被改变可将方法用final定义。
如果在父类中有final定义的方法那么在子类中继承同一个方法。
如果一个方法前有修饰词private或static则系统会自动在前面加上final。
即private和static
方法默认均为final方法。
注final并不涉及继承继承取决于类的修饰符是否为private、default、protected还是public。
也就是说是否继承取决于这个方法对于子类是否可见。
Abstract(抽象)可以修饰类、方法
如果将一个类设置为abstract则此类必须被继承使用。
此类不可生成对象必须被继承使用。
Abstract可以将子类的共性最大限度的抽取出来放在父类中以提高程序的简洁性。
Abstract虽然不能生成对象但是可以声明作为编译时类型但不能作为运行时类型。
Final和abstract永远不会同时出现。
当abstract用于修饰方法时此时该方法为抽象方法此时方法不需要实现实现留给子类覆盖子
类覆盖该方法之后方法才能够生效。
注意比较
privatevoidprint(){}此语句表示方法的空实现。
Abstractvoidprint()此语句表示方法的抽象无实现。
如果一个类中有一个抽象方法那么这个类一定为一个抽象类。
反之如果一个类为抽象类那么其中可能有非抽象的方法。
如果让一个非抽象类继承一个含抽象方法的抽象类则编译时会发生错误。
因为当一个非抽象类继承一
个抽象方法的时候本着只有一个类中有一个抽象方法那么这个类必须为抽象类的原则。
这个类必须
为抽象类这与此类为非抽象冲突所以报错。
所以子类的方法必须覆盖父类的抽象方法。
方法才能够起作用。
只有将理论被熟练运用在实际的程序设计的过程中之后才能说理论被完全掌握为了实现多态那么父类必须有定义。
而父类并不实现留给子类去实现。
此时可将父类定义成abstract
类。
如果没有定义抽象的父类那么编译会出现错误。
Abstract和static不能放在一起否则便会出现错误。
这是因为static不可被覆盖而abstract为了生
效必须被覆盖。
例本例已存在\CODING\abstract\TestClass.java文件中
publicclassTestClass{
publicstaticvoidmain(String[]args){达内java学习笔记
8SuperClasssc=newSubClass();
Sc.print();
}
AbstractclassSuperClass{
Abstractvoidprint();}
}
classSubClassextendsSuperClass(){
voidprint(){
System.out.println(“print”);}
}
JAVA的核心概念接口interface
接口与类属于同一层次实际上接口是一种特殊的抽象类。
如:
interfaceIA{
}
publicinterface公开接口
与类相似一个文件只能有一个public接口且与文件名相同。
在一个文件中不可同时定义一个public接口和一个public类。
一个接口中所有方法为公开、抽象方法所有的属性都是公开、静态、常量。
一个类实现一个接口的格式
classIAImpleimplementsIA{
};
一个类实现接口相当于它继承一个抽象类。
类必须实现接口中的方法否则其为一抽象类。
实现中接口和类相同。
接口中可不写public但在子类中实现接口的过程中public不可省。
如果剩去public则在编译的时候提示出错对象无法从接口中实现方法。
注
①一个类除继承另外一个类还可以实现接口
classIAImplextendsjava.util.ArrylistimplementIA{}
继承类实现接口
这样可以实现变相的多继承。
②一个类只能继承另外一个类但是它可以继承多个接口中间用“”隔开。
ImplementsIA,IB
所谓实现一个接口就是指实现接口中的方法。
③接口和接口之间可以定义继承关系并且接口之间允许实现多继承。
例interfaceICextendsIA,IB{};
接口也可以用于定义对象
IAI=newIAImpl();
实现的类从父类和接口继承的都可做运行时类型。
IAImpleextendsAimplementIA,IB
IBI=newIAImple();达内java学习笔记
9IinstanceofIAImple;
IinstanceofA;
IinstanceofIA;
IinstanceofIB;
返回的结果均为true.
接口和多态都为JAVA技术的核心。
接口往往被我们定义成一类XX的东西。
接口实际上是定义一个规范、标准。
①通过接口可以实现不同层次、不同体系对象的共同属性
通过接口实现writeonceasanywhere.
以JAVA数据库连接为例子JDBC制定标准数据厂商实现标准用户使用标准。
接口通常用来屏蔽底层的差异。
②接口也因为上述原因被用来保持架构的稳定性。
JAVA中有一个特殊的类Object。
它是JAVA体系中所有类的父类直接父类或者间接父类。
此类中的方法可以使所的类均继承。
以下介绍的三种方法属于Object:
(1)finalize方法当一个对象被垃圾回收的时候调用的方法。
(2)toString():
是利用字符串来表示对象。
当我们直接打印定义的对象的时候隐含的是打印toString()的返回值。
可以通过子类作为一个toString()来覆盖父类的toString()。
以取得我们想得到的表现形式即当我们想利用一个自定义的方式描述对象的时候我们应该覆盖
toString()。
(3)equal
首先试比较下例
StringA=newString(“hello”);
StringA=newString(“hello”);
A==B(此时程序返回为FALSE)
因为此时AB中存的是地址因为创建了新的对象所以存放的是不同的地址。
附加知识
字符串类为JAVA中的特殊类String中为final类一个字符串的值不可重复。
因此在JAVAVM虚
拟机中有一个字符串池专门用来存储字符串。
如果遇到Stringa=”hello”时注意没有NEW不是
创建新串系统在字