public static void main (String[] args) 详解
public static void main (String[] args) 是Java程序的入口方法,JVM在运行程序时,会先查找 main() 方法。
public 是权限修饰符,表明任何类或对象都可以访问这个方法。
static 表明mian()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main() 直接访问。
void 表明方法没有返回值。
main 是JVM识别的特殊方法名,是程序的入口方法。
字符串数组参数args 为开发人员在命令行状态下与程序交互提供了一种手段。
引申:
(1)main() 方法是否还有其他可用的定义格式?
static public void main (String[] args) —— public 和 static 没有先后顺序
public static final void main (String[] args) —— 可以定义为final
public static synchronized void main (String[] args) —— 可以上同步锁
不管用哪种定义方式,都必须保证 main() 方法的返回值为 void,并有 static 和 public 关键字修饰。同时由于 main() 方法为程序的入口方法,因此不能用 abstract 关键字来修饰。
(2)同一个 .java 文件中是否可以有多个 main() 方法?
虽然每个类中都可以定义 main() 方法,但是只有与文件名相同的用 public 修饰的类中的 main() 方法才能作为整个程序的入口方法。
class T {
public static void main (String[] args) {
System.out.println("T main");
}
}
// 必须是用 public 修饰,且类名与文件名相同的类中的 main() 方法才是入口。
public class Test {
public static void main (String[] args) {
System.out.println("Test main");
}
}
程序运行结果为:
Test main
方法:
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段
public class Demo {
float a;
//实例方法
void sum(float num1,float num2){
a = Max(num1,num2);
}
//类方法
static float Max(float num1,float num2){
//取最大值
return num1 <= num2 ? num2 :num1;
}
public static void main(String[] args) {
Demo demo =new Demo();
demo.sum(22,33); //实例方法必需先初始化类的实例,然后通过类的实例才能调用
Demo.Max(12,9); // 类方法可以直接通过类名调用
}
}
- 一个类中的方法可以互相调用。但要注意:实例方法可以调用该类中的其他方法,例如,sum()可以调用Max()。类方法只能调用其他类方法,不能调用实例方法。
- 类方法又叫静态方法, 实例方法又叫非静态方法。
- 类方法可以直接通过类名调用,实例方法必需先初始化类的实例,然后通过类的实例才能调用
JAVA中的父类与子类
在java中,一个父类可以有多个子类,但是子类只能有一个父类。子类通常通过关键字extends来继承父类。
public class Animal {
int a = 3;
AnimalClass() {
System.out.println("父类无参构造函数");
}
AnimalClass(int i) {
System.out.println("有一个形参i");
}
AnimalClass(int i,int j){
System.out.println("有两个形参i,j");
}
}
class DogClass extends AnimalClass {
int a;
int b;
public DogClass() {
System.out.println("123一起上");
}
public class DogClass(int a) {
this a = a;
System.out.println("456一起上");
}
public AnimalClass() {
super.(3,4);
}
public show() {
System.out.println("show 好!");
}
public static void main(String[] args) {
DogClass sc1 = new Dogclass ();
AnimalClass sc2 = new Animalclass ();
AnimalClass sc3 = new Animalclass (3,4);
}
}
这就是一个简单的父类与子类
implements:
extends 是继承父类,只要那个类不是声明final或者定义为abstract就能继承,Java中不支持多重继承,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了。
class A extends B implements C,D,E(){ //class子类名extends父类名implements接口名
}
覆盖:
一、Java中的方法覆盖
1.方法覆盖又称为方法重写,英语单词:override/overwrite
2.使用:
当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重新编写,这个重新编写的过程称为方法的重写/覆盖
3.满足的条件:
方法的重写发生在具有继承关系的父子类之间
方法名相同返回值类型相同,返回值列表相同(尽量复制粘贴)
访问权限不能更低,可以更高
抛出异常可以更多,可以更少。
4.注意:
私有方法不能继承,所以不能覆盖。
构造方法不能继承,所以不能覆盖。
静态方法不存在覆盖。
覆盖只针对方法,不谈属性。
public class OverrideTest {
public static void main(String[] args) {
Animal a=new Animal();
a.move();
Cat bCat=new Cat();
bCat.move();
Bird bird=new Bird();
bird.move();
}
}
public class Animal {
public void move() {
System.out.println("动物在移动");
}
}
public class Cat extends Animal{
public void move() {
System.out.println("猫在走猫步");
}
}
public class Bird extends Animal{
public void move() {
System.out.println("鸟儿在飞翔");
}
}
java中覆盖和重载的区别
1. 首先搞明白覆盖是什么?
· 举个栗子
public class Main {
public static void main(String[] args) {
new Father().print();
new Son().print();
}
}
class Father{
public void print(){
System.out.println("father");
}
}
class Son extends Father{
@Override
public void print() {
System.out.println("SON");
}
}
·
2.重载是什么?
· 举个栗子
public class Main {
public static void main(String[] args) {
new Test().print();
new Test().print(3);
new Test().print(3,"双参");
}
}
class Test{
public void print(){
System.out.println("无参");
}
public void print(int i){
System.out.println(i+" "+"单参");
}
public void print(int i,String j){
System.out.println(i+" "+j);
}
}
该例子里写了多个print方法,但参数不同,因此可以运行,这也就是重载的含义,一个类中可以有多个同名不同参(参数列表不同)的方法。
final用法:
final关键字代表最终、不可改变的。 常见四种用法: 1. 可以用来修饰一个类 2. 可以用来修饰一个方法 3. 还可以用来修饰一个局部变量 4. 还可以用来修饰一个成员变量
接口:
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法
为什么要用接口
接口被用来描述一种抽象。
因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。
接口也被用来实现解耦。
接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。
接口语法:
java类前使用 private static 类名 对象 = new 类名() 的作用。
举例:这里有一个DButils工具类,专门用来对数据库进行增,删,改,查“”操作。
public class DButils {
public void add() {
System.out.println("对数据库进行add操作");
}
public void update() {
System.out.println("对数据库进行update操作");
}
public void query() {
System.out.println("对数据库进行query操作");
}
public void delete() {
System.out.println("对数据库进行delete操作");
}
}
现在,在Service类中对DButils中的方法进行调用,
public class Service {
private DButils utils = new DButils();
public void methodA() {
utils.add();
utils.query();
}
public void methodB() {
utils.update();
utils.add();
}
public void methodC() {
utils.delete();
utils.add();
}
}
可以看出,在Service类中只创建了一个DButils对象,但却可以在下方的methodA,methodB,methodC方法中进行重多次的调用。
好处:
1、多次调用DButils中的方法,但只需要创建一次对象,因此,大大节省了创建对象所需的内存空间,并且方便调用【在开发中经常使用】
2、private表示私有,在同一类内可见, 因此在其他类中无法直接对该对象进行修改,保证了对象的安全性。