Java零碎知识点整理
Java命名规范
包名:全小写
类名:大驼峰
方法名、类成员变量、局部变量:小驼峰
数据类型
分为基本数据类型(整数、小数、字符、布尔)和引用数据类型(字符串、数组、类、接口)
三元运算符
(条件表达式) ? 表达式1:表达式2
条件表达式为ture执行表达式1,false执行表达式2
Tip:如果必须有结果,且只有一个条件,可以用三元运算符替代if语句。
Random类
作用是产生随机数
Random ran = new Random();
T i = ran.nextXXX(j);
产生0 ~ j-1 之间的任意随机数
switch语句
只接受byte、short、int、char、string的数据类型
方法重载
一个类定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法重载
(区别于下方覆盖(重写)知识点,并在下方覆盖处说明)
方法的参数传递
当参数是基本数据类型时,是将改地址的数据传过去了,只是给了一个值,在方法内如何操作与原地址内的原值无关。当参数是引用数据类型时,传递的参数实际上时该参数的地址,所以此时修改数值的话,会修改内存中的原地址的数值。
ArrayList集合创建
基本数据类型对应的引用数据类型
基本数据类型 | 对应的引用数据类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
创建集合的代码实现
import java.util.ArrayList;
ArrayList<需要创建的引用数据类型> array = new ArrayList<需要创建的引用数据类型>();
ArrayList常用方法
方法声明 | 功能描述 |
---|---|
.add(Object obj) | 将指定元素obj追加到集合的末尾 |
.add(int index, Object obj) | 将指定元素obj追加到集合的指定索引位置 |
.get(int index) | 返回集合中指定位置的元素 |
.size() | 返回集合中的元素个数 |
.set(int index, Object obj) | 将指定索引元素进行修改 |
.remove(int index) | 从集合中删除指定索引元素,并返回该元素 |
.clear() | 清空集合中的所有元素 |
IO数据流
六字真诀:读进来,写出去。
字节流:可以处理任何文件数据。
字符流:只能处理纯文本文件数据。
import java.io.FileWriter //导包
public FileWriter(String filename){} //创建文件对象,参数中的字符串就是文件路径的名称。
两种常用的方法
public void writer(String str){} //写数据,参数就是想写入的内容
public void close(){} //关闭流
Tip:文件扩展名只能决定用哪一类软件打开文件,而不能决定其内容。
实现封装的方式
private :在当前类中可访问(私有)
default :在当前包内可访问
protected :在当前类和他的派生类中可访问
Tip:private私有,属于成员修饰符,不能修饰局部变量(即方法内部变量)。
并且用private修饰的变量不能被引用类型对象调用修改,由此就有了set、get方法的应用。
this和super关键字
this指向成员变量
super指向父类中的方法或量
重载
指一个类中创建同函数名不同参数的方法
覆盖(重写)是子类将父类中参数相同的同名方法重新定义
如果子类中需要引用原有的父类的方法或量,可以使用super关键字
子类继承、重写、覆盖父类方法时的注意事项
子类不能缩小父类方法的访问权限(必须保证子类权限大于父类权限),子类可以扩大的访问权限
(举个例子:儿子从父亲那儿继承一个东西,不能把那个东西变成自己的,不让自己的父亲再用。那肯定是不合理的嘛。)
一个类只能有一个直接父类,即java中只支持单继承(不能C继承A、B),但java支持多层继承(B继承A,C继承B,如果A、B中有重名变量或方法,用C对象只会调出上一层B中的该变量或方法)
接口
接口中只能定义抽象方法,且有固定格式,方法修饰符固定:
public abstract 返回值类型 方法名(参数列表){}
在接口中public abstract修饰符可以省略不写,
但是默认带有该权限
接口中只能定义常量:
public static final 数据类型 变量名 = 值;
同样在接口中public static final修饰符可以省略不写,
但是不写不等于没有,它的权限依旧是如此
Tips:
1.static修饰的量可以被类名直接调用
2.接口可以多实现(但是被实现的两个接口中不能有同名抽象方法):
public class C implements A,B{}
3.java支持接口间的多继承
多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。(构造器没有多态性)
父类类型或接口类型 变量名 = new 子类的对象();
即父类引用变量指向子类对象
多态演示样例:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a){
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
输出结果:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
多态的转型
向上转型(子类提升为父类类型,自动转换):
Person p = new Student;<br>
向下转型(方便多态对象调用子类的特有成员:
Student s = (student)p;
Tips:
1.多态有三个必要条件即前提:
①继承父类或实现接口
②重写
③父类引用指向子类对象
2.构造器没有多态性
3.多态成员的特点:编译时参考父类有没有这个变量或方法,没有则编译失败,当多态成员为对象调用方法时,运行的是父类中的变量值,而方法优先调用子类的重写方法。(即方法运行看右边子类,其他都看左边父类)
instanceof关键字
通过instanceof关键字来判断某个对象是否属于某种数据类型
boolean b = 对象 instanceof 数据类型:
封装、继承、多态作用总结
封装:
把对象的属性与方法实现细节隐藏,仅对外提供一些公共的访问方式
继承:
子类会自动拥有父类所有科技城的属性和方法。
多态:
配合继承与方法重写提高了代码的复用性和扩展性;如果没有方法重写,则多态同样没有意义。
关于Scanner的java.util.NoSuchElementException异常
具体异常报告代码例子
Exception in thread “main” java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
在这里需要注意:
Scanner的close()方法会关闭全局全部输入流,所以只需要在最后的时候用close()关闭输入流就行了。