JAVA基础

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

(1)封装:将对象的属性和行为封装起来,不让外界知道其具体实现细节,就是封装思想。
(2)继承:子类继承父类,可以继承父类的一些属性和方法(public和protected)无需重新编写,实现了良好的代码复用性;子类还可以扩展自己独有的功能。
补充:子类不能抛出比父类更大、更多的异常。
(3)多态:允许程序出现重名的方法。Java中有三种形式的多态:方法重载、方法重写。
方法重载(编译时多态):在一个类中,可以出现方法名相同,但是参数类型或个数不同,实现的功能也不同的方法;
方法重写(运行时多态):发生在子类继承父类,子类中存在与父类方法同名且参数相同、返回值也相同,但是实现的功能不同的方法。实际调用时根据调用对象的不同来决定执行哪个方法。
补充1:子类重写父类方法,不能使用比父类更严格的访问权限,例如父类方法是public修饰,子类不能用private修饰,只能也用public修饰。
补充2:子类重写父类方法,如果原来的方法不是静态方法,子类不能将其变为static方法。但是子类可以继承父类的静态方法(亲测可行)。
父类引用指向子类对象。
*注意:*子类继承父类时,子类与父类重名的成员变量不是多态,子类的成员变量会覆盖父类,但是例如

Base b = new Dericed();
System.out.println(b.i);

输出的是父类的i,而非子类的i值。这也说明了成员变量不存在多态,只有方法可以有多态。

2.构造方法:在实例化对象时,由JVM自动调用。

(1)在成员方法中不能直接调用构造方法,只有构造方法可以调用构造方法。只能使用this关键字调用构造方法,且必须位于第一行调用,且只能出现一次。
代码:this(参数1,参数2);
(2)每个类默认有一个无参构造,如果自定义了构造方法,JVM将不会再自动生成无参构造方法。此外,JVM默认生成的构造方法的访问权限修饰符与当前类的修饰符相同。
(3)使用this调用构造方法时,至少要有一个构造方法作为出口,即不使用this调用其他构造方法,一般以无参构造作为出口。
(4)构造方法只能被JVM自动调用,不能显示的直接调用。
(5)构造方法不能有返回值,也不能用void等关键字声明返回值类型。
(6)构造方法不能被继承,不能被重写,但是可以重载。
(7)子类构造方法的第一行默认隐式的调用了super();父类的无参构造。

3.垃圾回收机制(GC)

(1)垃圾回收(GC)的主要内存区域是堆内存。如果堆中某个对象实例不再被栈中变量引用,JVM会自动回收这个垃圾对象占用的堆内存空间。
(2)除了等待JVM自动进行垃圾回收,也可以主动调用System.gc();来通知JVM进行垃圾回收。
(3)当一个对象的内存被释放时,它的finalize()方法会被自动调用,因此可以重写该方法来实现对象被回收前的一些操作。

4.static关键字

(1)使用staic关键字修饰的成员变量叫做静态变量;修饰的成员方法叫做静态方法;修饰的代码块叫静态代码块。
(2)静态变量、静态方法属于类所有,不需要创建对象即可使用,被所有对象实例共享。可以使用类名.变量名/方法名来调用。
解释:例如某个学校所有学生共享同一个学校名,没必要在每个学生对象所占用的内存空间中都定义一个成员变量来表示学校名称,而可以在对象以外的空间(即方法区)定义一个变量让所有学生对象共享,这就是静态变量。
(3)static方法只能调用static,非静态可以调用静态。静态方法中不能使用this关键字。
解释:静态方法可以不创建对象执行,而非静态成员需要先创建对象才能访问,static调用非static时,可能对象还未创建,所以静态方法不能调用非静态成员。this关键字代表当前对象,当然也不能使用。
(4)静态代码块:当类被加载到内存时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。通常使用静态代码块来初始化类的成员变量。

static {
//类被加载时自动调用,且只调用一次
}

5.4种代码块

(1)Java中代码块共有4种:普通代码块、构造代码块、静态代码块、同步代码块。
(2)普通代码块:在方法或语句中定义。

@Test
public void test1(){
//定义一个普通代码块
{
int a = 100;
System.out.println("a=" + a);
}
int a = 200;
System.out.println("a=" + a);
}

(3)构造代码块:①直接在类中定义;②优先于构造方法执行;③每实例化一次对象就执行一次。

public class Demo3 {
//构造代码块
{
System.out.println("构造代码块先与构造方法执行");
}
//构造方法
public Demo3(){
System.out.println("构造方法执行");
}

public static void main(String[] args) {
Demo3 d = new Demo3();
}
}

(4)静态代码块:①直接在类中定义;②类被加载到内存中时执行,且只执行一次。③优先于构造方法和主方法执行。

static {
//类被加载时自动调用,且只调用一次
}

(5)同步代码块:synchronized 修饰方法,在多线程中使用,每次只能由一个线程进入同步方法。

public synchronized void fun() {
//方法体...
}

6.数组与对象数组

