Java语言入门篇基本概念
题言:写下这篇博客主要是回顾从黑马程序员学来的基本概念,并加深对java语言入门知识的理解,希望对于你们有帮助。由于常量、变量、运算符、方法入门、流程控制都很容易理解以及牢记,就不做篇幅去总结。
1、数据类型转换(byte、short、char-->int-->long-->float-->double)
四类八种基本数据类型:
自动转换:取值范围小的类型自动提升为取值范围大的类型。(byte、short、char运算时直接提升为int) 手动转换(强制转换):取值范围大的可以强制转换为取值范围小的。
2、数组定义和访问
(1)数组的定义:
int[] arr = new int[3]; int[] arr = new int[]{1,2,3,4,5};//已经固定好元素 int[] arr = {1,2,3,4,5};
(2)数组的访问:跟c语言的调用差不多。
(3)常见问题:数组越界异常(抛出ArrayIndexOutOfBoundsException异常)、数组空指针异常(抛出NullPointerException异 常)等
(4)数组作为方法参数和返回值
//数组作为方法参数传递,传递的参数时数组内存的地址 public static void 方法名(int[] arr){} //数组作为方法返回值,返回的是数组的内存地址 int[] arr = getArray(); public static int [] getArray(){ int [] arr = {1,2,3,4,5}; return arr; }
(5)总结:方法的参数为基本类型时,传递的是数据值,方法的参数是引用类型时,传递的是地址值。
3、类与对象、封装、构造方法
(1)面向对象概述
面向过程:强调步骤(放衣服-->找盆-->加洗衣粉-->加水-->浸泡10min-->揉一揉-->清洗-->拧干-->晾)
面向对象:强调对象(对象:洗衣机,放衣服-->开全自动洗衣机-->扔衣服-->按钮-->晾
特点:把复杂的事情简单化,将我们从执行者变成了指挥者。
(2)类和对象
类:是一组相关属性和行为的集合。
属性:一类事物的状态信息。(如:名字、体重、年龄、颜色)
行为:一类事物能够做什么。(如:走、跑、叫)
对象:是一类事物的具体体现。对象是类的一个实例。
成员变量:对应事物的属性 成员方法:对应事物的行为。
(3)类与对象的关系
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。
(4)成员变量和局部变量区别
(5)封装(将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。)
封装步骤:
使用private关键字来修饰成员变量;(也可修饰成员方法,只在本类中才能访问)
对需要的访问的成员变量,提供对应的一对getxxx方法、setxxx方法。
封装优化:
1)this关键字:代表所在类的当前对象的引用(地址值),即对象自己的引用。(方法被哪个对象调用,方法中的this就代表 那个对象。即谁在调用,this就代表谁)。
2)构造方法:当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始化值。(无论你是否自定义构 造方法,java都会自动提供一个无参数构造方法。一旦自己定义了,java默认的就无效)
(6)ArrayList类(大小可变的数组的实现,存储在内的数据称为元素。)
格式:ArrayList<String> list = new ArrayList<String>();第二个<>内的数据类型,jdk7以上可以留空。
常用的元素操作(增、删、查):
1) add(E e):添加元素到此集合的尾部。
2)remove(int index) :删除指定位置的元素。
3)get(in index):获取指定位置的元素。
4)size():返回此集合中的元素数。
ArrayList对象不能存储基本类型,只能存储引用类型的数据。
4、String类
定义:
//构造代码 //无参构造 String str = new String(); //通过字符数组构造 char ch[] = {'a','b','c'}; String str2 = new String(ch); //通过字节数组构造 byte b[] = {97,98,99}; String str3 = new String(b);
常用功能:
//boolean类型方法: equals(object ob)//将字符串与指定对象进行比较; equalsIgnoreCase(String str):忽略大小写进行比较 // int类型方法: length();//返回字符串的长度 ;indexof(String str);//返回子字符串第一次的出现的索引 //char、String类型方法: concat(String str);//连接到str字符串的末尾; charAt(int index);//返回索引处的char值; subString(int beginindex);//返回子字符串,从beginindex开始截取字符串到字符串结尾; replace(CharSequencetarget,CharSequencereplacement);//将与target匹配的字符串使用replacement字符串替换。 //数组类型的方法 public char[] toCharArray();//将此字符串转换为新的字符数组。 public byte[] getBytes();//使用平台的默认字符集将该String编码转换为新的字节数组。 publicString[]split(Stringregex);//将此字符串按照给定的regex(规则)拆分为字符串数组。
5、static关键字
(1)概述:可以修饰成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。(即属于类就不需靠对象 来调用。)
(2)修饰变量和方法
修饰成员变量:该变量称为类变量,该类中每个对象都共享同一个类变量的值,任何对象都可以更改该类变量的值。
修饰成员方法:习惯称为静态方法,直接用类名来调用。
静态方法调用的注意事项:
1)静态方法可以直接访问类变量和静态方法
2)静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。
3)静态方法中不能使用this关键字。
(3)静态代码块
定义在成员位置,使用static修饰的代码块{};
位置:类中方法外。
执行:随着类的加载而执行一次,优先于main方法和构造方法的执行。
6、继承、super、this、抽象类
(1)继承:多个类中存在相同属性和行为时,将这些内容单独写在一个类中,然后多个类就不需要再定义这些属性和行为,只 要继承那一个类即可。(子类继承父类的属性和行为,子类可以直接访问父类中的非私有的属性和行为。)
特点:1)java只支持单继承,不支持多继承。2)java支持多层继承。(顶层父类是Object类。所有的类默认继承Object,作 为父类)3)子类和父类是一种相对的概念。
(2)继承后的特点--成员变量
成员变量不重名:如果子类父类出现不重名的成员变量,这时的访问是没有影响的。
成员变量重名:子类中需要访问父类中非有私有成员变量时,需要使用super关键字,修饰父类成员变量,类似于之前的this
(3)继承后的特点--成员方法
成员方法不重名:如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。
成员方法重名(重写):子类出现与父类相同的方法时,会出现覆盖效果,声明不变,重新实现。
注意事项:
1)子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
2)子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
(4)super和this
super:代表父类的存储空间标识(可理解为父亲的引用)
this:代表当前对象的引用(谁调用就代表谁)
注意:子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。super()和 this()都 必须是在构造方法的第一行,所以不能同时出现。
(5)抽象类
抽象方法:没有方法的方法体; 抽象类:包含抽象方法的类。
抽象的使用和注意事项:
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现父类的抽象方 法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
1)抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:假设创建了抽象类的对象, 调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
2)抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
3)抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
4)抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。
7、接口、多态
(1)接口:方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要是封装了方法。
接口的定义与类的定义方式相似,但是使用interface关键字。它会被翻译成class文件,但一定明确它并不是类,而是另外一种 引用数据类型。
接口的使用,它不能创建对象,但是可以被实现(implements,类似于被继承)。一个实现接口的类(可以看做事接口的子 类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用犯法了,否则它必须是一个抽象类。
(2)基本的实现
类与接口的关系为实现关系,即类是实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承, 格式相仿,只是关键词不同,实现使用implements关键字。
非抽象子类是实现接口:
1)必须重写接口中所有抽象方法。
2)继承了接口的默认方法,即可以直接调用,也可以重写。
接口中的其他成员特点:
1)接口中,无法定义成员变量,但可以定义常量,其值不可以改变,默认使用public static final修饰。
2)接口中,没有构造方法,不能创建对象。
3)接口中,没有静态代码块。
(3)多态(同一行为,具有多个不同表现形式)
前提:
1)继承或者实现。
2)方法的重写。
3)父类引用指向子类对象。
(4)多态的体现:当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译错误;如果有,执行的时子类 重写后方法。
(5)多态引用类型转换(分向上转型和向下转型)
//向上转型:子类类型向父类类型向上转换的过程,这个过程是默认的。 父类类型 变量名 = new 子类类型(); //向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。 子类类型 变量名 = (子类类型) 父类变量名;
为什么要转型:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子 类拥有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有 的方法,必须做向下转型。
8、final、权限、内部类、引用类型
(1)final关键字(用于修饰不可改变内容,可以修饰类、方法和变量)
1)类:被修饰的类,不能被继承。
2)方法:被修饰的方法,不能被重写。
3)变量:被修饰的变量,不能被重新赋值。
(2)权限修饰符
编写代码时,如果没有特殊的考虑,建议这样使用权限:
1) 成员变量使用private,隐藏细节。
2)构造方法使用public,方便创建对象。
3)成员方法使用public,方便调用方法。
(3)内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。(一个事物内部还包含其他事物,就可以 使用内部类这种结构。)
访问特点:
1)内部类可以直接访问外部类的成员,包括私有成员。
2)外部类要访问类的成员,必须要建立内部类的对象。
(4)匿名内部类:内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的匿名的子类对象。
前提:匿名内部类必须继承一个父类或者实现一个父接口