忆当年刚学java一个月时那些困扰过我的问题

Posted 如何在3年拿到50K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了忆当年刚学java一个月时那些困扰过我的问题相关的知识,希望对你有一定的参考价值。

背景

下面是我刚学习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老兵的思路整理,以刚入门的心态记得笔记相信更容易被理解。

以上是关于忆当年刚学java一个月时那些困扰过我的问题的主要内容,如果未能解决你的问题,请参考以下文章

忆当年H5布局易筋经——一个模型教你画出90%的前端页面

第一次尝试创建python库。被 modulenotfounderror 困扰

忆鲁迅《故乡》中的一句话

Java 数据阅读器跳过我的空新行 (\n)

那些令人敬佩的刚学OI的大佬

php 'ISSET' 功能不起作用。或者代码跳过我的 if 语句