JAVA学习笔记,从类和对象开始。

1.对象和类。

对象的内存分配。

 类里的属性(成员变量),定义再class大括号内的。在堆中。

局部变量,将声明在方法内,方法形参,代码块内,构造器形参,构造器内。局部变量必须要有赋值。要在内部提前给它写好。在内存的栈中。

public的方法,一个包下的,别的类中,声明要调用类的对象,可以调用。

static为线程共享,在类加载阶段就实例化,位于方法区。

2.方法。方法A中又调用了方法A,称之为递归方法。不能在一个方法里面定义另一个方法。 

 对象数组,类似于二维数组,stus【1】里装的是指针,用·调用变量。

3.匿名对象:new phone().sendEmail()

new phone().setprice=1000;

。就是不给变量名。所以这两个操作是完全独立的,谁也影响不到谁。只有实例里才能有值的改变。

 4.方法的重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同。重载要求只是参数个数和类型。方法内的东西可以重写。

4.1可变个数的形参。例如public void show(String ...strs),中间三个省略号,但是这个必须声明在末尾。当调用可变个数形参的方法时,传入的参数个数可以是:0.1.2

这两个方法不能共存,第二个方法的传参  类.show ( new String[]{"a"} );如此传递数组的值。

但第一个方法的传参可以直接类.show ( “aa”,“bb”);

4.2形参和实参。

 

 这种排序中这样改是错误的。

当参数是引用类型的数据时候,怎么交换。

 传进来的是一个地址的值,然后在堆空间里交换了值,所以这次能够交换成功。方法内的地址和方法外的地址一样。

 这种方式换值是正确的。

5.封装。为什么要封装,因为方便给我们定义的属性变量进行制约。

public void setIspay(Boolean isPay) {

this.isPay = isPay;

}这个是正常的。

public void setIspay(Boolean pay) {ispay = pay;}

为什么用this,是因为第一个成员变量和局部变量重名,加了this之后,就能分清。this可以理解为当前对象。

      

 修饰类的只能有两种,public和default。JAVA用4种权限修饰符来,来体现类和类的内部结构在调用时候的可见性不同。

get set 方法是public。

 在另一个类种,如此操作。调用set Age将12的值赋进去。

5.1构造器

例如Person p=new Person();相当于一个构造器

执行到17行代码的时候,正好用上下面定义的构造器,然后输出。。。。

                      

 一个构造器的作用,在定义对象时候赋值,即初始化对象的属性。

构造器也可以重载,用来接受不同类型的值,弄给对象。但加了传参的构造器之后就必须得传参。

一个类种至少有一个构造器,至少是系统默认给的。

开发工具,在一个类的source种找到产生generate,有构造器,也有getset方法。

总结:用构造器来创建对象,用getset方法来对属性操作。

 在一个构造器里调用另一个构造器,就执行了这个构造器里所有的代码,可以少写很多。

this()结束后,写点自己特别的。

如果一共有n个构造器,则构造器种最多有n-1个,this(形参)。一个构造器内,this调用了一个后,不能再调用另一个,但他调用的那个可以调用了别的。

 6.import,使用的类或者接口是非java.lang包下定义的,则可以省略import结构。

 如果用的是不同包下两个同名的构造器,则第二个必须得这么写。

 就比如这个data,可能在util下有一个,那么当我们还想用java.sql.下的时候,就必须这样做。

就比如Field ,是lang包的子包,前面说了,lang包的不用导,但用包的子包却需要再导。

如果导入了lang包下的system.*,则输出语句可以直接写成out.println("hello")

import static:导入指定类或接口种的静态结构。

 这种import static 的落脚点一定是类种的结构,而不是类。一般import的落脚点是类。

导入包后,方法就可以直接用。

7.继承

 建一个student类的,里面覆盖person类的属性和方法。但保留自己的方法,减少了代码的冗余。

能继承到private定义的属性,方法。子类继承了父类所有的属性和方法。

