背景
下面是我刚学习java一个月左右的笔记,回答了我刚学习java时对于面向对象里面的一些关键问题。如今看起来凌乱,甚至有些问题过于简单。但我知道有相当一部分刚入门的同学像我当年一样被这些问题苦恼。希望能对这些同学学习java有所帮助。
最好的方式是理解后建立自己的笔记,并反复查看,直到您觉得这些问题不言自明
面向对象OPP Obejct Oriented Programming
一切皆对象
抽象(abstract):
舍弃个别的非本质特征,提取共同本质特征的过程。 给你香蕉,苹果,大鸭梨,你得出“水果”的过程就叫抽象;
类(class):
类是一组具有相同属性和行为的对象群体的抽象。把相似的对象归为一个类;
对象(Object):
对象是类的具体实例。 创建对象 类名 对象名 = new 构造器();
面向对象三大特征:封装,继承,多态,(4,抽象)
封装(encapsulation): 继承(inheritance); 多态(polymorphism);
垃圾回收机制
栈:当变量超出作用域的时候,释放栈空间出栈。出栈后变量自动失效,释放空间可以分配给其他变量,不需要回收内存空间。栈内存要求其中的变量声明时候必须有确定的大小和生存周期。 堆:在heap中开辟空间,new出现的地方必定分配一个堆内存。当堆内存变成垃圾后,java垃圾回收期会自动回收,不一定立刻回收。 垃圾回收期只作用于堆内存和栈内存无关。
Java垃圾回收机制 当对象失去了他的引用后就变成垃圾,垃圾回收机制会在此后回收此垃圾。
方法的重载OVERLOAD:
概念: 同一类中可以出现多个重名的方法 条件: 1.方法名称相同 2.参数列表不同(个数,数据类型,数据类型顺序) 注:和是否有返回值无关 2.构造器(构造方法)与类同名,且无返回值的方法; 与类重名并且无返回值
构造器
使用new+构造方法可以创建一个新的对象 构造方法啊是定义在java类中用来初始化对象的函数
Java中,每个类一定要有一个构造器,如果没有定义构造器,系统会自动生成一个默认的 访问权限为public且参数列表为空的构造器 public 类名(){} 一旦自己定义了构造方法后,系统不会再添加空的构造器。
有返回值的方法一定不是构造器,构造器和方法一定不构成重载; -构造器的主要目的(唯一目的)是用来初始化对象中-构造器除了在new时候被调用外,其他情况不能被调用 -构造方法外,同一类中还可以存在其他与类重名方法,构造方法与其不构成重载 -和类名以及构造方法重名的方法,是否有什么特殊的用途呢?
如何访问对象:
在其他类或者main方法中,若想访问对象的属性和方法,必须先实例化这个类,然后通过对象名和点操作符来完成。 对象名.方法名 对象名.属性名 访问本类中的方法和属性可以直接访问。
this关键词
class里的this代表对方法当前对象的引用 this(参数);可以调用本类中其他构造器,只能出现在构造器中,并且只能放在第一行;
static 关键字
static 关键字 修饰变量的时候,存放在data seg数据区,在第一次被使用时初始化,对于该类所有对象来说只有一份,且公用一块内存。 任何对象都可以访问该静态变量,访问为同一块内存 没有对象也可以用 类名.变量名 来访问该静态变量
static 方法,调用时不会把对象引用传递给他,所以static方法不可以访问非静态成员,非静态成员专属于某个对象。 例如:main方法是静态方法,所以他不可以访问非static的变量,非静态的方法必须new之后才能调用。 java.lang是唯一不需要import就可以直接使用
类的继承 (inheritance )
extends关键字实现继承 △语法规则 通过继承,子类自动拥有所有父类所有成员(成员变量,方法),子类对象包含了一个父类对象 java只有单继承,一个子类只能有一个直接父类,一个父类可以有多个子类 子类继承父类所有属性和方法,同时也可以增加自己的属性和方法 满足继承的条件: 子类 is 父类? 老师是人,这种说法成立,老师类可以继承人类,反之则不通。 △子类实例化过程 子类必须先调用父类构造器实例化父类,即先实例化父类然后实例化子类
super()
-调用父类构造器,只能出现在子类构造器中,并且是第一行。 -super()的参数决定了调用父类哪一个构造器 -如果子类没有super(),编译器默认加上super(,即调用父类空构造器。如果此时父类没有空构造器,编译就会出错。 this() -子类中,他只能调用本类其他构造器。并且出现在构造器第一行 -同一构造器中this()和super()不能同时出现
继承的优点(思考)
-多个子类共同继承了父类所有的方法和变量,需要增加减少共有属性时候,只用修改父类即可实现对所有子类的修改 -容易维护,编码高效
重写OVERRIDE
子类可重写父类的方法, -相同名称,参数列表,和返回类型, -重写方法不能比被重写方法更严格的访问权限。
如果子类中存在和父类方法同名,且参数相同的方法,则其返回类型必须与父类一致,否则将导致编译出错。(原因:子类会继承父类的这个方法,子类和父类这个方法不构成overload会导致方法重名)
Package
包是类, 接口,子包的合集 只能出现java代码第一行,每个源文件只能声明一个包
权限修饰符
使用权限修饰符对类的成员进行控制,在java中称为“封装” public>protected>friendly>private
private 当前类内部 public 任何地方 default 包权限 < protected 子类全新啊
class 只能用public 和default default class这只能在同一包中其他类可以访问 深入理解protected权限修饰符:同一个包和不同包的子类内部可见,如果子类对象是在子类外部创建的,是无法访问父类的protected修饰的属性和方法。 如果想在子类外部访问父类protected的属性方法,需要在子类overide被protected修饰的方法后,把权限修饰符修改为public
引用数据类型的转换
具有继承和实现关系的,父类和接口 upcasting 向上转型:子类转换为父类(父类引用指向之类对象) downcasting向下转型:
instanceof 运算符
A instanceof B 判断 A(对象) is B(类/接口)?
下列情况下 A instanceof B返回为ture
-object A是class B的实例化对象 学生 instanceof 学生类 -object A是class B子类的对象 学生instanceof 人类 -object A是class B父类的实例化对象 (发生了casting,即父类指向子类对象) 人instanceof 学生类
下列情况下 A instanceof B返回为false -object A象A所在的类如果和class B没有继承或实现关系。一定为false; –object A是class B父类的实例化对象 (没有casting)
// 父类指向父类
Person per1 = new Person();
// upcasting 父类指向子类对象
Person per2 = new Student();
// 子类指向子类
Student stu1 = new Student();
// downcasting 父类强转为子类引用
Student stu2 = (Student) per2;
// Student stu3 = (Student)per1; 没有经过向上转型,是不能向下转型的
// -object A是class B的实例化对象 学生 instanceof 学生类
System.out.println(per1 instanceof Person);
//人 是一个 学生类? 错
System.out.println(per1 instanceof Student); //false
// -object A是class B的子类实例化对象 学生 instanceof 人类
System.out.println(stu1 instanceof Student);
System.out.println(stu1 instanceof Person);
// upcasting 人类 指向学生类
System.out.println(per2 instanceof Student);
System.out.println(per2 instanceof Person);
// downcasting 人类 指向学生类
System.out.println(stu2 instanceof Student);
System.out.println(stu2 instanceof Person);
//结论:upcasting downcasting 并不影响 instanceof 的使用
//下列情况下 A instanceof B返回为真
//A对象的引用指向的是否会B实例化后的对象 或者B的子类实例化后的对象。
后记
简单浏览一遍后觉得不是凌乱,反而觉得简练,只是缺乏整理。我不太想以java老兵的思路整理,以刚入门的心态记得笔记相信更容易被理解。
|