1、java知识摘要对象和类对象和类的简介(不再说)Java是大小写敏感的语言定义类修饰符 class 类名称/成员变量/方法成员变量的作用域在java中变量的作用域是又确定的Int x;Int y=x+3;类成员变量的声明与顺序不受限制,处右边这种情况一般类的成员变量作用于整个类,方法中声明的变量仅作用于该方法,也叫做局部变量方法重载我们在命名的时候遵循见名知意的原则,所以会出现同名的情况,比如两个int 相加叫加,那么两个String 相加也叫加 为了解决这样一个问题,有个重载的机制。注意:1、仅返回值类型不同,不叫重载 会报方法名冲突的错误 2、参数的不同可以自动转型得到的,不叫重载 如:v
2、oid print(int a,float b);void print(float a,int b)这种情况会报错,因为可以int 可以自动转型为float ;如 定义一个函数 void add (double x)我们这样调用 add(3);3是int 但是也不会报错错 这就是为什么不能重载;我们可以将重载描述如下:在一个类中,函数名完全相同,参数列表不同叫做重载其中参数列表不同包括:类型不同,数量不同,顺序不同 创建对象Personal p1 = new personal()int i = 3Personal p1 = new personal();这就是创建了一个personal类型的对
3、象并用personal类型的变量p1指向它构造函数构造函数是用来初始化一个对象的构造函数一般通过new 关键字来调用1、方法名必须与创建对象的类名相同2、不允许声明返回类型,即使声明为void也不行3、java会给我们提供一个默认的构造函数,一旦自定义java将不再提供默认的函数构造函数具有一般函数的特性,比如可以重载,但又有其特殊性This关键字This可以简单理解等效于所在类的类名,为了便于区分不用作用域的同名变量而设计public class Student public int age; public Student(int a) age=a; 以上我们通过构造函数初始化一个成员变量a
4、ge,但是我们为了遵循见名知意的原则,把形式参数a换成age ,就会出现 age = age的奇怪语句,并且变量指向有就近原则,即使不出错我们也无法给成员age赋值;因此:public class Student public int age; public Student(int age) this.age=a; 举例说明上文中的this.age可以理解为Student.age;初始化问题意思就是说,声明一个变量,不赋值,他到底是几?记住值类型(int,long,float,double,boolean)类型的默认初始值是对应格式的0string 自定义类(比如你定义的Student就叫做自
5、定义类)等引用类型的默认初始值是nullStatic 关键字这里不再讲什么堆内存,栈内存,只做形象说明 用static 修饰的成员称为静态成员,一般紧跟public,private等权限修饰符之后,如:public static int a;静态方法和静态变量都可以通过类名直接调用,那么什么情况下声明成静态类型呢?举例说明:如果我们定义一个学校类,里面有一个太阳变量,这个变量一般都要被定义成静态变量,我们可以实例化很多学校实例,如果有一个学校执行了一句“太阳下山了”,这是你查看所有的学校,会发现他们也都发现“太阳落山了”,这样比较符合实际,也就是说静态类型,无论被实例化多少次,他在内存中只有一
6、份;再如:我们定义一个学生类,类中有一个耳朵变量也定义成static,如果一个同学执行了一句“我的耳朵被狗咬掉了”,那么这时就会出现所有人的耳朵都被狗咬掉了,明显不符合实际,这样的变量就不能被定义为静态的对象的清理Java中引进了内存回收机制,java会自动判断我们new出的对象有没有用,他怎么判断你先不要管,当这些对象不再使用的时候,java会选择一个合适的时机将其清理掉;Finalize()该方法可以自定义垃圾回收规则,一般我们让其自动回收,不人为干预他的回收只需要知道三点:1、new 出的对象采用这种回收机制 栈内存中的变量(变量名等)是按照生命周期进行释放(变量的作用域决定该变量的声明
7、周期);2、我们不知道垃圾回收器什么时候会去回收;3、可以通过finalize()方法自定义回收规则。java中四个访问修饰符(不想深入了解只看图示和总结即可)访问修饰符包括:public、(friendly)、protected、private;其中java中并没有friendly关键字,默认(什么也不写)就被认为是友元类型 注意:default 只是一种说明,他不能作为关键字放在类前面,default就是什么也不写;尽管java中有default关键字,但是那个关键字和这里的default类型没有关系,比如swich语句中会用到default关键字访问修饰符的对象:类、类成员(方法、属性)
8、各修饰符的权限:权限是基于面向对象的封装性而提出的,对于类内部无所为权限,类内部是可以相互访问的;那么为什么要求这些访问限制呢?我在这里用一个比喻来解释,类成员的关系就好像我们的教学楼和教室的关系,我们要进一个教室需要两个前提,教学楼的门是开着的,教室的门也是开着的,那么我们会发现这样一个问题:如果教室的门都开,教学楼的门却是锁着的,是不是没有什么意思?于是java里面规定:修饰类的修饰符只有两种,一种是public,另外一种是缺省就是什么也不写;什么是访问?可以狭义的理解为以下几种操作叫做访问,如:调用方法(对方法的访问)、给一个变量赋值或取一个变量的值(对变量的访问)protected与p
9、ublic可以,protected的一个说法就是希望不是同一个包的类想调用它就必须通过继承来调用,否则不能。图示:黑色粗线代表可以访问总结:类前面要么写public要么什么也不写,什么也不写的只能在同一个包内访问;(不清楚包概念的记住就行了)在一个包内public和protected 和 默认(什么都不写) 一样不同包内public可以访问,protected需要通过子类来访问,默认的不能访问;private 只有自己可以访问;具体隐藏实现他的一个用途就是防止某些非法操作,比如不能将年龄设为负值或者让某个属性设为只读;public class A private int age; public
10、 int getAge() return age; public void setAge(int age) if (this.age 0) this.age = age; 举例:这样我们就对age属性做了一个限制,如果想设置为只读,不写set方法就行了参数传递class Student public int age; public String name; public Student(int a, String n) age = a; name = n; Java中,参数传递分为值类型传递,和引用类型传递public class TestPass1 public static void ch
11、angAge(int a, int age) a = age; public static void changAge(Student st, int age) st.age = age; public static void changAge(Student st, int age,String name) st =new Student(age,name); public static void main(String args) Student st1 = new Student(19, jack); changAge(st1.age,20); System.out.println(st
12、1.age);changAge(st1, 20); System.out.println(st1.age); changAge(st1,20,juilei);/ System.out.println(st1.age + and + st1.name);上面定义了一个Student类,主函数中定义了三个方法,分别调用:当执行下面几句时:Student st1 = new Student(19, jack); changAge(st1.age,20); System.out.println(st1.age);输出结果为:19当执行下面几句时:changAge(st1, 20); System.ou
13、t.println(st1.age);输出结构为:20 看到这应该还能理解,但你不要认为只要接受的是引用类型变量就可以改变对象的成员,看下面几句:不做深入了解的同学看到这即可,不然到这你懂了,往下看你又晕了changAge(st1,20,juilei); System.out.println(st1.age + and + st1.name);输出结果为:19andjack这里本来的目的是想通过重新实例化一个对象让st1变量指向他,但是实际上传进来还是st1的拷贝,故没能改变.到此,你会发现java中参数的传递都是值传递,没有提供向其他语言如vb,中可以通过关键字byval,byref进行值传
14、递和地址传递的选择。继承和多态继承基础由于访问修饰符的存在,并不是所有父类的成员都能被继承具体情况请参考上一章访问修饰符什么事被继承,通俗的将就是指在子类外可以按照一定规则(访问权限)直接.出其父类成员,就叫做该成员被继承需要注意的是 四种访问权限仅有protected会因继承而发生变化,其他不变;即:包内不会因为继承而改变访问权限,包间只有protected会因继承发生变化,其他不变;构造器的调用顺序(假设类A继承自类B(A extends B))情况一:A B都是系统默认的构造函数 我们直接new 就行了,A的构造函数会自动调用B的构造函数CASE 2 : B自定义了构造函数 这是我们如果直接new A 就会报找不到super()的错误,那么我们就不得不自定义A的构造函数,Public A ()Super(参数列表)/必须放在第一行父类的构造函数必须放在第一行CASE 3 :A 需要自定义构造函数 你看看CASE 2的构造函数还是系统默认的吗?(一旦父类自定义了构造函数,子类的构造函数不得不自定义)继承还是组合程序设计时一般遵循高内聚,低耦合的原则,因此要谨慎选择是组合还是继承(看不懂,跳过就行了)继承有很多弊端如:增加了耦合程度,破坏了父类的封装性,因此我们的原则是:优先选择组合,且组合与继承之间要以具体情况而定,此处不再举例;Object类java不支持多继承即一
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1