一个子类只能有一个父亲。鼠标放在这个类上,ctrl +T,可以看它的继承情况。

所有的类,都直接或者间接继承 java.lang.object类。

8.run 的下面有个,debug as

 后面两个是 step over和,一步步往下执行,看看程序种变量发生的变化。

 step into进入方法。

后面有一个step return,如果进入方法,这个操作,可以跳出这个方法。

按rusume按钮,如果还有断电,执行到下一个断点出,没有,就终止。

写一个断点就是写一个system out输出。

一个按钮drop to frame,返回方法内的首行。

解决一个debug问题。step into失灵,无法进入方法。去debug as configurations,里点开右边界面的jre,给jre那里的选项改成JDK。alter一下即可。

9.方法的重写:在子类种可以根据需要对从父类种,继承来的方法进行改造。

要求

1:子类重写的方法必须和父类被重写的方法具有相同的方法名称,参数列表。

2.子类重写的方法的返回值类型,不能大于父类方法种返回值类型。

3.子类重写的方法的访问权限不能小于父类方法的访问权限。不能重写父类种private声明的方法。

4.子类方法抛出的异常不能大于父类被重写方法的异常。

子类重写父类的方法必须同时是非static或者static类,因为static类属于类,子类方法无法覆盖父类的。

一般写的时候会报错。类的重写不能在main方法里。如此,子类可以用自己的方法,如果调用了父类的方法,就声明一个父类的对象,来调用它的方法。

11.protected修饰符,同一个包下的类都可以用,不同包的子类继承父类的protected也可以用。可以跨包。不同包类不可以调用非public和private声明的。

super可以调用父类的,属性,方法,构造器。但不能在mian方法里用super。

想用不同包种父类的属性,还是得protected定义,只靠super是不行的。

super调用构造器的问题:调的也是父类的构造器。当重写子类的构造器的时候,前面的属性都被封装了,这里用不了this

 这样super了之后,就能在下面声明对象的时候赋值了。这样的super(参数类型)是调用了父类的构造器给自己用了。

当super和this同时带有参数时,一个构造器种只能有super(类型)或this(类型)。

而且super要声明在构造器的首行。

 

 tostring 方法如果不重写,输出结果只能返回 变量的名字和地址。

Student类继承person类时

 建一个空参构造器,这个构造器默认继承person类种的空参构造器。比如person类中的空参构造器里有一句输出,那么在Student类中

执行到这句话的时候就会输出。因为它省略了一句super.();没写,但是也存在。

12.子类对象实例化进程,子类在建的时候,在堆空间中,堆空间中就会加载所有父类声明的属性。一句话,是构造器创建的对象。一层一层的套娃(父类的父类),直到调用java.lang.Object.中空参的构造器为止,加载过所有父类的结构,子类才能考虑进行调用。

虽然创建子类对象时,调用了父类的构造器,但是只创建过一个对象。

所以子类在建立一个对象的时候,会用到父类的构造器。

13.面向对象的多态性。

父类person,子类man,父类的引用指向子类的对象。

 p2调用子类重写父类的方法。但不能调用person里没有声明过的方法(即子类特有的方法)。实际是编译的时候就没编译

编译态:指编译的时候编译eat这句话

执行态:指执行的时候实际执行的是person里重写的方法。

多态的使用,虚拟方法调用:我们在编译期只能调用父类中声明的方法,但在执行期我们实际执行的是子类重写父类的方法。

                       

 可以让下面整个func执行狗类特有的方法。这里利用多态性,不用再new 一个animal类。

就比如equals(object obj),一般属性里放的都是子类对象。就是想用人家子类重写的方法。对象的多态性,只适用于方法,不适合于属性。左编译右运行。

也称之为调用父类的虚拟方法。

多态是运行时行为。因为编译器是无法确定的。晚绑定

而重载,在编译的时候就已经被编译器给绑定了

      有了对象的多态性以后,内存中实际是加载了子类中特有的属性和方法,但变量声明为父类类型。

