java基础梳理

本文详细解析Java中的构造函数、继承机制、this与super关键字的使用,以及final、static、abstract等修饰符的应用场景。并通过实例介绍了内部类、接口及多态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.构造函数:如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造函数(无参构造函数)。
2.继承中,如果基类定义了非默认构造函数,并且没有定义非默认构造函数,则子类必须显式调用父类非默认构造函数,用:super(arg1,arg2,……)。
3.继承中,如果子类构造函数中没有显式调用父类构造函数,则默认调用基类默认构造函数(无参构造函数),若基类指定了非默认构造函数,同时没有无参构造函数,则子类构造函数报错。
4.this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
5.静态方法中只能调用静态方法,不能调用非静态方法;非静态方法中也只能调用非静态方法,不能调用静态方法。但是:构造函数可以调用静态或者非静态方法;静态方法中可以通过new对象调用非静态方法。构造函数实际上是static方法,只不过该static声明是隐式的。
6.访问权限什么都不写,代表包访问权限。名字不完全一样则不具有包访问权限。比如包aaa和包aaa.ccc,这两个包里面的类互相调用都需要import。
7.相同目录下的所有不具有明确package声明的文件,都被视作是该目录下默认包的一部分。在eclipse包下创建类没有package会报错。
8.可能使用到final的三种情况:数据(属性和参数)、方法和类。final数据:基本类型前面时,使数值不变;引用类型前,使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它指向另一个对象,然而对象其自身却是可以被修改的,java并未提供使任何对象恒定不变的途径(可以自己编写类以取得对象恒定不变的效果)。final方法:把方法锁定,防止任何继承类修改它的含义。所有private方法都隐式的指定为final,可以为private方法添加final修饰词,但这并不能给该方法增加任何额外意义。final类:不能继承该类,final类中的所有方法都隐式指定为final,因为无法覆盖他们,在final类中可以给方法添加final修饰词,但不会增添任何意义。
9.final修饰的变量,可以在声明的时候不给定初值,但是在使用的时候必须被初始化(eg:类中声明final变量,构造函数初始化);在接口中不能声明空final,必须赋值(可以是非常量表达式)。另外final修饰的值不一定在编译的时候可以知道它的值(eg:final int a = new Random(4).netInt(20))。
10.final变量初始化后不变,但是初始化的时候可以动态初始化。
11.static变量:类第一次加载的时候初始化,之后再次new对象的时候会与之前对象里面的static变量值有关系,所有对象公用一个变量。
12.static final变量:第一次初始化后不再改变。
13.基类包含两个方法,在第一个方法中调用第二个方法,然后子类继承该基类,并重写类中的第二个方法,不重写第一个方法,基类引用复制子类对象,并调用该基类的引用的第一个方法,则会先调用父类的第一个方法(继承父类所有public方法),再调用子类的第二个方法(运行时多态)。
14.子类不能写与父类同名但是访问权限变小的方法。基类可以protected,子类public;
15.只有方法可以多态,成员变量不能多态。父类引用指向子类对象,调用同名变量,则只能调用父类的变量。子类引用中要调用父类对象的变量或者方法则要通过super。
16.super(arg1,arg2,……)方法为在子类构造方法中调用基类构造方法时使用。要在子类调用父类变量或者方法则要通过super引用。
17.基类构造器调用别的方法,子类将别的方法重写,此时new子类对象的时候,基类构造器调用的别的方法会动态的调用到子类的方法。(基类构造器多态的调用到子类重写的基类方法,可能会产生莫名其妙的问题,因为此时对象还没有被构造完毕)。
18.编写构造器准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。在构造器类卫衣能够按期调用的那些方法是基类中的final方法(也包括private方法,private方法自动属于final方法),这些方法不能被覆盖,因此就不会产生多态调用引发的相关问题。
19.abstract:包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。(否则,编译器会报错)
20.可以创建一个没有任何抽象方法的抽象类。类前面需要加abstract来修饰。(如果有一个类,让其包含任何abstract方法都显得没有实际意义,而且我们也想要阻止产生这个类的任何对象,这样做就有意义了)。
21.抽象方法前面只能加public或者protected不能加private。抽象方法没有方法体。
22.abstract只可以用在抽象类类名、抽象类里面的方法名和接口里面的方法前(抽象类方法前面要声明抽象方法必须显式声明abstract,前面也只能加public或protected;接口里面的方法前不需要显式声明public abstract,隐式默认为public abstract,有且只能加public abstract)。类成员变量前不能使用abstract。
23.interface,如果不加public,则只具有包访问权限。
24.接口里面可以包含成员变量,这些变量是隐式的static和final的。接口里面的成员变量只能加public static final修饰词,不加隐式默认也是public static final。抽象类里面的变量前还可以加protected和private。

25.接口里面方法不能使用protected和private修饰符。可以显式的将方法声明为public,但即使不这么做,他们也是public的。方法只能加public abstract,不加默认隐式也是public abstract。

26.接口可以嵌套在类或者其他接口中。嵌套在类中的接口,同样可以加private、public、protected修饰符,不加前面三个修饰符就是包访问权限,接口也可以被实现为private的;嵌套在接口中的接口,同其他方法一样,同样只能是public。

27.一个java文件中只能有一个public的class。
28.内部类拥有其外围类的所有元素的访问权。在内部类中,使用外部类的名字后面加.this就可以生成外部类对象的引用。要创建内部类对象,必须使用外部类对象来创建该内部类对象(.new),在拥有外部类对象之前是不可能创建内部类对象的,因为内部类对象会链接到创建它的外部类对象上;但是如果创建的是嵌套类(静态内部类),则不需要对外部类对象的引用。
29.可以在一个方法里面或者再任意的作用域内定义内部类。方法里面创建内部类也称作局部内部类。
30.匿名内部类:如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会妖气其参数引用是final的。
31.匿名内部类不可能有构造器,因为它根本没有名字。可以通过一段代码块来实例初始化。
32.匿名内部类既刻意继承类,也可以实现接口,但是不能同时既继承类又实现接口,另外实现接口的时候也只能实现一个接口。
33.嵌套类(静态内部类):如果不需要内部类与其外网类对象之间有联系,那么久可以将内部类声明为static。普通内部类对象隐式地保存了一个引用,指向创建它的外围类对象;然而当内部类是static时,要创建嵌套类对象,并不需要其外围类对象,且不能从嵌套类的对象中访问非静态的外围类对象。另外普通内部类不能包含static数据和static方法,也不能包含嵌套类;嵌套类可以包含所有这些东西。
34.嵌套类不能通过外部类名.this引用到外围类。普通类可以通过外围类.this拿到外围类的引用。
35.嵌套类可以作为接口的一部分。正常情况下,不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分。放到接口中的任何类都自动的是public和static。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违法接口的规则。甚至可以在嵌套类实现外围接口。如果想要创建某些公共代码,使的它们可以被某个接口的所有不同实现所共用,那么使用接口内部的嵌套类会显得很方便。
36.多层内部类中访问外部类的成员:一个内部类被嵌套多少层并不重要,它能透明地访问所有它嵌入的外围类的所有成员。
37.为什么需要内部类:一般来说,内部类继承自某个类或实现某个接口,内部类的代码可以操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。
38.闭包:内部类是面向对象的闭包,因为它不仅包含外围类对象的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。
39.内部类的继承。
40.局部内部类:局部内部类(代码块,方法里面的类)不能有访问说明符。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值