Java第二章面向对象

Java只有单继承,多重继承,没有多继承
子类实例化时,默认通过父类的无参构造方法实例化父类,如果父类没有无参构造方法,子类在继承时需要通过super来调用父类的构造方法
调用super构造方法的代码,必须写在子类构造方法的第一行
  1. 重载与重写
重载在同一个类中,重写在父子类中或者接口与实现类中
重载和返回值类型没有关系,只和参数类型,参数个数,参数顺序有关
重写和返回值类型有关系,返回值类型必须相同
重写的方法参数列表必须完全与被重写方法的相同
重写方法的权限不能比被重写方法的权限小

5.抽象类和接口

抽象类为什么不能实例化 接口能实例化吗
接口中都是全局常量和抽象方法
静态方法可以被子类继承
静态不能访问非静态,非静态可以访问静态
接口不能有构造方法,不能实例化,抽象类可以有
return表示结束方法,return下边的代码不执行
类的属性也是有默认值的,String默认为null,int类型默认为0,如果类的属性不加private修饰,则可以通过对象.属性获取和修改属性,但是为了安全,需要对类的属性进行封装,通过对属性加private实现封装,这样只有这个类本身才能访问和修改这些属性,要想其他类也可以访问和修改这些属性,需要设置get和set方法,初始化属性还可以通过带参数的构造方法实现
方法区存放的是:类信息;静态变量;常量;成员方法
栈存放的是基本数据类型的数据和应用数据类型的引用
堆存放的是类的对象
Java中一个线程占一个栈区,每一个栈中的元素都是私有的,不被其他栈访问,栈中的数据大小与生存期都是确定的,缺乏灵活性,但是存取速度比堆块,仅次于CPU中的寄存器
栈存取速度快的原因:
栈内存通过栈指针来创建与释放空间
指针向下移动会创建新的内存,向上移动会释放这些内存
这种移动方式必须先明确移动的大小与范围,也因此影响了程序的灵活性
在堆中创建对象时,不必关注堆内存中需要开辟多少存储空间,也不需要关注内存占用时长,堆内存中内存的释放是由GC完成的
GC回收堆内存规则:当栈内存中不存在堆内存中对象的引用时,则将其回收
内存地址用16进制表示
匿名对象没有名字,直接用new在堆内存中创建,栈内存中没有引用,使用完一次后会被GC回收
匿名对象只能使用一次,想要多次使用一个对象则必须创建对象名,不能使用匿名
this代表执行当前操作的对象,this可以调用当前类中的属性,方法和构造方法,在一个构造方法中调用另一个构造方法时,this代码块必须写在第一行,无参构造调有参构造示例如下:
public class(){
		this(参数1,参数2…)
}
super代表当前对象所属类的父类的对象
static表示全局静态,全局是指被static修饰的属性或者方法可以被类的所有对象使用,static修饰的属性和方法可以直接通过类使用,因为它在类加载的时候即创建对象前就初始化了,静态是指不是根据对象动态创建初始化的,而是通过类静态加载初始化的
类中static修饰的代码块先执行,再执行大括号中的方法块,再执行构造方法中的代码块
  1. 父类异常和子类异常
try_catch中,catch语句要注意,先写范围小的,再写范围大的
try_catch_finally中try中有return的话,finally在return前执行还是return后执行
finally在return获得返回值后但还没返回给方法前执行
String str1 = "task"+1;
String str2 = "task1";
System.out.println(str1==str2);
结果为true
// A code block
int a = 1;
String str1 = "task"+1;
String str2 = "task1";
String str3 = "task"+a;
System.out.println(str1==str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
结果为:
true
false
false
task1
task1
task1
原因:字符串和基本数据类型拼接后形成的字符串在常量池里,字符串和变量拼接后形成的字符串相当于new了一个对象,在堆里
  1. Arraylist构造方法有三种,一种是无参,默认初始容量为10,每次扩容扩1.5倍;第二种是一参构造方法,参数为初始容量大;如果初次存储时需要大量的空间,建议使用一参构造方法,这样可以节省动态扩容使用的内存
  2. ArrayList按存入顺序存储数据,扩容每次扩1.5倍;Vector也是按存入顺序存储数据,扩容时可以设置增量,如果增量为0,则将现有长度增加一倍
  3. HashSet的底层是HashMap,是散列存储
  4. Set集合以及Set集合的子类都没有get()方法,想要获取数据,可以使用iterator遍历或者先使用toArray()方法将集合变成数组,再通过遍历数组或者输入下标获取数据
  5. TreeSet底层是TreeMap,采用自然排序也就是字典排序,用TreeMap的键来存储TreeSet的值,采用二叉树进行存储
  6. HashSet的add方法采用了HashMap的put方法,也是用HashMap的键存储HashSet的值
  7. 重写equals方法后必须重写hashcode()方法,如果不重写的话,两个对象用equals方法比较是相等的,但hashcode计算出来却不一样,则会当成两个对象存储
  8. HashMap允许空键空值,TreeMap只允许空值,TreeMap为什么不允许空键,如何让它允许空键?可以使用外部比较器comparator使其允许空键;Linkedhashmap允许空值空键
  9. Concurenthashmap为什么可以支持高并发?
    因为concurenthashmap采用了分段锁,将hashmap分成好几个部分,每一个部分采用一个锁
  10. Hashmap默认容量为16,散列因子默认为0.75,则存储容量使用了0.75的时候,调用resize()方法,扩容2倍,为什么是2倍呢?
  11. Treeset不允许添加空值,Hashset允许空值,linkedhashset允许空值
  12. Arraylist允许添加空值,Linkedlist也允许添加空值,Vector也允许添加空值
  13. \t长度为8个字符
  14. 静态代码块,普通代码块,构造方法的执行顺序
    静态代码块在类加载的时候执行且只执行一次,普通代码块在每次创建对象的时候执行,在构造方法前执行,构造方法最后执行
public class peo{
public class stu
}
//这种定义是允许的
public class peo{}
public class stu{}
//这种定义是不允许的
  1. Arraylist,Linkedlist,HashSet,TreeSet,HashMap,TreeMap,LinkedHashSet,LinkedHashMap哪个有序,哪个无序,哪个允许重复,哪个不允许重复,哪个线程安全,哪个不线程安全
    HashMap和TreeMap输入相同的键时,都会覆盖已存在的值,且这两个都是线程不安全的;
    ArrayList和LinkedList都允许重复,且都是线程不安全的
    HashSet和TreeSet都不允许重复,如果输入相同的值,则无法保存,所以无法覆盖;
HashMap<Integer,String> hashMap = new HashMap<>();
hashMap.put(1,"a");
hashMap.put(1,"b");
System.out.println(hashMap);

TreeMap<Integer,String> treeMap = new TreeMap<>();
treeMap.put(1,"c");
treeMap.put(1,"d");
System.out.println(treeMap);
//结果为
{1=b}
{1=d}

遍历TreeMap需要先使用keySet()方法得到包含所有Key的Set集合,然后用iterator遍历Set集合
35. TreeSet有序,默认升序;存储在TreeSet中的对象,此对象对应的类必须实现比较器接口,可以使用自然比较器Comparable,也可以使用外部比较器Comparator
36. Java默认提供无参构造方法,如果写了有参构造方法,则不再默认提供无参构造方法,必须显示的写出来无参构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值