编译时只能调用父类中声明的属性和方法。那如何才能调用子类中特有的属性和方法。

                        

 找一个M1,强制类型转换了属于是。这样节省内存,比新new一个对象要好。但这种类型转换一定要满足子父类的上下级关系,将父类引用强转为子类才是正确的。

14.

先判断是不是子父类关系,再强转。如果不是子父类的关系还要硬转,就会出现ClassCast异常。

目的还是为了调用子类中重写的方法。只有在多态的情况下才能强转型。

                                  

 15.object类只声明了一个空参构造器。

 此时对象的实体就是垃圾对象,等待被回收,但时间不确定。用system.gc()这句话来通知finalize,类的对象会调用object类中中的finalize方法。

final,finally,finalize的区别?

 object类中定义的equals()和==的作用是相同的,比较两个引用的地址是不是相同的。

像String, Date,File,包装类等都重写了object类中的equals()方法,重写后比较的不是两个引用的地址是否相同,而是比较的是两个对象实体的内容是否相同。

16.再度回首运算符。

          

 mian里不能用这两个属性,除非变成了static类,或者直接在main里赋值。或者new调用对象赋值。

                   

一些关于==的判断结果

                     

                    

 这里已经重写equal方法了,可以通过两个属性的值,进行匹配。

用this进行匹配。

17.当object类中toString没有被重写的时候,返回对象的类型和地址。

 普通的输出对象,不用toString,例如System.out.println("new"+my);在这个连接操作里,

实际上已经调用了哦、Object类里的toString。

 这个图里能输出MM。是因为String 类已经重写了toString 方法。

像String Date File 包装类等都重写了object中的toString方法。

18.包装类。基本数据类型不能点,也不能整对象,没点面向对象的样,所以就有了包装类。

前几个数值型的类,都是继承于number。

就int和char的变成了Integer和Charcter,别的都是首字母大写。

 转成对象,可以传入别的参数类型是对象的方法。

 如何写一个测试,只测方法的输出。

             

 第二个,输出的结果是123.

包装类转化成基本数据类型。

 对象,类型value,将包装类对象转化为基本数据类型。

19.

        JDK 5.0的特性,自动装箱拆箱 (在基本数据类型和包装类之间的转换)      

            

在此基础上,可以将包装类和基本数据类型统一了,现在要研究

String 类型和这个大的统一之间的转换。

方式1:String str=num1+" ",用连接操作。

方式2:调用String 里的重载方法valueof:float f1=12.3f;

                                                                String.valueof(f1);

强转操作:int num1=(int)str;X

  Inreger i1=(Integer)Str;X这俩都是错的

因为强转类型只能是     有子父类的关系。那么如何String如何转为包装类的?

调用包装类中的parse方法,int num1=Integer.parseInt(str1);可以通过编译

                   

 三元运算符,将里面的数据类型都提升到最高,所以输出结果为1.0,在编译的阶段。

                          

  第一个是new的对象,比的肯定是地址。

第二个,自动装箱了,但也只是装在类的属性里,和但跟new的对象有点差距,仍然相等。

第三个就是纯纯的越界了,integer内部定义了Integer cach保存了-128到127的整数,如果我们使用了,如果我们使用自动装箱的方式,必须在这个范围内才是true。

20.引用:数组,接口,类。

 数组可以看作一个特殊的类了,是object的子类,所以能传。getclass是获得当前类名的方法,getSuperclass是获得父类名的方法。

21。tostring和普通的输出还是有区别的,第二个用toString的出现空指针异常。

第一个是因为

print方法里,如果引用是null,避免空指针,会输出null。

.