1、数组的特点:①存放相同类型;②有固定长度;③在内存中占据连续的空间
2、对象数组和数组一样,创建时必须指定长度。
3、但数组存放的是基本数据类型,有默认值(如int类型默认值0);对象数组存放的是引用类型,默认值是null。
4、数组是不是对象?首先对象的特点是封装了一些数据,提供了一些属性与方法。而数组有length属性,有clone方法,符合对象的概念,所以数组是对象
int a[] = new int[5]; a 是int[]类型的对象引用。
5、二维数组的第一维必须指定固定长度;但是第二维可以不指定长度,长度可以不同。
6、数组有length属性,字符串有length()方法,集合有size()方法。

//测试对象数组
@Test
public void testObjectArray() {
//动态初始化:先创建,再初始化
Person p1[] = new Person[3];
p1[0] = new Person("Lucy", 20);
p1[1] = new Person("Tom", 25);
p1[2] = new Person("Rose", 30);



//静态初始化:创建的同时初始化
Person p2[] = {new Person("张三", 20), new Person("李四", 50)};
}

7.super关键字

(1)在子类中,可以使用super关键字调用父类的成员变量和成员方法。

super.成员变量,super.成员方法([参数1, 参数2...)

(2)在子类中,可以使用super关键字调用父类的构造方法。必须位于子类构造方法的首行,且只出现一次。(this也必须位于首行,所以this与super不能同时出现)

super([参数1, 参数2...])

(3)创建子类对象时,如果没有用super关键字指定,默认会调用父类的无参构造。(如果父类没有无参构造将会报错,所以最好为每个类定义一个无参构造)

8.final关键字

(1)final修饰的类不能被继承;如String、StringBuffer类、包装类、Math类就是final修饰的。
(2)final修饰的方法不能被子类重写
(3)final修饰的变量是常量,只能被赋值一次,不能修改。
注意:如果一个成员变量被final修饰,JVM将不会对其初始化,所以需要在定义变量的同时初始化。

9.抽象类与接口

(1)抽象类规则:①包含一个以上抽象方法的类必须是抽象类;而抽象类可以不包含任何抽象方法。②抽象类和抽象方法都要使用abstract关键字修饰;③抽象方法只需声明不需实现;不能用private修饰,因为抽象方法必须被重写。④抽象类不可以被实例化,必须被子类继承(所以不能用final修饰抽象类),子类(如果不是抽象类)必须重写抽象父类中的所有抽象方法。

(2)接口规则:
①接口可以理解为比抽象类还要抽象的抽象类。
②接口中只能有全局常量和抽象方法。
接口中的变量不写默认是public static final修饰的;
接口中的方法不写默认是public abstract修饰的。
③抽象类也可以实现接口。
④接口可以使用extends继承多个接口,多个接口之间使用逗号分隔。
注意:接口继承接口使用extends,而不是implements。
⑤接口可以多继承接口,抽象类可以实现接口,抽象类可以继承普通类,抽象类可以继承抽象类;但是接口不能继承抽象类,因为接口中不能有普通方法,而继承的抽象类中可以有普通方法。

10.instanceof关键字

用来判断一个对象是否为某个类或接口的实例或子类实例。
语法:对象 instanceof 类或接口

11.局部变量只能被final修饰

局部变量不能被public 、protected、private、static修饰,只能被final修饰。

12.BigDecimal表示精确的浮点数

float、double都只能表示近似值,不是精确的浮点数。可以使用BigDecimal来表示精确的浮点数,它常用于计算金额等。但要注意,BigDecimal有很多重载的构造方法,只能选用参数为字符串的构造方法。

在这里插入图片描述
执行结果如下:
在这里插入图片描述

13.基本数据类型及其描述

Java提供八中基本数据类型,或称原始数据类型,分别为: byte、short、int、long、char、float、double、boolean。
*
byte、short、char类型参与计算时,会自动转为int类型。但是如果运算符是+=,它会隐含的将计算结果转为表达式左边的类型。例如:a+=b,结果会被转为a的类型。
*
char类型无论中文还是英文,都是1个字符两个字节。但是String类型是英文1字节,中文2字节。
*
float、double不是精确的浮点数,如果需要精确的浮点数,可以使用BigDecimal类。同理,由于float和double只是近似值,所以1.0/0.0是不会报错的,因为double类型是无法等于0的,只是无限接近于0,这个式子的结果是Infinity正无穷大。
*
byte的取值范围是-128~127之间;但是byte b = (byte) 128;类似这样的,byte本身不能赋值超过127,通过强转可以通过编译器报错,结果为-128。
*
Java采用Unicode编码,这种编码使用2个字节(即16位)表示一个字符。
*
自动类型转换:低精度数据类型可以自动转为高精度数据类型,优先级为byte<short<char<int<long<float<double。注意这7种类型不能和boolean类型相互转换。
*
使i+1<i的数是否存在?存在。如int i = Integer.MAX_VALUE;时,表达式成立。
*
Integer.MIN_VALUE的结果是负数:-2^31;Double.MIN_VALUE是正数:4.9E-324。
*
boolean类型默认值false。

14.==与equals

==两边的类型必须相同,否则编译报错。

equals调用者和参数可以不是同一种类型,编译能通过,但是返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值