Java知识点
Lesson1 认识java
Lesson2-3 认识对象:封装数据为类
1.类中有成员变量(属性/字段)+成员函数(方法),类是对象的模板/缔造者/抽象/类型
2.局部变量和成员变量的区别:
(1)定义位置不同:定义在类中的变量成员变量,定义在方法或{}中的是局部变量
(2)内存中位置不同:成员变量在堆内存的对象中,局部变量在栈内存的方法中
(3)声明周期不同
(4)初始化不同:成员变量有默认初始化值,局部变量没有初始值,必须手动赋值
3.方法重载:函数名称相同,但参数列表不同(可以是参数的类型、个数、顺序的不同)
(注意,与返回值不相干) 如果一个类中有两个同名方法,其参数列表完全一样,仅仅返回值类型不同,则编译时会产生错误
5.构造方法:与类同名且没有返回值。构造方法可以重载。如果没有声明构造方法,系统会默认构造一个无参的构造方法。构造方法可以有多个。(重载)
6.类之间的关系:
7.java每个类都默认地有null、this、super三个域,在任何类中都可直接使用。
this可以看作一个变量,他的值是当前对象的引用;在类的方法定义中使用this代表使用该方法的对象的引用;使用this可以处理方法中成员变量和局部变量重名的问题。
this的用法:引用自身对象的成员变量this.age
; 引用自身对象的成员方法this.diaplay()
;调用自身的构造方法this(“Jack”,Male,10)
;
super的用法:引用父类对象的成员变量super.age
;引用父类对象的成员方法super.diaplay()
;调用父类的构造方法super(“Jack”,Male,10)
;
Lesson4 封装
1.java的访问控制分4种级别:
- 私有级别:用private修饰,只有类本身可以访问
- 默认级别:没有修饰符,对同一包中的类公开
- 受保护级别:用protected修饰,向同一个包中的类以及子类公开
- 公开级别:用public修饰,对外公开
2.单例模式
-
一个类只有一个实例(对象)存在,该类一般没有属性。无法继承(因为构造方法private),无法扩展,无法更改他的实现。
-
一般有公共静态方法
getInstance
用于获得实例(注意是静态方法不是实例方法) -
使用条件:只需要使用一个单独的资源且需要共享这个资源的信息;需要频繁创建销毁的对象等
-
饿汉式:JVM加载类时就创建实例
public class Singleton{ //静态的,保留自身的引用。类加载时就初始化 private static Singleton test = new Singleton(); //必须是私有的构造函数 private Singleton(){} //公共的静态的方法 public static Singleton getInstance() { return test; } }
-
懒汉式:第一次需要的时候才创建实例
public class Singleton{ //静态的。保留自身的引用。 private static Singleton test = null; //必须是私有的构造函数 private Singleton(){} //公共的静态的方法。 public static Singleton getInstance() { if(test == null) test = new Singleton(); return test; } }
Lesson5 继承(重点:子类构造器、protected、向上转型)
1.继承虽好,但也破坏了封装性。子类(派生类)拥有父类(基类/超类)的【所有属性】和方法(不过私有的属性和方法不能直接访问),不能继承构造方法。Java中所有类共同的基类是Object类。
2.子类构造器
构造器的调用顺序:
子类的构造器在创建对象时会首先调用其直接父类的构造器,然后再执行自身的构造器。
使用super调用父类构造器:
- 在子类的构造器中,可以使用
super
关键字来调用父类的构造器。 super()
必须是构造器中的第一条语句。- 如果子类构造器没有显式调用
super()
,那么默认会调用父类的无参构造器。 - 父类有参构造器必须通过 子类构造器的
super(...)
调用。
3.protected
4.向上转型
-
将子类转换成父类,称之为向上转型或者向上映射。由于向上转型是从一个较专用类型向较通用类型转换,所以它总是安全的。
-
只能调用父类中定义的属性和方法。
-
变量隐藏:子类的成员变量和父类的成员变量同名,此时称子类隐藏了父类的成员变量。
-
方法覆盖(重写):子类函数原型与父类完全一样(名称、参数、返回值全一样);子类方法不能缩小父类方法的访问权限,子类权限要大于等于父类。
-
方法隐藏:私有方法、静态方法不能被覆盖,这时如果子类有相同方法,就是方法隐藏
final方法也不能被覆盖(重写)
怎么看调用:
覆盖:实例化是谁,就调用谁
隐藏:引用类型是谁,就调用谁
Lesson6-7 多态(多态、抽象、工厂模式、接口、向上向下转型)
1.java引用变量的两种类型,编译时类型:由声明该变量时使用的类型决定;运行时类型:由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。
2.静多态:发生在编译时,一般指方法重载。(与继承无关)
动多态:发生在运行时,一般指动态调用方法。在编译时不能确定要调用的方法,运行时才能确定。
3.实现动多态有3个条件:继承、覆盖、向上转型,缺一不可。继承是首要前提。
4.抽象
- 关键字abstract表示“尚未实现”的含义。可以修饰类或者方法。抽象方法没有方法体。
- 抽象类可以没有抽象方法,但抽象方法必须在抽象类里。如果一个类继承某个抽象父类,但没有具体实现父类的抽象方法,则必须定义为抽象类。(抽象方法必须在子类实现【是一种覆盖】,除非子类也是抽象类)
- 抽象类是不能实例化的,但可以创建它的引用。
5.工厂模式
6.接口:
- 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
- 接口是一种特殊的抽象类。因此实现接口要实现所有方法。只实现部分方法时,要把类设置成抽象类。
- 接口中没有构造方法
- 接口方法默认是public abstract的,类在实现接口方法时,必须显示使用public修饰符。
- 接口变量默认是public static final的。
- 接口可以多重继承。
7.向上和向下转型(向上是自动的,向下是强制的)
-
上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。
-
上转型对象不能操作子类新增的成员变量,不能调用子类新增的成员方法。
-
一个已经向上转型的子类对象可以强制类型转换,将父类引用转为子类引用,这就是向下转型。
-
当要使用子类特有功能时,就需要使用向下转型,调用子类特有的功能。向下转型不安全,可以用instanceof来避免运行时错误(向下转型出问题时编译是不报错的)。
-
instanceof:左边是一个引用类型的对象,右边是类名或者接口名。判断一个引用类型所引用的对象是否是一个类的实例。
Lesson 8 完善类的设计
1.equals和==
-
比较对象的equals和==是等价的,判断是不是引用的同一个对象。
-
String的equals只看字符串内容是否相等,而==还得看是不是同一个对象。
2.内部类
适用于只能系统中的某一个类访问;此外,如果某一个内部类仅仅为特定的方法提供服务,那么可以把内部类定义在方法之内。可见,内部类是一种封装类型的有效手段。
内部类的一个特点是能够访问外部类的各种访问级别的成员。
-
实例内部类:在创建实例内部类的实例时,外部类的实例必须已经存在。
Outer.InnerTool tool=new Outer().new InnerTool()
等价于
Outer outer=new Outer
&Outer.InnerTool tool=outer.new InnerTool()
实例内部类可以直接访问外部类的所有东西。
-
静态内部类:创建实例时不必创建外部类的实例。
-
局部内部类:只能在当前方法中使用,可以访问外部类的所有成员;还可以访问方法中的final或最终变量。
顶层类只能是public或默认访问级别的,内部类四个访问级别都可以。
3.匿名类
匿名类就是没有名字的类,是将类和类的方法定义在一个表达式范围里。
Lesson11 集合框架
1.概述:
- 所有集合类都在java.util包下,java集合类主要由Collection和Map派生来,她们是根接口。
- 集合框架的3大组成部分:接口、实现、算法。可以细化为4部分:数据结构、比较器、算法、迭代器。
- 集合类只容纳对象。
2.Collection接口
Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List。
Set接口:
- Set中的元素必须唯一。添加到Set的元素必须定义equals函数,从而保证元素的唯一性。
- 实现Set接口的类有HashSet和TreeSet
- TreeSet自动排序,不允许插入null;HashSet是无序的,只能允许放一个null
List接口:
- 元素都有确定的顺序,且可以重复。但不会自动排好序。
- List的实现类有ArrayList和LinkedList
- ArrayList是可变长度数组,遍历、随机访问效率高;LinkedList是链表,插入删除效率高。
3.Map接口
Map接口专门处理键值对映射数据的存储,key唯一,value可以重复。key不能修改。
子类TreeMap关于key有序,子类HashMap无序。
4.Collections工具类
Lesson12 文件与数据流
Lesson13 多线程
1.多线程的实现
通过继承thread或者实现Runnable接口来实现多线程。
Thread类简单易用,但java不支持多继承,因此有局限性。
Runnable可以避免单线程的限制,由于可以将 Runnable 对象传递给 Thread 对象,因此可以更好地分离线程的任务和线程本身,但编码较复杂。
2.sleep和yield的区别
sleep()使线程转入阻塞状态,而yield()使线程转入runnable状态
yield()给相同优先级或更高的线程运行机会,如果当前没有存在相同优先级的线程,则yield()什么都不做。
sleep()不会考虑线程的优先级。
3.wait、notify、notifyall
wait,nofity,notifyAll必须在已经持有锁的情况下执行,所以它们只能出现在synchronized作用的范围内,也就是出现在synchronized修饰的方法中。
wait的作用:释放已持有的锁,进入等待队列.
notify的作用:随机唤醒wait队列中的一个线程并把它移入锁申请队列
notifyAll的作用:唤醒wait队列中的所有的线程并把它们移入锁申请队列