java面向对象知识点.docx
《java面向对象知识点.docx》由会员分享,可在线阅读,更多相关《java面向对象知识点.docx(22页珍藏版)》请在冰豆网上搜索。
![java面向对象知识点.docx](https://file1.bdocx.com/fileroot1/2023-4/18/ca83245e-29b3-48c9-87ad-f4f6e398e321/ca83245e-29b3-48c9-87ad-f4f6e398e3211.gif)
java面向对象知识点
面向对象的知识点
1,path和classpath
·path:
是指向所有java命令的
·classpath:
是java执行时所需要的环境属性,java命令根据classpath所指定的区域找到所需要的类,如果此类不存在,则会出现类没有发现的错误。
2,Java的数据类型划分:
·基本数据类型
|-数值型
|-整数:
byte、short、int、long
|-小数:
float、double
|-字符型:
char
|-布尔型:
boolean
·引用数据类型:
数组、类、接口
|-就是讲一个堆内存空间的使用权交给了其他对象
3,Java中的关键字:
·未使用到的关键字:
goto、const
·新增加的关键字:
assert、enum
4,方法
·概念:
可重复调用的代码,如果现在一个方法要由主方法直接调用,则声明格式为:
Publicstatic返回类型|void方法名称(参数列表){[return返回值]}
·方法中可以直接使用return返回到方法的调用处
·方法重载:
方法名称相同,但是参数类型或或个数不同,条用时根据参数的类型或个数的不同,调用的方法体也不同,System.out.println()方法体本身就属于重载操作
5,数组
·定义格式:
数据类型数组名[]=new数据类型[长度];
|-程序中一旦出现new关键字就表示开辟新的堆内存地址。
6,面向对象的三大特征:
封装,继承、多态
7,类与对象的关系
·有类之后才能产生对象
·类是对象的操作模板,对象是类的实例,没有对象类是无法使用的。
8,类使用class定义,类中由属性或方法组成
9,对象的产生
·声明对象一:
类名称对象名称=new类名称();
·声明对象二:
先声明对象,然后实例化对象:
类名称对象名称=null;//在栈内存中开辟了一段新空间
对象名称=new类名称();//开辟对应的堆内存空间,保存的是所有的属性内容
10,封装性
在java中使用private关键字来实现封装操作,被封装的属性是无法对外访问,需要getter及setter方法。
方法的命名要求:
第一个单词的首字母小写,之后每个单词的首字母大写。
11,构造方法
构造方法的主要目的是为类中的属性初始化,构造方法定义与类名称相同,但是没有返回值类型,在使用关键字new实例化对象的时候调用,如果一个类中没有明确的定义构造方法的话,则会自动生成一个无惨的,什么都不做的构造方法。
也就是说保证一个类中至少一个构造方法存在,构造方法本身也是可以进行方法的重载,只要参数的类型或个数不同就可以完成重载操作。
12,匿名对象:
只使用一次的对象,使用一次之后将被垃圾收集。
13,类的开发步骤
1.习题讲解
1.编写并测试一个代表地址的Address类,包括以下属性:
国家、省份、城市、街道、邮编。
要求:
可以此地址类中得到一个完整的地址信息。
程序代码如下:
classAddress
{
privateStringnational;
privateStringprovince;
privateStringcity;
privateStringstreet;
privateStringzipcode;
publicAddress(Stringnational,Stringprovince,Stringcity,Stringstreet,Stringzipcode){
this.setNational(national);
this.setProvince(province);
this.setCity(city);
this.setStreet(street);
this.setZipcode(zipcode);
}
publicStringgetInfo(){
return"地址信息:
"+"\n"+
"\t国家:
"+this.getNational()+"\n"+
"\t省份:
"+this.getProvince()+"\n"+
"\t城市:
"+this.getCity()+"\n"+
"\t街道:
"+this.getStreet()+"\n"+
"\t邮编:
"+this.getZipcode();
}
publicvoidsetNational(Stringnational){
this.national=national;
}
publicvoidsetProvince(Stringprovince){
this.province=province;
}
publicvoidsetCity(Stringcity){
this.city=city;
}
publicvoidsetStreet(Stringstreet){
this.street=street;
}
publicvoidsetZipcode(Stringzipcode){
this.zipcode=zipcode;
}
publicStringgetNational(){
returnthis.national;
}
publicStringgetProvince(){
returnthis.province;
}
publicStringgetCity(){
returnthis.city;
}
publicStringgetStreet(){
returnthis.street;
}
publicStringgetZipcode(){
returnthis.zipcode;
}
}
publicclassDizhi
{
publicstaticvoidmain(Stringargs[]){
Addressadd=newAddress("中国","北京","北京市","西城区","100088");
System.out.println(add.getInfo());
}
}
2.定义并测试一个代表员工的Employee类,属性包括:
员工姓名、员工编号、员工基本薪水、员工薪水增长额;方法包括:
构造方法、获取员工姓名、获取员工编号、获取员工基本薪水、计算增长后的工资总额。
程序代码如下:
classEmployee
{
privateStringname;
privateintnumber;
privatefloatsell;
privatefloatsumsell;
publicEmployee(Stringname,intnumber,floatsell,floatsumsell){
this.setName(name);
this.setNumber(number);
this.setSell(sell);
this.setSumsell(sumsell);
}
publicStringgeterName(){
returnthis.name;
}
publicintgeterNumber(){
returnthis.number;
}
publicfloatgeterSell(){
returnthis.sell;
}
publicfloatgeterSumsell(){
returnthis.sumsell;
}
publicfloatgeterZongsell(){
returnthis.sell+this.sumsell;
}
publicStringgetInfo(){
return"员工信息:
\n"+
"员工姓名:
"+getName()+"\n"+
"员工编号:
"+getNumber()+"\n"+
"基本薪水:
"+this.getSell()+"\n"+
"增长薪水:
"+this.getSumsell();
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsetNumber(intnumber){
this.number=number;
}
publicvoidsetSell(floatsell){
this.sell=sell;
}
publicvoidsetSumsell(floatsumsell){
this.sumsell=sumsell;
}
publicStringgetName(){
returnthis.name;
}
publicintgetNumber(){
returnthis.number;
}
publicfloatgetSell(){
returnthis.sell;
}
publicfloatgetSumsell(){
returnthis.sumsell;
}
}
publicclassYuangong
{
publicstaticvoidmain(Stringargs[]){
Employeeemp=newEmployee("张三",111,8888.0f,888.0f);
System.out.println("员工信息:
");
System.out.println("\t员工姓名:
"+emp.geterName());
System.out.println("\t员工编号:
"+emp.geterNumber());
System.out.println("\t基本薪水:
"+emp.geterSell());
System.out.println("\t增长薪水:
"+emp.geterSumsell());
System.out.println("\t增长后薪水:
"+emp.geterZongsell());
System.out.println(emp.getInfo());
}
}
3.定义一个圆形类,可以返回一个圆的面积,周长。
2.讲解知识点
1.String类及String类的相关操作方法;
2.This关键字
3.Static关键字
4.内部类
2.1String类
2.1.1String的两种实例化方式:
String本身是一个类,在String类中定义了如下的构造方法:
publicString(Stringoriginal)
可以接受一个String类的对象,并重新实例化String对象,除了此方法之外还可以采用直接赋值的方式进行对象的实例化。
publicclassStringdemo01
{
publicstaticvoidmain(Stringargs[]){
Stringstr1="hello!
!
!
";//使用直接赋值的方式对String对象实例化
Stringstr2=newString("String对象的实例化");//通过构造方法实例化String对象
System.out.println(str1+str2);
}
}
2.1.2String的两种比较方式
假设,现在有以下的一道程序,观察String的比较问题:
publicclassStringdemo02
{
publicstaticvoidmain(Stringargs[]){
Stringstr1="hello!
!
!
";//使用直接赋值的方式对String对象实例化
Stringstr2=newString("hello!
!
!
");//通过构造方法实例化String对象
Stringstr3=str2;
System.out.println("str1==str2-->"+(str1==str2));
System.out.println("str1==str3-->"+(str1==str3));
System.out.println("str2==str3-->"+(str2==str3));
}
}
运行结果为:
此问题,从内存关系中来分析一下结果:
从此得知,两个String的比较是实际上两个对象的堆空间地址的比较,具体的来讲,实际上比较的是地址的值,因为地址是以数值的形式存在的。
但是现在比真正比较的不是地址的值,而是两个字符串的内容,所以现在需要使用String类中的equals()方法进行比较,此方法定义如下:
publicbooleanequals(Stringstr);
范例:
使用equals比较
publicclassStringdemo03
{
publicstaticvoidmain(Stringargs[]){
Stringstr1="hello!
!
!
";//使用直接赋值的方式对String对象实例化
Stringstr2=newString("hello!
!
!
");//通过构造方法实例化String对象
Stringstr3=str2;
System.out.println("str1equalsstr2-->"+str1.equals(str2));
System.out.println("str1equalsstr3-->"+str1.equals(str3));
System.out.println("str2equalsstr3-->"+str2.equals(str3));
}
}
此时结果为都是true,因为此时比较的两个字符串的内容。
注意:
String的比较中:
==是比较两个字符串的地址值
equals是比较两个字符串的内容。
2.1.3一个字符串实际上就是String的匿名对象
一个字符串是用“”””双引号括起来的,那么一个字符串的常量实际上本身就属于String的一个匿名对象。
例如:
publicclassStringdemo04
{
publicstaticvoidmain(Stringargs[]){
Stringstr1="hello";//使用直接赋值的方式对String对象实例化
System.out.println("hello".equals(str1));
}
}
结果为true,此时证明一个字符串(这里是hello)就是一个String的匿名对象。
2.1.4String的两种实例化方式的区别
所有的操作以内存图形表示出来。
Stringstr1=”hello!
!
!
”;
现在在堆内存空间中只开辟了一个空间,不会产生多余的内容。
如果现在使用关键字new的方式又会如何?
Stringstr2=newString(”hello”);
实际上上述的实例化中已经开辟了两个堆内存空间,之中第一个是垃圾。
所以比较两中实例化方式,更合适使用第一个直接赋值方式Stringstr1=“hello”;
所以实际开发中绝对不能使用关键字new调用String类的String(Stringorg)的构造方法。
而且,如果使用直接赋值的方式也可以减少堆内存的开销。
例如:
publicclassStringdemo05
{
publicstaticvoidmain(Stringargs[]){
Stringstr1="hello";//使用直接赋值的方式对String对象实例化
Stringstr2="hello";
Stringstr3="hello";
System.out.println("str1==str2-->"+(str1==str2));
System.out.println("str1==str3-->"+(str1==str3));
System.out.println("str3==str2-->"+(str3==str2));
}
}
结构都为true。
为什么呢?
实际上以上的三个对象表示的都是同一个空间的引用,因为对于String来讲使用直接赋值方式会在字符串池中保存内容。
如果之后再声明字符串的时候发现内容一样了,则不会中心开辟空间了,而是在从内存池中取出数据继续使用。
2.1.5字符串的内容一旦声明之后则无法修改
publicclassStringdemo06
{
publicstaticvoidmain(Stringargs[]){
Stringstr="hello";
str+="world";
System.out.println(str);
}
}
虽然最终输出的结果该表了“helloworld”,但是字符串内容真的改变了吗?
实际上来讲,字符串变量改变中变得是内存空间的地址指向,而本身的字符串的内容没有任何的变化。
如下所示:
所以,在实际的开发中以下的代码绝对避免:
publicclassStringdemo07
{
publicstaticvoidmain(Stringargs[]){
Stringstr="hello";
for(inti=100;i<100;i++){
str+=i;
}
System.out.println(str);
}
}
以上的操作要不断的断开已有的链接,指向新链接100次,整体代码的性能极其低,所以遇到此类代码绝对不要使用。
2.2String类的常用操作方法(重点)
2.2.1,字符与字符串
在各个语言中实际上一个字符串就是表示一组字符。
所以在String类中提供了以下的方法操作字符与字符串间的转换关系:
·根据字符串中的索引找到指定位置的字符:
publiccharcharAt(intindex)
·将字符串变为字符数组:
publicchar[]toCharArray()
·将字符数组变为字符串:
|-将全部的字符数组变为String类型:
publicString(char[]value)
|-将部分的字符数组变为String类型:
publicString(char[]value,intoffset,intcount)
范例:
取出字符串中指定位置的字符publiccharcharAt(intindex)
publicclassStringAPIdemo01
{
publicstaticvoidmain(Stringargs[]){
Stringstr="hello";
charc=str.charAt
(1);
System.out.println(c);
}
}
范例:
字符串字符数组(互相转换)publicchar[]toCharArray()
publicclassStringAPIdemo02
{
publicstaticvoidmain(Stringargs[]){
Stringstr="helloworld!
!
!
";
charc[]=str.toCharArray();//将字符串变为字符数组
for(inti=0;iSystem.out.print(c[i]+",");
}
Stringstr1=newString(c);//将全部字符数组重新变为String
Stringstr2=newString(c,0,5);//将0~5的字符数组变为String
System.out.println(str1);
System.out.println(str2);
}
}
2.2.2,字节与字符串
与字符数组的操作一致,一个字符串变为字节数组,一个字节数组也可以变为字符串:
·将String变为字节数组:
publicbyte[]getByte()
·将字节数组变为String:
|-全部:
publicString(byte[]bytes)
|-部分:
publicString(byte[]bytes,intoffset,intlength)
范例:
将字符串变为字节数组
publicclassStringAPIdemo03
{
publicstaticvoidmain(Stringargs[]){
Stringstr="helloworld!
!
!
";
byteb[]=str.getBytes();//将字符串变为字节数组
Stringstr1=newString(b);//将全部字符数组重新变为String
Stringstr2=newString(b,0,5);//将0~5的字符数组变为String
System.out.println(str1);
System.out.println(str2);
}
}
2.2.3,判断是否以指定的字符串开头或结尾
·判断是否以指定的字符串开头:
publicbooleanstartsWith(Stringprefix)
·判断是否以指定的字符串结尾:
publicbooleanendsWith(Stringsuffix)
范例:
验证操作
publicclassStringAPIdemo04
{
publicstaticvoidmain(Stringargs[]){
Stringstr="**helloworld##";
System.out.println(str.startsWith("**"));
System.out.println(str.endsWith("##"));
}
}
2.2.4,替换操作
使用以下的方法可以完成替换的操作:
|-publicStringreplaceAll(Stringregex,Stringreplacement)
范例:
替换内容
publicclassStringAPIdemo05
{
publicstaticvoidmain(Stringargs[]){
Stringstr="helloworld";
StringnewStr=str.replaceAll("l","x");
System.out.println(newStr);
}
}
把str中的“l”换成了“x”。
结果为:
hexxoworxd
2.2.5,字符串截取
使用以下两个方法可以完成字符串截取操作:
·