java基础

基础知识

1、面向对象三大特点:封装、继承、多态。

2、Java规范:包==文件夹,所有单词字母均小写,规则:<域名反转>.<团队名>.<项目名>。同一个包下,不能建同类名的文件;不同包可以建通类名文件。com.youceedu.wms.order

3、类:所有单词首字母大写。TestYouceedu

4、方法:第一个单词首字母小写,之后每个单词首字母大写。getInfo()

5、属性:第一个单词首字母小写,之后每个单词首字母大写。int testType

6、常量:所有单词的字母都大写。final float PI = (float)3.1415926

7、工程名,一个工程就是一个项目,命名:英文字母纯小写

8、类的定义:

class 类名称{

数据类型属性;

public 返回值数据类型 方法名称(参数类型 参数1,参数类型 参数2){

代码语句;

return 表达式;

}

}

9、对象的创建和使用

类名 对象名称 = new 类名();----->创建并实例化对象

对象名称.类中的属性        对象名称.类中的方法()  -------->类中属性和方法的调用

封装 private

1、封装用private,属性封装后要想调用需要使用 set/get方法;构造方法。

2、构造方法特性:

      构造方法名称必须和类名称一致;

构造方法的声明处不能有任何返回值类型的声明;

构造方法不能有return返回值,本身构造方法就是为了调用私有属性,赋值用的,所以不能有return返回值;

类中有了构造方法后,程序编译的时候就不再自动生成默认构造方法(无参构造方法)了,即一个类中至少有一个构造方法;

构造方法的参数类型或者参数个数互不相同;

构造方法重载:构造方法实例化时需要满足其中一个构造方法

构造方法重载:无返回值,方法名相同,入参类型及个数不能相同

普通方法重载:不关注是否有返回值,方法名相同,入参类型及个数不能相同

3、构造方法私有化解决方法。(单例模式==不管有多少个对象,实际上只有一个实例。)

(构造方法私有化适用于有参的构造方法吗???)

3.1  在类内部先实例化一个对象

3.2  在类内部增加一个public方法做桥梁,增加setter/getter方法。


4、static 关键字

static声明属性----->全局属性,又叫静态属性,存放在全局数据区;

static声明方法----->类方法,可以由类名直接调用,格式:类名.方法名。

非static声明的方法,叫普通方法。调用方法是先实例化对象,通过对象调用。同 基础知识 内的9。

5、java程序运行过程:.java文件通过编译器编译字节码文件,呈现.class文件,.class文件再通过类加载器把文件放到JVM(堆内存、栈内存、全局数据区、全局代码区)。

6、JVM

堆内存:保存每个对象的具体属性内容和new的数据;

栈内存:保存所有对象名称(即堆内存空间的引用址);

全局数据区:JVM在加载class文件时,若发现有static定义的属性,会直接存放到全局数据区,即jvm静态分配;以及保存定义的常量。多个对象共享1个全局数据区域,节省堆内存。

全局代码区:JVM加载class文件时,将构造方法、普通方法、类方法都存入全局代码区,即jvm静态分配;以及保存所有方法的二进制代码,多个对象共享一个代码空间区域。

总结:堆内存和栈内存的分配是程序运行中动态分配的,全局数据区和全局代码区是静态分配的。

7、面试题 两行代码区别

private string type = "学生";

private static string type = "学生";

7.1、普通属性和全局属性;

7.2、普通属性随着实例化每实例化一次就在堆中生成一次,全局属性存放在全局数据区,可以让多个对象共用这一个属性,节省堆内存空间;

8、static方法不能调用普通方法,但是普通方法可以调用static方法。

第一个原因是 static方法(类方法)可以直接通过类名.类方法名调用,调用时,如果static方法内有普通方法,就跳过了普通方法实例化对象的过程。即堆内存没有赋值,没有堆内存空间,所以会报错。第二个普通方法可以调用static方法是因为static方法存放在全局代码区。

构造方法和普通方法调用只能通过类实例化对象,然后通过对象调用。方法是:类名 实例化对象名 = new 类名()

9、一个类中尽量不要同时有类方法和普通方法。特别是尽量少有类方法,static

10、匿名对象

没有给出明确的对象,一般只使用一次;

匿名对象只在堆内存开辟空间,不存在栈内存的引用。eg:new Person("youceedu",10)

11、this关键字

11.1 表示本类中的属性;

11.2 可以使用this调用本类中的构造方法;

11.3 this调用构造方法时必须放到构造方法的首行,因为构造方法在实例化对象时被自动调用,即构造方法优先调用;

11.4this调用构造方法时,一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。

12、内部类

内部类可以访问外部类中的私有属性;

static内部类不能访问外部类中非static属性和方法;

调用内部类方法:外部类.内部类 内部类对象 = 外部类实例.new 内部类();  ====>内部类对象.内部类方法名()。其中外部类实例来源=====外部类 外部类实例 = new 外部类名()。

13、代码块

主类:静态代码块优先于主方法;

普通类:静态代码块  >  构造块({……}) >  构造方法块  >  普通方法块

静态代码块不管实例几次,只执行一次,构造块实例n次,执行n次。

