我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。
个人博客:https://blog.csdn.net/weixin_45791445
有问题欢迎QQ联系:1059320343(记得备注CSDN)
Java代码运行机制
1. 编写源代码
得到的是以“.java”为扩展名的源文件,源文件名应与该文件中被修饰为public的类名相同。
2. 编译(使用cmd命令编译时使用的命令是javac 文件名.java。使用的javac编辑器)
编译后的文件叫做类文件。得到的是以“.class”为扩展名的字节码文件。
这里出现的错误叫编译时错误。
然后使用java命令运行,命令格式为:java 项目名(注意这里没有后缀))
3.类装载ClassLoader
4.字节码(byte-code)校验
5. 解释
6. 运行
这里出现的错误叫运行时错误。
在一个简单的Java程序中有一个获以上的类组合而成。其次在一个可以独立运行的Java程序中有且只有一个main()方法,它是程序运行的开端。程序的主体被包含在类中,这个起始的地方被称为main方法。main方法之前必须加上public,static,void。static表示
switch中的控制表达式必须为char,int,short或byte类型的。case后面的常量表达式必须和控制表达式的类型相同。(书上)
switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型。至于四种基本类型的包装类是由于有自动拆箱的操作所以支持(实际)
instanceof是对象运算符,用来判定一个对象是否属于莫个指定的类(或其子类)的实例。
byte:1字节,short:2字节,int:4字节,long:8字节,float:4字节,double:8字节,char:2字节,boolean:书上此处为空。
switch的格式
do-while的格式(最后要加一个";")
outer标签是什么,上面的文章讲的很详细。
小白在这里补充一下break outer;和continue outer;的区别
break outer;是直接完全的跳出到outer标签标记的循环外面。
continue outer;的作用并非完全跳出外层循环,而是跳出outer标签标记循环的本次循环,直接进行此循环的下一次循环;
构造方法只能被public,private,protected,和默认修饰。
类是对象模板,只有实例化之后才可以使用。new运算符用于创建一个类的实例并返回对象的引用。
默认构造方法对成员变量的初始化原则如下:
对于整型成员变量,默认初值是0;对与浮点型,默认初值是0.0;对于boolean类型,默认初值是false;对于引用型,默认值是null。
this关键字
this可以出现在类的构造方法和非static修饰的成员方法(即实例方法)中,this代表实例对象自身,可以通过this来访问实例对象的成员变量或调用成员方法。
类方法中不可以使用this
由于类方法可以通过类名字直接调用,这时可能还没有任何对象产生,因此指代对象实例本身的this关键字不可以出现在类方法中。
1)public访问权限最具有开放性,可以用来修饰类、类与接口的成员(包括成员变量、成员方法)
。由public类修饰的类或类成员可被任何类访问。
2)protected可以用来修饰类的成员变量或方法。具有protected访问特性的类成员可以被本类、
本包中的其他类访问,也可以被其他包中的子类继承,它的可访问性低于public,高于默认。
3)如果在定义类、接口、成员变量、成员方法时没有指定访问权限控制符,他们的权限就为默认权
限。具有默认权限的类、接口、成员变量、成员方法,只能被本类和同一个包中的其他类、接口及成员方
法引用,因此默认权限也被称为包权限。
4)私有访问控制符private用来声明类的私有成员,它提供了最高的保护级别。用private修饰的
成员变量或方法只能被该类自身所访问和修改,而不能被任何其他类(包括该类的子类)来获取和引用。
Java文件名应与修饰为public的类名相同。且Java文件中只能有一个public修饰的类
特殊情况:
只有被修饰为public访问权限的成员变量和方法才可以被不同包的其他类使用,修饰为protected的成员变量和方法可以被不同包的子类继承,访问。不同包的其他类禁止访问修饰为private和默认权限的成员变量和方法。
super关键字
子类在继承父类时,可能会出现变量隐藏、方法覆盖(overriding)等现象。变量隐藏指子类的成员变量与父类成员同名,此时,父类的成员变量被隐藏。方法覆盖指子类的方法与父类的方法名相同,方法的返回值类型、入口参数的数目、类型、顺序均相同,只是方法实现的功能不同,此时父类的方法被覆盖。如果子类需要调用或访问父类被隐藏的变量或被覆盖的方法,可以使用super关键字实现。
当用子类的构造方法创建一个子类对象时,子类的构造方法总会显式或隐式地先调用父类的某个构造方法。如果子类的构造方法没有明显地指明调用父类的哪个构造方法,Java会默认调用父类的无参构造方法;子类也可以通过super关键字显式调用父类指定的构造方法,具体调用哪个构造方法需要根据super()的参数类型决定。
Java中的子类对象可以向上转换为父类对象(也称上转型对象),允许将子类的实例赋值给父类的引用,也允许一个父类的引用指向子类对象。
但是反过来,一个父类对象的类型未必可以向下转换成子类对象,因为子类具有的信息,父类未必包含,这种转换是不安全的。只有当父类引用实际上指向一个子类对象时,才可以进行这种转换。
实例变量依附于对象,在使用new关键字创建对象时,Java运行系统为每个对象分配一个内存空间,不同的实例变量占用不同的内存区域。类变量依附于类(而非对象),对于类变量来说,Java运行系统为类的类变量分配公共的存储空间,该类的每个实例对象共享同一类变量的存储空间。**因此,每个对象对类变量的修改都会影响其他实例对象。**实例变量和类变量会被自动初始化,但局部变量(就是在方法中的变量不会自动初始化)
(1)类变量可以通过类名直接访问,而不需要创建对象。
(2)任何一个对象对类变量的修改,都是在同一内存单元上完成的。因此,每个对象对类变量的修改都会影响其他实例对象。
声明为static的方法称为类方法(或称静态方法),与此相对,没有static修饰的成员方法则为实例方法。类方法的本质是该方法属于整个类,而不是属于某个实例,可以不创建实例,直接通过类名调用。 类方法的使用具有以下特点:
(1)类方法可以通过类直接调用,而不需要创建实例对象。例如:Java Application的入口main()方法就被声明为static类方法,可以不需要创建任何实例对象对调用。
(2)类方法属于整个类,被调用时可能还没有创建任何对象实例,因此类方法内只可以访问类变量,而不能直接访问实例变量和实例方法。
(3)类方法中不能使用this关键字,因为静态方法不属于任何一个实例。
抽象类和抽象方法(为什么会有抽象类?)
语法:
abstract class <类名> [extends<父类>][implements<接口名>]{ <类主体> }
如果一个类A需要继承抽象类,则该类必须实现抽象类中定义的所有抽象方法。否则,该类也必须修饰为抽象类。也就是说,抽象类的子类如果仅实现父类的部分抽象方法,子类也必须声明为抽象类。
为什么会有抽象类和抽象方法?
有时候,我们没有足够的信息去描述一个具体的对象,这样就不能用正常的类来描述它,那么这时候就需要抽象类了。抽象方法没有方法体,为什么呢?小白的理解是我们只知道这个对象有这样的一种方法(或者理解为" 行为 "),但不知到它的这种方法能够干什么,就没有写具体的方法主体。因此,抽象类不能实例化(创建的人都不知道它具体是什么,怎么实例成一个具体的对象)
语法:
[接口修饰符] interface〈接口名〉[extends〈父类接口列表〉] { 接口体 }
用implements子句表示类实现某个接口。一个类可以同时实现多个接口,接口之间用逗号“,”分隔。 在类体中可以使用接口中定义的常量,由于接口中的方法为抽象方法,所以必须在类体中加入要实现接口方法的代码,如果一个接口是从别的一个或多个父接口中继承而来,则在类体中必须加入实现该接口及其父接口中所有方法的代码。 在实现一个接口时,类中对方法的定义要和接口中的相应方法的定义相匹配,其方法名、方法的返回值类型、方法的访问权限和参数的数目与类型信息要一致。
接口继承中出现的方法重名和常量重名
(1)方法重名 如两个方法完全一样,只保留一个。 如果两个方法有不同的参数(类型或个数),那么子接口中包括两个方法,方法被重载。 若两个方法仅在返回值上不同,出现错误。
(2)常量重名 两个重名常量全部保留,并使用原来的接口名作为前缀。
eaducoder里面老用。小白表示心累ಥ_ಥಥ_ಥ。
一个类把内部类看成是自己的成员,外部类的成员变量在内部类中仍然有效,内部类可以直接使用外部类中的成员变量和方法,即使他们是private的,这也是内部类的一个好处。
一个匿名类:
Student3 liu = new Student3() {
void speak() {
System.out.println("这是匿名类中的方法");
}
};// 匿名类体结束
1)泛型类声明:
创建一个简单的泛型是非常容易的。首先,在一对尖括号(< >)中声明类型变量,以逗号间隔变量名列表。在类的实例变量和方法中,可以在任何类型的地方使用那些类型变量。
格式:
class 泛型类名<泛型列表>{
类体
}
泛型类声明时并不指明泛型列表是什么类型的数据,可以是任何对象或接口,但不能是基本类型数据。泛型列表处的泛型可以作为类的成员变量的类型、方法的类型以及局部变量的类型。
2)使用泛型类声明对象:
使用泛型类声明对象时,必须指定类中使用泛型的具体具体类名,如: Chorus
3)泛型接口:
格式:
Interface 泛型接口名<泛型列表>{
接口体
}
小白没想到书上对于泛型讲的这么多。(唉,不禁为我的菜鸡感觉亿点悲伤。)
小白实战中常用的是:
在创建arraylist或者list集合时加泛型
ArrayList listTest = new ArrayList();
这样限定了创建集合的类型。对于此小白的理解时泛型是在创建list或者arrayList集合时指定集合中的元素是同一种类型。例如你在创建时指定了创建的list集合中只能有String类型的变量,那么你向其中添加数据时,如果不是String类型的数据,程序在编译时就会报错。如果不是用泛型这种错误只有在程序运行时才会报错。而且,泛型让我们在get获得集合中的数据时,无需因为类型不同需要强转而烦恼。
当你向加了泛型的语句中加入不同数据类型的数据时是会报错的。但如果不加,这种错误就只能在程序运行是才报错。
兄弟们,小白编写不易。希望各位兄弟们,点赞评论收藏加关注。小白在此谢谢各位老爷们,也祝福和我一样面临考试的兄弟们高分通过。
对于白嫖的兄弟们,