22.Static关键字的使用。static关键字单独在一个空间里,如果static定义的变量nation在对象1中被修改成6,则输出对象2中的nation时候,不用赋值,已经成了6,可以直接输出。

   一 1.静态变量随着类的加载而加载。

     2.静态变量早于对象的创建。用构造器创建对象的时候已经在加载静态变量了。所以可以直接使用类.属性的方式调用静态变量。对象本来就可以调用静态变量。

     3.由于类在内存中只会加载一次,静态变量在内存中也只存在一份,只存在方法区的静态域中。

     4.如何判断一个属性是否声明成static?如何判断一个方法是否声明成static?

     就比如说,每个账户的账号,密码,余额不同。但利率和最小余额大家都是一样的。

     利率和最小余额就可以作为静态变量。

    总结:不会随着对象不同而不同的变量。

二:静态方法。

   1.也是随着类的加载而加载。

   2.静态方法中只能调用静态方法和属性(因为他们的声明周期不同步)。非静态方法既可以调用也可以。

    3.在静态的方法中不能使用this 。super关键字。因为是静态的可以直接输出。省略的是类.

    4.操作静态属性的方法通常用静态。工具类中的方法习惯生成静态方法。没必要造对象了,直接类名.  调用方法。例如Math、Arrays、Collections

                             

类和对象的生命周期,不同步。晚出生的可以用早出生的,早出生的不能用晚出生的。

                         

23.单例设计模式

 也就是某个类只能有一个对象实例,那么这个类中的构造器就得私有化,并且只能在类的内部。用静态方法返回类内部创建对象。可以产生一个单例永久驻留在内存中,想用的时候就拿来用。

                            这个叫饿汉式,一开始就把对象造好,导致对象加载时间过长。线程安全。

                       

                      

   这里这个是错的,因为你调用一次方法就要创一个对象。

所以应该改成,也叫懒汉式,延迟了对象的建立,是线程不安全的,因为进入判断的时候会阻塞一下,导致多线程弄了两个对象,上来变成null,不用就不着急指定。

                      

        

 数据库是单例建一个池子,只有一个池子,里面放着对于用户的连接。用static加载池子,只加载一次,只建立了一个池子。

34.main方法。输出的时候会弹出框,问你哪个作为出口。就当成普通股静态方法看待也行。静态方法里只能调静态的,不能调非静态。作为出口,用public修饰,在虚拟机中执行,权限不大,类.方法调不出来。

                       

  

35.main方法中可以作为我们和控制台交互方式(类似于Scanner)

                   

 方式1:跑一下,Java application,编译一下,然后run configuration里找到这个类,右边的Arguments,在框里输的值,就是传进方法的参数。

       

 

 如果加了这句话,就输出不了,框里的值。

 因为控制台传进来的数已经给args分配空间接受了,你又new一个,args又指向另一个空间。

方式2:cmd命令行的执行。

 刚开始加载不了主类,是因为还没有去掉包名。然后在 java 类 后一个空格那输入要传进去的参数。

36.代码块:就是类中一个大括号下面一块代码。

to String方法,目前只能输出这个类里的非静态属性。

      1.作用:用来初始化类,对象

   如果修饰,只能用static修饰    分为静态代码块和非静态代码块。

       2.静态代码块的执行:随着类的加载而执行。而方法是用类调用才能执行

    非静态代码块的执行,随着对象的创建而执行。

 

    

 代码块的执行,谁先谁后,看位置。静态的先于非静态的执行。

 在静态代码块中只能调用静态结构,因为生命周期的原因。

非静态的则都可以调用静态或非静态的属性和方法。

静态代码块比静态构造器先运行。构造器要造对象的时候用,比类的加载晚一步。

在类的属性里可以直接int age=5;

但不能分步操作;

如果有静态又继承,调用构造器的时候一层层套娃,省略的super.() 执行父类的构造器,最终到object类中,执行静态的方向是从父类一级一级到子类加载,同时也加载静态的方法和属性。代码块的执行要先于构造器。

在方法体里,语句的执行是按顺序的。在类中没有顺序。可以先赋值再定义。

类里,非静态代码块中赋值和普通的赋值,看先后顺序,谁在上面谁先赋值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值