Java语言中的修饰符
public
公有方法。整个程序都可以访问
private
私有方法。只有这个类可以访问
protected
受保护级别。这个包中的类及子类都可访问
默认级别(default)
无修饰符时只向同一个包中的类访问
权限限制 private>default>protected>public
公共成员变量
被public修饰的变量
public String s;
私有成员变量
被private修饰的变量
private int a;
保护级别的成员变量
被protected修饰的变量
protected int c;
局部成员变量
在方法内部的变量
public static void main(String[] args){
int a=3;
}
关于java中.java文件和.class文件
.JAVA文件为我们自己在程序中写的源代码
.class文件为jre虚拟机编译后得到的
java的基本数据类型
四种整数类型->int、long、short、byte。其中需要内存空间最小的为byte。
两种浮点属类型->float、double
一种字符类型->char
一种布尔型->boolean
装箱和拆箱
装箱:int->Integer 使用value of 拆箱 Integer->int 使用intValue
Integer a =100;
Integer b=100;
system.out.println(a==b)
结果为ture
Integer a=200;
Integer b=200;
system.out.println(a==b)
结果为false
因为Integer类型取值范围为【-128,127】因此第一个a,b取用的都是同一个对象,但当ab取值为200后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8P6xqZ5l-1604331826834)(C:\Users\nen\AppData\Roaming\Typora\typora-user-images\image-20201028163501406.png)]
各自生成一个新的对象,因此不相等。
不同的类型有不同的取值范围。查询 **类的valueOf的实现。便可以清楚其实现过程
实参和形参
实参:出现在主调函数中,在方法外部也可以使用
形参:出现在函数定义中,作用域在方法内部
对于基本类型,传递的时候,将实参值复制,方法内获得的形参与实参没有关系,只是值相同,称为值传递,在方法中修改形参而不更改实参。
对于对象,传递的时侯、将实参引用复制,形参与实参引用相同,指向同一个对象,称为引用传递,在方法中修改形参会影响实参
多态
(向上转型:
实例化一个对象 Cat a = new Cat();
Animal>Cat
向上转型 Animal a = new Cat(); )
一个事物在不同情况下的不同形态。如水在常温为水滴、高温为水蒸气、低温为冰。
多态的三个必要条件:继承、重写、父类引用指向子类对象
父类引用指向子类对象:
因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
重写
子类继承父类的方法,并更改父类的方法体。
public void sayhello。方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同。更改方法体中的内容。但是重写方法中一定不能抛出新的检查异常
重载
在一个类中,同名的方法如果有不同的参数列表(参数个数、类型、顺序不同)则视为重载
public void say(参数列表)
public void say()
初始化一个对象,调用,参数列表以来区分方法。s.say(参数列表)
总结:重载只是一个类中多态的一种表现形式、不能以返回类型相同与不相同来以区分是否为重载。重载必须参数列表不同。
重载与重写的区别
(编译是在运行之前将java代码编译成机器代码)
两者都是多态的不同表现形式。重载是在编译时的多态性,重写是运行时的多态性。重载要求的是同名的方法不同的参数列表,返回类型不要求相同。重写是同名的方法不同的方法体,且发生在父类与子类中,返回类型必须要相同或限制大于父类。
Java集合
List、Set、Map都是接口,前两个继承collection接口,Map为独立接口。Set有hashSet,LinkedHashSet,TreeSet。List有ArrayList、LinkedList、Vector。Map有Hashtable、LinkedHashMap、HashMap,TreeMap
与数组的区别
数组:长度固定,既可以是基本数据类型,也可以是引用类型,只能存储同一种类型
集合:长度可变,只能是引用类型,可以存储不同类型(大多情况下存储同一种类型)
使用集合框架的好处
容量自增长;
提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
允许不同 API 之间的互操作,API之间可以来回传递集合;
可以方便地扩展或改写集合,提高代码复用性和可操作性。
通过使用JDK自带的集合类,可以降低代码维护和学习新API成本。
List:
有序、可重复
ArrayList :数据底层为数组。查询快,增删慢。不同步、线程不安全
LinkedList:数据底层为链表。查询慢,增删快。不同步、线程不安全
Vector:数据底层为数组。查询快,增删慢。同步、线程安全
Set
无序、唯一
如何保证元素唯一性,依赖两个方法:hashCode和equals
HashSet:底层数据结构是哈希表(数组)
LinkedHashSet:底层数据结构链表和哈希表,由链表保证元素有序,由hash表保证元素唯一
TreeSet:底层数据结构是红黑树。(唯一、有序)
有序:自然排序,比较器排序 唯一:比较的返回值是否为0
Map
用于保存具有映射关系的数据,map保存两组数据:key和value,他们都可以使用任何引用类型的数据,但Key不能重复。所以通过指定的key就可以取出对应的value
HashMap、TreeMap、HashTable、LinkedHashMap
TreeMap:有序(红黑树),自然排序和定制排序
HashMap:无序,方法不同步,线程不安全,效率高
HashTable:无序,方法同步,线程安全,效率低,不允许空值
LinkedHashMap:双向链表和哈希表实现
equals和==的区别
"=="是运算符,equals是方法,行为方法可以通过重写实现改变,
- ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
- ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
- ==指引用是否相同, equals()指的是值是否相同
(jvm的内存分配知识。在jvm中,内存分配为栈内存和堆内存。区别为:创建一个对象时(new object),就会调用对象的构造函数在堆内存中开辟一块空间,将对象数据存储至堆内存中,并与在栈内存生成的引用对应,如果后续代码中有调用时都是在栈内存中的引用。基本数据类型都是存储在栈内存中的。)
switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
switch可作用在byte、String、char、int、short
switch不可作用在long、double、bollean、float上。
Integer与int的区别?
涉及于装箱和拆箱。int通过装箱value of成为Integer,Integer通过int value拆箱成为int,integer为包装类,int是基本数据类型。
包装类拥有方法和属性,基本数据类型不具备。
final
修饰类:表示这个类不能被继承。
修饰方法:把方法锁定、以防继承类修改它的含义;效率
修饰变量:对于基本数据类型的变量,数值初始化后无法修改
对于引用类型的变量,则在对其初始化之后不能在让其指向另一个对象。
String类
String类在java.lang中,String声明的是不可变的对象,每次操作都是生成新的String对象,然后指针指向新的String对象,原先的对象依旧在内存中,但是不指向它,那么这个对象就会成为垃圾内存,在某一时刻被java虚拟机回收
String常用方法
String的构造方法
1)String(String original):把字符串数据封装成字符串对象
2)String(char[] value):把字符数组的数据封装成字符串对象
3)String(char[],int index,int count):把字符串数组中的一部分数据封装成字符串对象
String类获取功能
1)初始化创建一个String对象
String string = new String("i am a one");
2)jvm会先在string pool中查询str是否存在String对象,如果有则直接调用,没有则创建。
Sting str = "i am a dog"
1、indexof(字符)
String string = new String("i am a one");
String str = " i am a dog a";
int str1 = string.indexOf("a" , 1);
int str2 = str.indexOf("b");
2、charAt(值)拿到指定位置的字符串 0武1汉3加4油
String du = ("武汉加油");
char du1 = du.charAt(0);
3、trim()去除字符串两端的空格
String ing = (" 中国空 ");
String st = ing.trim();
4、leng()为计算字符串长度
String i = "asdadadadasdasdasdasd喂喂喂";
int b = i.length();
5、substring(int start):从start出开始读取字符串
String a = "asdadadadasdasdasdasd喂喂喂";
String c = a.substring(1);
6、equals():比较字符串的内容是否相同
String aa = "asdadadadasdasdasdasd喂喂喂";
boolean cc = "asdadadadasdasdasdasd喂喂喂";
boolean cc1 = "acs";
7、toLowerCase():将字符串转换为小写字母 toUpperCase():将字符串转换为大写字母
String aaa = "We ARE FAMILY";
String bbb = aaa.toLowerCase();
String ccc = bbb.toUpperCase();
8、equalsIgnoreCase(String):忽略大小写比较两个值是否相等;
String aaa = "We ARE FAMILY";
String bbb = aaa.toLowerCase();
if(aaa.equalsIgnoreCase(ccc)) {
System.out.println("相等");
}else {
System.out.println("不相等");
}