目录
1. static关键字
1.1 修饰成员变量
1.2 修饰成员方法
1.3 静态代码块
1.4 静态内部类
1.5 静态导包
2. do-while循环
3. 接口
3.1 概念
3.2 接口的特征
3.3 和抽象类的区别
4. 父子类之间的转换
4.1 子类转换成父类
4.2 父类转换成子类
5.多态
5.1
5.2 多态的实现方式
方式一:重写
方式二:接口
方式三:抽象类和抽象方法
6. 包
7. API的使用
1. static关键字
Java当中有53个关键字,其中有2个保留字。
static关键字用于5个地方,常用的是4个。
static主要有以下用法:
修饰成员变量,修饰成员方法,静态代码块,静态内部类,静态导包。
1.1 修饰成员变量
被static修饰的成员变量,我们将之称为静态变量或类变量,相比于普通的成员变量,它有着以下几点不同之处:
- 能够被所有的对象所共享;
- 随着类的加载而存在;
- 它存在于方法区的静态区,JVM只为它分配一次内存空间;
- 有两种调用方法,通过类名来调用或通过对象来调用。
例子:
售票:有十个窗口售卖100张票,票的总数是固定的,不能一个座位坐两个人。票数被这十个窗口共享。当要用这个车时就有了票数。
public class Person {//成员变量private String name;//静态变量(类变量)private static int age;public static void main(String[] args){//静态变量可直接通过类名调用,随着类的加载而存在,类的消失而消失Person.age = 10;Person person = new Person();/*成员变量只能通过对象来调用,并且随着对象的创建而存在,*随着对象的回收而销毁。*/person.name = "小明";//静态变量也可以通过对象来调用person.age = 12;}
}
当变量age用了static修饰称为静态变量后,对象person将不再拥有age这一个属性,age这一属性将由person类掌管,即无论你new出多少个person对象,age属性只有一个,如果某一个对象对age属性进行了修改,那么所有的对象中的age属性值将会发生改变,这将会是一件很糟糕的事,所以一般很少会这样定义静态变量。
JDBC工具类
七个步骤:
每次用到很麻烦,代码抽取出来。
加载驱动,获取连接:用户名、密码、url,驱动类的包 -- 静态变量
定义静态变量
1.2 修饰成员方法
被static修饰的成员方法,我们称之为静态方法,相比于普通的成员方法,它有着如下几点不同之处:
- 静态方法可以通过类直接调用;
- 静态方法只能访问静态变量;
- 静态方法中不可以使用this或者super关键字;
- 主函数是静态的。
this指的是当前对象,静态是类加载的时候,可能还没对象。super也一样。
静态方法和静态变量都是从类加载就有的。
public class Person {//成员变量private String name;//静态变量(类变量)private static int age;public void show(){//非静态方法可以直接访问类的静态变量,成员变量,静态方法age = 10;name = "小花";view();System.out.println("这是一个普通成员方法");}public static void view(){age = 12;//静态方法不可以直接访问类的非静态成员和方法Person person = new Person();person.name = "小明";person.show();System.out.println("这是一个静态方法");}public static void main(String[] args) {//静态方法可以通过类名直接调用Person.view();Person person = new Person();//静态方法也可以通过对象调用person.view();//非静态方法只能通过对象调用person.show();}
}
1.3 静态代码块
- 随着类的调用或创建实例而执行,并且只执行一;
- 优于主函数的执行;
- 用于初始化类。
- 静态代码块优先级最高,所有父类子类中静态代码块优先执行。
先看有没有静态代码块,如果有,优先静态代码块。代码块优于构造方法。父类的初始化优于子类。
故顺序为:
父类静态代码块-子类静态代码块-父类代码块-父类构造方法-子类代码块-子类构造方法。
见:【java】初始化顺序_java 初始化顺序-CSDN博客
静态代码块是类一加载就调用的。
1.4 静态内部类
- 非静态内部类:不能声明但可以调用外部类的任意。
- 静态内部类:可以声明但只能访问静态的。
public class Person {public static class Demo{Demo(){System.out.println("这是一个静态内部类");}}public class Demo1{Demo1(){System.out.println("这是一个内部类");}}
}class Test { public static void main(String[] args) {Person person = new Person(); //实例化Personperson.new Demo1(); //调用内部类new Person.Demo(); //调用静态内部类}}
1.5 静态导包
静态导包就是java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。
import static java.lang.System.out;
import static java.lang.Integer.*;class Test {public static void main(String[] args) {out.println(MAX_VALUE);out.println(toHexString(42));}
}
2. do-while循环
语法:
do{
循环体
}while(表达式)
class Demo15{/**需求:打印100到1000之间的所有夹心饼数。如:191,838分析:循环条件:判断计数器是大于等于100小于1000循环操作:更新计数器,判断是否是夹心饼干*/public static void main(String[] args){//定义一个计数器int i = 100;do{//获得个位int g = i % 10;//获得百位int b = i / 100;if(g == b){System.out.println(i);}//计数器的累加i++;}while(i < 1000);}
}
3. 接口
3.1 概念
白话:只定义行为,不实现。(1.8以后有实现的-静态方法,默认方法) 谁实现这个接口,遵循这个规范,做不一样的事情
当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是对行为的抽象。类是对属性和行为的抽象。
应用:
计算圆和正方形的面积和周长。如果不实现接口,需要写四个方法。
抽象类里可以有自己的实现。有自己的还有没抽象。
语法
interface 接口名{
方法定的定义;
….
}
3.2 接口的特征
1.接口中的方法的定义不需要Abstract来修饰,默认就是抽象的
2.接口是不可以实例化的,需要有类来实现接口实现接口的语法:
class 类名 implements 接口名,接口名,…{
//实现每一个接口中的方法
}
3.接口中的方法不能和private,static和final共存
4.在接口中可以定义”属性”,可以通过接口的实现类的实例来访问(不推荐),推荐使用接口名.常量,这是一个常量默认是public, static ,final
注意:常量的定义命名的规范要使用大写,单词之间要用“_”分隔。
5.接口可以继承接口(多继承)
interface A{public void methoda();public void method();}interface B {public void methodb();public void method();
}//接口中可以多继承
interface C extends A,B{}class CImpl implements C{public void methoda(){}public void methodb(){}public void method(){}
}
public class TestPerson2{public static void main(String[] args){}
}
3.3 和抽象类的区别
- 1.接口是行为的抽象可以有静态方法,抽象方法和默认方法,抽象类中可以有所有方法。
- 2.接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。
- 3.抽象类只能单继承,接口可以多继承接口(jdk1.7),接口还可以多实现。
- 4.接口中的“属性”是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。
- 5.接口中的方法默认就是抽象的不需要加absract,抽象类中的抽象方法需要加abstract关键字。
- 4.接口中的“属性”是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。
- 3.抽象类只能单继承,接口可以多继承接口(jdk1.7),接口还可以多实现。
- 2.接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。
使用接口的好处:
1. 接口定义的是一种标准,可以使我们的代码分层开发,分模块开发。
2. 降低代码的耦合度,提高代码的可扩展性和可维护性
3. 接口改进了单继承的局限。
先出现的抽象类,后出现的接口。
抽象类:Teacher先继承人,Java老师再继承Teacher 因为有正常的方法。
4. 父子类之间的转换
4.1 子类转换成父类
子类可以自动转型成父类。
- 如果子类对父类的方法有覆写,并且子类的实例赋值给父类的引用,通过这个引用来调用这个覆写的方法的时候,调用的是子类。
- 父类指向子类的实例的引用不能调用子类的特有的方法和属性。
- 如果父子类有同名的属性,那么父类指向子类的实例的引用调用这个属性的时候调用的还是父类的,不要和方法混淆。
class Teacher{String name = "亮哥";int age;public void teach(){System.out.println(name+"在教课");}
}class JavaTeacher extends Teacher{boolean isGlass;String name = "大亮哥";public void teach(){System.out.println(name+"在教java课");}public void playBall(){System.out.println(name+"在打篮球");}}public class TestTeacher{public static void main(String[] args){//子类自动转换成父类Teacher jt = new JavaTeacher();jt.name = "亮哥";jt.teach();//父类的引用不能调用子类的特有方法/*jt.playBall();jt.isGlass = true;*/System.out.println(jt.name);}
4.2 父类转换成子类
(该父类要转换的子类一定是它的子类真身)
特点:
- 父类转换成子类不能自动完成。
- 父类转换成子类的前提是父类的真身是这个子类,转回子类后,就可以访问子类内部的方法和属性。
- 如果这个父类的真身是子类B,不能强制转换成子类A,只能转换成B。
- 抽象类作为父类同样符合上述理论
- 接口中也是完全符合上述理论,但是注意接口中没有属性。
class Teacher{String name;int age;public void teach(){System.out.println(name+"在教课");}
}class JavaTeacher extends Teacher{//子类属性boolean isGlass;//重写public void teach(){System.out.println(name+"在教java课");}//子类方法public void playBall(){System.out.println(name+"在打篮球");}}class PHPTeacher extends Teacher{//重写public void teach(){System.out.println(name+"在教PHP课");}}public class TestTeacher2{public static void main(String[] args){Teacher t = new JavaTeacher();//不能转JavaTeacher jt = (JavaTeacher)t}
}
5.多态
5.1
多态:一个方法不同的表现形式
同一个事件发生在不同的对象上会产生不同的结果。
【java】多态-CSDN博客
继承多态,不仅仅是父类是抽象类,父类是普通类也是可以的。
多态的条件:
子类对父类有方法重写。
- 父类的引用指向子类的实例,调用覆写的这个方法的时候,调用是子类的方法。
5.2 多态的实现方式
方式一:重写
在上一篇博客已讲,具体可访问:重写与重载。
方式二:接口
interface Teacher{public void teach();
}class JavaTeacher implements Teacher{String name;int age;public void teach(){System.out.println(name+"在教java课");}}class PHPTeacher implements Teacher{String name;int age;public void teach(){System.out.println(name+"在教PHP课");}}
class Leader{/**考核java老师Teacher t = new PHPTeacher();*/public void check(Teacher t){if(t instanceof JavaTeacher){System.out.println("java老师开始讲课");}if(t instanceof PHPTeacher){System.out.println("PHP老师开始讲课");}t.teach();System.out.println("打分");}}public class TestTeacher10{public static void main(String[] args){//创建一个java老师JavaTeacher jt = new JavaTeacher();jt.name = "亮哥";PHPTeacher pt = new PHPTeacher();pt.name = "龙哥";//创建一个领导对象Leader leader = new Leader();leader.check(jt);System.out.println("---------------------");leader.check(pt);}
}
方式三:抽象类和抽象方法
abstract class Teacher{String name;int age;public abstract void teach();
}class JavaTeacher extends Teacher{public void teach(){System.out.println(name+"在教java课");}}class PHPTeacher extends Teacher{public void teach(){System.out.println(name+"在教PHP课");}}//考核老师
class Leader{/**考核java老师Teacher t = new PHPTeacher();*/public void check(Teacher t){System.out.println("开始讲课");t.teach();System.out.println("打分");}}public class TestTeacher7{public static void main(String[] args){//创建一个java老师JavaTeacher jt = new JavaTeacher();jt.name = "亮哥";PHPTeacher pt = new PHPTeacher();pt.name = "龙哥";//创建一个领导对象Leader leader = new Leader();leader.check(jt);System.out.println("---------------------");leader.check(pt);}
}
注意:t instanceof JavaTeacher判断父类的实际的真身是哪个子类的实例
public void check(Teacher t){if(t instanceof JavaTeacher){System.out.println("java老师开始讲课");}if(t instanceof PHPTeacher){System.out.println("PHP老师开始讲课");}t.teach();System.out.println("打分");}
6. 包
包:就是文件夹
作用:对类做分类管理,可以区分同名不同包的类。
语法:
package 包名(不同级别用“.”来分隔);
,如 package com.rl;, 位置放置文件的有效代码第一行(注释不算), 包的名字一定是英文的小写。
如何编译:
Javac –d . 源文件
7. API的使用
我们学习java编程面对两种类
- 我们自己写的类。
- 用其他人写好的类来使用。
API是把jdk里面提供好的类梳理成了一个文档,方便我们来查阅。
src.zip是jdk的源码
包装类:Integer...