Java 中的 static 使用之静态方法
1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。
3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间,最后是系统变慢。而普通的成员方法是由对象调用的,内存并不会一直为起分配内存,只有调用的时候才为其分配存储空间,而当其没有被调用时,存储空间就会被内存管理其收回,释放没有用的空间,提高的系统的运行速率!
Java 中的 static 使用之静态初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。静态初始化块只在类加载时执行一次。
面向对象的三大特性:封装、继承、多态。
封装概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处
只能通过规定的方法访问数据 隐藏类的实例细节,方便修改和实现
封装的实现步骤
包的作用
管理Java文件 解决同名文件冲突
定义
package包名
注:必须放在Java源程序的第一行,包名间可以使用”.”号隔开
eg:com.imooc.MyClass
系统中的包
java.(功能).(类)
java.lang.(类) 包含java语言基础的类
java.util.(类) 包含java语言中的各种工具类
java.io.(类) 包含输入、输出相关功能的类
包的使用
this关键字代表当前对象
this.属性 操作当前对象的属性
this.方法 调用当前对象的方法
封装对象的属性的时候,经常会用this关键字
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下:
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类可分为以下几种:
//外部类HelloWorld
public class HelloWorld {
// 内部类Inner,类Inner在类HelloWorld的内部
public class Inner {
// 内部类的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
public static void main(String[] args) {
// 创建外部类对象
HelloWorld hello = new HelloWorld();
// 创建内部类对象
Inner i = hello.new Inner();
// 调用内部类对象的方法
i.show();
}
}
概念
继承是类与类的一种关系,是一种“is a ”的关系
java中的继承是单继承。只有一个父类
继承的好处
语法规则
class 子类 extends父类
eg: class Dog extends Animal{
...
}
方法的重写
如果子类对继承父类的方法不满意,可以重写父类继承的方法,当调用方法时会优先调用子类的方法。
语法规则
返回值类型
方法名
参数类型及个数
都要与父类继承的方法相同,才叫方法的重写。
继承的初始化顺序
1.初始化父类再初始化子类
2.先执行初始化对象中属性,在执行构造方法中的初始化
final关键字“最终”
final可修饰类、方法、属性和变量
final可以修饰类,则该类不允许被继承
final可以修饰方法,则该方法不允许被覆盖(重写)
可修饰属性,则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
final可以修饰变量,则该变量的值只能赋一次值,则变为常量
在对象内部使用,可以代表父类对象。
访问父类的属性 super.age
访问父类的方法 super.eat()
super应用:子类构造的过程当中必须调用其父类的构造方法;如无显示调用则系统默认调用父类无参构造方法,如显示调用构造方法,必须在子类构造方法的第一行;如果无显式调用且父类没有无参构造方法则编译出错。
对象具有多种形态,继承是多态实现的基础。
1.引用的多态
父类的引用可以指向本类的对象 Animal obj1=new Animal();
父类的引用可以指向子类的对象 Animal obj2=new Dog();
Dog obj3=new Dog();//错,子类引用不能指向父类对象
2.方法的多态
创建本类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
实现多态时两个类必须是继承关系
方法的多态是引用指向本类对象,子类对象时,调用方法可调用本类的方法、子类继承父类的方法或者子类重写的父类方法,但不能通过父类的引用调用子类独有的方法
1.向上类型转换(隐式/自动类型转换),是小类型到大类型
2.向下类型转换(强制类型转换),是大类型到小类型 存在风险(数据溢出)
Dog dog=new Dog();
Animal animal=dog;//父类引用指向子类对象,向上类型转换
//Dog dog2=animal;//再次将父类引用转换成子类引用
//是存在风险的
//强制转换:
Dog dog2=(Dog)animal;//向下类型转换 强制
Cat cat=(Cat)animal;//1.编译时Cat类型2.运行时Dog类型 报错
解决方法:
instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
instanceof 判断,前者是否为后者的对象
if(animal instanceof Cat){
Cat cat=(Cat)animal;//1.编译时Cat类型2.运行时Dog类型 报错
}else{
System.out.println("无法进行类型转换");
}
1、语法定义:abstract关键字修饰
2、应用场景:
a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。(抽象类是约束子类必须有哪些方法,不关注如何实现)
b、从多个具有相同特征的类中抽出一抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3、作用:限制规定子类必须实现某些方法,但不关注实现细节。
4、使用规则:
a、abstract定义抽象类
b、abstract定义抽象方法,只有声明,不需要实现
c、包含抽象方法的类是抽象类
d、抽象类中可以包含普通的方法,也可以没有抽象方法
e、抽象类不能直接创建,可以定义引用变量
1、接口概念:
可是以理解为一种特殊的类,由全局常量和公共的抽象方法所组成
类是一种具体实现体,而接口定义了某一批类所需要遵守的 规范 ,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
2、接口定义:不使用class关键字,而是使用interface关键字。
接口就是用来被继承被实现的,修饰符一般建议用public
不能使用private和protected修饰接口
接口定义的基本语法:
[修饰符] abstract interface 接口名[extends 父接口1,父接口2…]
{ 不显式地写的话系统会自己加上
零个到多个常量定义…
零个到多个抽象方法的定义…
}
接口可以继承多个父接口,可以继承也可以不继承
3、接口定义
常量:接口中的属性是常量,即使定义时不添加 public static final 修饰符,系统也会自动加上。
方法:接口中的方法只能是抽象方法,总是使用,即使定义时不添加 public abstract 修饰符,系统也会自动加上。
4、使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
继承父类实现接口的语法为:(继承一个类实现多个接口)
[修饰符] class 类名 extends 父类 implements 接口1,接口2…
{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。
}
如果要继承父类,继承父类必须在实现接口之前
1、非检查异常的几种基本异常:
2、用try-catchy以及try-catch-finally处理异常 //先子类后父类
try{ //一些会抛出异常的方法
}catch(Ecxeptiom e){
//处理该处异常代码块
}catch(Exception2 e){
//处理Exception2的代码块
}···(n块catch代码块)···{
}finally{
//最终要执行的一些代码
}
3、return在try-catch-finally中:
1.e.printStackTrace();——表示打印异常的具体信息,写在catch块中
2.-1为抛出异常的习惯写法
3.如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果
4.finally块无论如何,不管前面是正常还是异常,都要执行。
5.finally 在try中的return之后 在返回主调函数之前执行。
String 类提供了许多用来处理字符串的方法,例如,获取字符串长度、对字符串进行截取、将字符串转换为大写或小写、字符串分割等。
Stirng类创建的字符串是不可变的,StringBuilder创建的字符串是可变的。
基本数据类型是不具备对象的特性的,比如基本类型不能调用方法、功能简单。。。,为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型。
包装类主要提供了两大类方法:
将本类型和其他基本类型进行转换的方法
将字符串和本类型及包装类互相转换的方法
Integer包装类的常用方法:
装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱
拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱
在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。
其中,基本类型转换为字符串有三种方法:
使用包装类的 toString() 方法
使用String类的 valueOf() 方法
用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串
再来看,将字符串转换成基本类型有两种方法:
调用包装类的 parseXxx 静态方法
调用包装类的 valueOf() 方法转换为基本类型的包装类,会自动拆箱
在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用:
可以使用 SimpleDateFormat 来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。
1、使用 format() 方法将日期转换为指定格式的文本
2、 使用 parse() 方法将文本转换为日期
一定要注意哦:
1、 调用 SimpleDateFormat 对象的 parse() 方法时可能会出现转换异常,即 ParseException
,因此需要进行异常处理2、 使用 Date 类时需要导入 java.util 包,使用 SimpleDateFormat 时需要导入 java.text 包
Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处理。
java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();
那么如何使用 Calendar 获取年、月、日、时间等信息呢?我们来看下面的代码:
Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名,如: Math.round();
常用的方法:
1、集合中的两个框架 collection和map.
list其中实现的子类arraylist和linkelist;
set其中实现的子类hashset
map实现的子类是hashmap
2、List接口及其实现类–ArrayList
List是元素有序并且可以重复的集合,被称为序列
List可以精确的控制每个元素的插入位置,或删除某个位
ArrayList——数组序列,是List的一个重要实现类
ArrayList底层是由数组实现的
3、Map
Map接口提供了一中映射关系,其中的元素是键值对(key-value)的形式存储的,能够实现根据Key快速查找value。Key-value可以是任何对象,是以Entry类型的对象实例存在的。
Key是不可以重复的,Value是可以重复的。
map支持泛型
每个键最多只能映射到一个值
Map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法
HashMap中的Entry对象是无序排列的,HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现。Key-value都可以为null,不过只能有一个key为null的映射