今天的题真的是妙蛙种子吃着妙脆角妙进了米奇妙妙屋 妙到家了
第一章
第二章
层次高的类型转换成层次低的类型时,要加强制转换符,但可能造成降低精度
第三章 类和对象
(一)类和对象的基本概念
方法执行有其内存栈,所有本地变量(包括形参)按顺序压入栈中(后进先出)
方法执行结束时其内存栈也将自然销毁
6. java对象生命周期,什么是gc?工作原理?好处?
7. 构造函数作用,定义要求。默认构造方法和对类成员的初始化。构造和初始化顺序(4步)。
new初始化对象的顺序:
(1) 申请内存空间,为新对象分配空间并初始化,所有基本类型数据设置成了默认值(如,整数类型是0,布尔型为false),而引用类型则被设置成null;
(2) 执行显示初始化;(即指定默认值: private double discount = 1.0)
(3) 执行构造方法;
(4) 将对该对象的引用赋值给引用变量。
8. 对象变量的传递,值传递和引用传递
(二)包的概念
12. 什么是包?如何定义包?命名规则是什么?如何使用包?哪些常用包?哪个包不显式导入就可使用?
包: 类的组织形式
命名规则:由大到小(域名的倒写)
import 可以导入包
lang 包自动导入
注意:嵌套的包之间无任何关系
13. 使用jar打包(考试不要求)
[补充]Java数组
声明数组变量
注意:谨慎使用protected
因为它相当于允许子类直接操作父类成员,破坏了父类的封装性,因此,应当优先使用父类的公有成员函数来操作子类中的父类对象
如何实现继承?子类成员和父类成员有哪三种关系?
extends 父类
新增,重用,重写
什么是重写?有哪些语法要求?
重写(Override)子类覆盖父类的同名方法
必须和被重写方法有相同的名称、参数列表
两小于等于:1)子类方法的返回值类型比父类方法的返回值类型更小(子类)或相等;子类方法声明抛出的异常类要比父类方法声明抛出的异常类更小(子类)或相等。
一大于等于:子类方法的访问权限要比父类方法的访问权限更大或相等。即,重写方法不能使用比被重写方法更严格的访问权限
super关键字的作用什么?
指向父类
子类的构造函数的执行过程。能否继承父类?如何显式调用父类构造函数?
public class FatherClass {
private FatherClass() { //private 阻止了被继承,因为子类无法调用父类的构造函数
}
public FatherClass getFather() {
return new FatherClass();
}
}
类成员的可访问性。(4个关键字)
对象转型,向上,向下,instanceof关键字。
向下转型需要强制转化
向上转型不需要
引用 instanceof 类名:判断该引用所指向的对象是否属于该类或该类子类的对象
==
final方法和final类的含义
阻止方法(final方法)被重写(override)
final类:阻止类(final类)被继承
一个final类的所有方法都是final方法
如何给java类加文档注释,如何生成文档(考试不要求)
(四)多态的概念*******
22. 什么是多态,什么是动态绑定?多态实现的三点要求是什么?多态性是如何实现可扩展性和可维护性的?(如何在增加新类型时最小程度修改已有代码?)
多态-同样的消息被不同类型的对象接收时产生 的不同的行为
动态绑定-运行时判断所引用对象的实际类型,根据实际类型调用相应的方法
多态存在的条件
要有继承
要有方法重写
调用子类重写父类的方法
动态多态性只针对非静态的成员方法
23. 什么是抽象类?如何实现?抽象类是否能创建实例?
抽象方法是一种没有实现的方法
包含抽象方法的类:抽象类, 含有抽象方法的类必须定义为抽象类。
abstract关键字
抽象类不能创建(new)实例。
子类未实现一个父类的抽象方法,该类仍为抽象类;只有当子类实现了全部抽象方法时才不再是抽象类
24. 什么是接口?如何实现?接口是否能创建实例?接口中的成员数据有什么特殊之处?
API(Application Programming Interface)
一种类型,可看作一种特殊的抽象类。
接口(抽象类)不能被实例化
成员数据都是常量
如何实现两个对象可比较大小?需要实现什么接口?
接口:Comparator
抽象类和接口从设计目的到使用方法上有什么不同?(模板设计模式)
面向对象设计的基本原则(开放封闭原则)
Object类的作用,toString和equals方法,如何重写。
如何定义数组?数组是什么类型?数组的内存图。数组的成员length。如何引用数组
声明数组变量:
① int arr[];
② int[] arr
数组的元素是引用类型
int [] s; //数组的定义
s = new int [2]; //数组元素分配空间
s[0] = 2; //给数组元素赋值
System.out.printl(s.length);
Product[] ps = new Product[2];
ps[0] = new Product();
ps[1] = new Product(“shoe123”, 233, 20);
动态初始化: 先分配空间,再赋值
int [] arr;
arr = new int [2];
arr[0] = 1;
arr[1] = 2;
如何利用数组和多态性实现对某一大类事物的统一操作?
声明一个父类的数组
class A {
final String str = “this is father A”;
public A() {
}
public void print() {
System.out.println(str);
}
}
class B extends A{
final String strB = “this is son B”;
public B() {
}
@Override
public void print() {
System.out.println(strB);
}
}
class C extends A{
final String strC = “this is son C”;
public C() {
}
@Override
public void print() {
System.out.println(strC);
}
}
public class Main{
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
A [] As = new A[5];
As[0] = new A();
As[1] = new C();
As[2] = new B();
System.out.println(As.length);
As[0].print();
System.out.println("-------------");
As[1].print();
System.out.println("-------------");
As[2].print();
System.out.println("-------------");
sc.close();
}
}
main的参数是一个字符串数组(考试不要求)
多维数组是数组的数组,可变长
二维数组:
int [][] a = new int [3][]; //有三行
a[0] = new int[]{1};
a[1] = new int [10];
a[2] = new int []{4, 5, 6};
数组拷贝(System.arraycopy)(考试不要求)
工具类:Arrays,实现对数组操作方法,排序,复制,二分查找等。(考试不要求)
class BookComparatorByPrice implements Comparator {
@Override
public int compare(Book b0, Book b1) {
if (b0.getPrice() > b1.getPrice())
return 1;
else if (b0.getPrice() < b1.getPrice())
return -1;
else {
return b0.getName().compareTo(b1.getName());
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Book[] books = new Book[4];
//1. 从键盘接收用户输入的4本书的名称(仅有英文字符构成)、出版日期(格式:1998-10-09)、价格,生成Book对象,构造包含4本书的数组
for(int i=0;i<4;i++){
String name = sc.next();
String date_str = sc.next();
Date date = null;
//将键盘录入的日期字符串转换为Date
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
try {
date = sdf.parse(date_str);
} catch (ParseException e) {
System.out.println(“日期格式有误”);;
}
double price = sc.nextDouble();
Book book = new Book(name, date, price);
books[i] = book;
}
//按照价格升序
Arrays.sort(books, new BookComparatorByPrice());
for(Book book:books){
System.out.println(book);
}
sc.close();
}
}
第四章 常用类
String类和StringBuffer类******
用split将字符串以空格为分隔符
str.split(“\s+”);
4. StringBuffer常用函数:append
StringBuffer
append(String str)
将指定的字符串追加到此字符序列。
StringBuffer
delete(int start, int end)
移除此序列的子字符串中的字符。
StringBuffer
insert(int offset, String str)
将字符串插入此字符序列中。
//offset 是指在第几个字符(位序)后面插入str
Wrapper类
5. Wrapper的作用
Integer I1 = new Integer(10);
Double D1 = new Double(“123.456”);
Double D11 = new Double(123.456); //两种方法都可以
Double D2 = 1.23;//自动封装
int j1 = I1.intValue(); //手动解封(等同于类型转化)
int j1 = I1.intValue(); //自动解封
常用函数:parseDouble,valueOf,intValue
static double parseDouble(String s)
返回一个新的 double 值,该值被初始化为用指定 String 表示的值,这与 Double 类的 valueOf 方法一样。
static Double
valueOf(double d)
返回表示指定的 double 值的 Double 实例。
double doubleValue()
返回此 Double 对象的 double 值。
Double D = Double.valueof(312.41);
double d = D.doubleValue();
int k = Integer.parseInt(“123”);
日期类
6. 如何构造日期对象。参数是什么?why?
Date date = null;
//将键盘录入的日期字符串转换为Date
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
date = sdf.parse(date_str);
before (when)
当且仅当此 Date 对象表示的瞬间比 when 表示的瞬间晚,才返回 true;
long getTime()
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
void setTime(long time)
设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
如何操作日历?如何获得日历对象实例?如何修改年月日时分秒等值?
protected Calendar()
构造一个带有默认时区和语言环境的 Calendar。
protected Calendar(TimeZone zone, Locale aLocale)
构造一个带有指定时区和语言环境的 Calendar。
如何对日期进行格式化输出和解析?
format 格式化输出
parse 根据格式化字符串解析日期对象
applyPattern 应用某种格式
Date d = new Date();
SimpleDateFormat format = new SimpleDateFormat(
“yyyy-MM-dd HH-mm-ss”) ;
System.out.println(format.format(d));
format.applyPattern("EEE MM,dd,yyyy HH:mm:ss ");
System.out.println(format.format(d));
format.applyPattern(“MM,dd,yy HH:mm:ss”);
System.out.println(format.format(d));
Date d2 = format.parse(“10,31,16 19:18:56”);
System.out.println(d2);
SimpleDateFormat format2 = new SimpleDateFormat(
"EEE MM,dd,yyyy HH:mm:ss ", Locale.ENGLISH);
System.out.println(format2.format(d));
第五章 容器类
容器类的继承结构,其中哪些是接口,表示什么含义?哪些是实现类?
Iterator: ListIterator
Collection:
Set: HashSet
List: ArrayList
LinkedList
Queue: LinkedList
Map:
HashMap
HashTable
Collection接口的常用函数
List接口的常用函数(index相关)
Object get(int index);
Object set(int index, Object element);
void add(Object element);
void add(int index,Object element);
Object remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List list = new LinkedList(); //限定容器中只能放String
Queue接口的常用函数(offer peek poll)(考试不要求)
Deque接口的特点和常用函数(双向队列)(考试不要求)
LinkedList类的两个父类和常用接口(可以是队列,栈,链表)
Set接口的常用实现类HashSet
Set s = new HashSet();
hashcode原理
Map接口的常用实现类HashMap,存储的数据类型(key-value,键不重复),常用方法:put、get、containsKey,containsValue,keySet
迭代器的作用。如何获得迭代器?如何利用迭代器进行容器遍历?遍历过程中元素删除
Collection c = new HashSet();
c.add(new Product(“Book1",60,10));
c.add(new Product(“Book2",70,20));
Iterator i = c.iterator();
while(i.hasNext()){
Product s = (Product)i.next();
System.out.println(s.getName());
}
Set ks = map.keySet();
Iterator i = ks.iterator();
while (i.hasNext()) {
String key = (String)i.next();
Integer value = (Integer)map.get(key);
System.out.print (key+"-"+value+" ");
}
第六章 异常(不是重点)
第七章 流
什么是流?流的三种基本分类方法。
什么是字节流?什么是字符流?他们的继承结构中的最顶层类是什么?
什么是节点流?什么是处理流?有哪些常见的节点流和处理流?
InputStream类的作用?主要的方法:int read(),int read(byte[]),int read(byte[] buffer, int offset, int length),close()。各个函数返回值的含义
OutputStream类的作用?主要的方法。write(int),write(byte[]),write(byte[] buffer, int offset, int length),flush(), close()
Reader类的作用?主要的方法int read(),int read(char[]),int read(char[] buffer, int offset, int length),close()
Writer类的作用?主要的方法write(int),write(char[]),write(char[] buffer, int offset, int length),flush(), close() write(String),write(String buffer, int offset, int length)
文件类File的含义(逻辑层面的文件和目录),常用方法
文件操作流FileInputStream FileOutputStream FileReader FileWriter
处理流的构造方式,如何嵌套,如何确定嵌套的顺序。
缓冲流(4个),注意BufferedReader readline
数据流(2个)的作用。常用函数
对象流(2个)的作用,常用函数。序列化的含义和实现方法。Serializable ID序列号
输入输出重定向的方法。System.setIn System.setOut