继承 extends

1、子类可以继承父类非封装private的属性和方法;子类可以定义自己的属性和方法;子类只允许多层继承,不能同时继承多个父类。

2、子类实例化过程

子类实例化之前先调用父类中的构造方法(对父类中的属性初始化);

再调用子类自己的构造方法;

剩下的父类和子类的普通方法,由子类实例对象决定调用哪个。

3、子类覆写 @override

子类覆写父类方法。当父类方法代码不适合子类使用时,子类通过在自己内部定义和父类同名的方法重新实现方法的过程。注意子类覆写的方法不能拥有比父类方法更严格的访问权限。当方法被覆写后,子类对象调用的方法是覆写后的方法。

子类覆写父类的属性。===子类不能覆写父类属性,父类属性都是被封装的。

4、super关键字可以从子类中调用父类中的构造方法、普通方法和属性。调用过程中只能调用父类非封装的方法和属性。super调用父类中指定的构造方法是,必须放在子类构造方法的首行。

5、this和super的区别

从属性访问上看,this访问本类中的属性,本类中没有此属性,则从父类中查找;super直接访问父类中的属性;

从方法调用上看,this访问本类中的方法,本类中没有此方法,则从父类中查找;super直接访问父类中的方法;

从构造方法中使用中看,this调用本类构造方法,必须放在构造方法的首行;super调用父类构造方法,必须放在子类构造方法的首行。super和this调用构造方法时,不能同时出现在一个构造方法内。

6、重载和覆写的区别

重载:Overload;覆写:override

重载类中方法名称相同,参数类型或者个数不同,对权限没要求;覆写子类和父类方法名称、参数类型、返回值类型全部相同,并且子类中覆写的方法不能拥有比父类更严格的权限。

重载发生在一个类中;覆写发生在继承类中。

7、抽象类 abstract,包含一个抽象方法的类必须是抽象类。

抽象类方法只需要声明,不需要实现(声明不能用private,否则子类不能实现);

抽象类至少有一个抽象方法,可以有普通方法;

抽象类可以有抽象类的构造方法;

抽象类必须被子类继承,子类必须重写抽象类中的全部抽象方法;

抽象类专门当作父类,作用类似“模版”;

子类调用方法时都是调用的覆写后的方法。

8、子类覆写父类的方法是override,子类重写抽象父类的抽象方法是implement实现

9、子类构造方法实例化前需要先调父类构造方法,父类构造方法需要传参,需要在子类中加参数通过super方法调用父类构造方法。


10、接口

接口是Java中一种特殊的类,由全局常量和公共抽象方法组成。

接口只能继承接口,类只能实现接口。

11、接口继承多个接口

接口可以一次继承多个接口,但类一次只能继承一个父类;

一个子类可以同时实现多个接口,子类要覆写接口内的所有抽象方法;

一个子类可以同时实现多个接口,摆脱java单继承局限。接口和抽象类优先使用接口。

12、子类继承普通类/抽象类 并实现接口

class 子类名称 extends普通类/抽象类 implements 接口A,接口B{

}

13、抽象类实现接口 / 普通类实现接口

凡是类都是实现接口,类和类之间是继承关系。

抽象类可以实现接口,但接口不允许继承抽象类(抽象类内可能存在普通方法,继承抽象类后不符合接口规范),允许一个接口继承多个接口。

14、抽象类和接口的区别

抽象类是包含一个抽象方法的类,接口是抽象方法和全局常量的集合;

抽象类由构造方法、抽象方法、普通方法、常量、变量组成,接口由抽象方法和全局常量组成;

子类继承抽象类,子类实现接口;

抽象类可以实现多个接口,借口不嫩继承抽象类,但是允许继承多个接口;

抽象类有单继承的局限,接口没有此局限;

如果抽象类和接口都可以使用,则优先使用接口,避免单继承局限。

抽象类和接口都是通过对象的多态性产生实例化对象。

多态

1、多态的表现形式:方法的重载和覆写;对象的多态性。

2、对象的多态性

向上转型和向下转型。

3、向上转型:父类 父类对象名称 = new 子类名();

3.1  可以对抽象类进行实例化(好处==?)

实例对象调用的抽象方法是被子类覆写过的方法,同时不是抽象类下的抽象方法不能调用,即不能调用子类的方法。

3.2  可以对接口进行实例化(好处==?)

实例对象调用的抽象方法是被子类覆写过的方法,同时不是抽象类下的抽象方法不能调用,即不能调用子类的方法。

3.3  代码扩展方便,且耦合度低(代码量变小了)

类B和类C同时继承了类A,B类和C类都对类A中同一个方法进行了覆写,在类B和类C中都有调类A中被覆写的方法的场景,你可以写两个相同的方法分别进行调A中的方法(方法的重载),为了减少代码你也可以利用向上转型,直接写一个方法,实例化A类的对象,执行A类中被覆写的方法,B转的就调B中覆写的方法,C转的就调C中覆写的方法。


总之:对象向上转型后,对象调用的方法一定是被子类覆写过的方法或者自身的方法。

4、向下转型

A a = new B();

B b = (B)a

你可能感兴趣的:(java基础)