今天阿Q给大家来一节大杂烩,讲一下专题性不强的java基础知识。

main方法详解

public static void main(String[] args){} 这里面只有args能改变

  • public 被jvm调用,访问权限足够大
  • static 被jvm调用,不用创建对象,直接类名访问
  • void被jvm调用,不需要给jvm返回值
  • main 一个通用的名称,虽然不是关键字,但是被jvm识别
  • String[] args 用于接收键盘录入

工具类

工具类一般在项目中是经常被使用的类,所以为了方便调用,直接把类里面的方法都写成静态的,直接让类名调用就好了。工具类里面的构造方法被私有,目的是不让外界创建工具类的对象。

//这是一个数组工具类,里面封装了查找数组最大值,打印数组,数组反转的方法
public class ArrayTool {
	//如果一个类中所有的方法都是静态的,需要再多做一步,私有构造方法,目的是不让其他类创建本类对象
	//直接用类名.调用即可
	/**
	私有构造方法
	*/
	private ArrayTool(){}

	/**
	这是获取数组中最大值的方法
	@param arr 接收一个int类型数组
	@return 返回数组中最大值
	*/
	public static int getMax(int[] arr) {
		int max = arr[0];			//记录第一个元素
		for (int i = 1;i < arr.length ;i++ ) {	//从第二个元素开始遍历
			if (max < arr[i]) {		//max与数组中其他的元素比较
				max = arr[i];		//记录住较大的
			}
		}
		return max;				//将最大值返回
	}

	/**
	这是遍历数组的方法
	@param arr 接收一个int类型数组
	*/
	public static void print(int[] arr) {
		for (int i = 0;i < arr.length ;i++ ) {	//遍历数组
			System.out.print(arr[i] + " ");
		}
	}

	/**
	这是数组反转的方法
	@param arr 接收一个int类型数组
	*/
	public static void revArray(int[] arr) {
		for (int i = 0;i < arr.length / 2 ;i++ ) {	//循环次数是元素个数的一半
			/*
			arr[0]与arr[arr.length-1-0]	交换
			arr[1]与arr[arr.length-1-1]	交换
			arr[2]与arr[arr.length-1-2]	交换
			*/
			int temp = arr[i];
			arr[i] = arr[arr.length-1-i];
			arr[arr.length-1-i] = temp;
		}
	}
}

查看API 发现Math这个类是数学运算的工具类,构造方法私有的,里面全是静态的方法。

//Math.random()会生成大于等于0.0并且小于1.0的伪随机数
public static double random(); 

//1-100的随机整数  
(int)(Math.random()*100)+1

final

  • final修饰的类:不能被继承
  • final修饰的方法:不能被重写
  • final修饰的变量是常量: 常量只能被赋值一次

注意:被final修饰的引用型变量,其里面的内容可以改变(也就是地址值不能被改变,对象中的属性可以改变)

常量:分为自面值常量和自定义常量,自面值常量:1;1.0;“abc”;‘a’;自定义常量:就是被final修饰的变量就是自定义常量,自定义常量的命名规则是所有字母都大写,如果是多个单词,中间用 _ 隔开。

class Demo{
		public static void main(String[] args) {

			final int A = 10;
			A = 20;			//被final修饰的变量是常量,只能被赋值一次
	
			final Student S = new Student("张三",23);
			S = new Student("李四");//被final修饰的变量是常量 只能被赋值一次

			final Student S = new Student("张三",23);
			//被final修饰的变量是常量只能被赋值一次,但是S这个地址值所指向的对象里面的内容可以改变
			S.name = "李四";	
			S.age = 14;

			Student s = new Student();
			s.eat();		//被final修饰的方法,可以被子类继承,但是不能被子类重写
		}
	}

	class Person{
		public final void eat(){
			System.out.println("吃吃");
		}
	}

	class Student extends Person{
		String name = "zhangsan" ;
		int age = 10;
 		//对象中的常量,必须显示初始化,或者构造初始化,不能只使用默认初始化,所以这个地方报错
		final int hehe ;
		public Student(){}
		public Student(String name , int age){
			this.name = name;
			this.age = age;
		}
		public void study(){
			System.out.println("学生学习");
		}
	
		public void eat(){		//不能重写父类的eat() 因为父类的eat()被final修饰
			System.out.println("吃吃这是小孩说的 大人得说 吃饭");
		}

	}

抽象类

用abstract这个关键字修饰的类就叫做抽象类,用这个关键字修饰的方法并且不能有方法体就是抽象方法。

  • 抽象类中不一定有抽象方法,但是有抽象方法的类势必是抽象类。
  • 抽象类不能被实例化
class Animal_test{
			public static void main(String[] args){
				Animal a = new Animal();		//报错 因为抽象类不能被实例化
				Animal a1 = new Cat();			//这样可以,这是多态
			}
		}
		abstract class Animal {					//抽象类
			public abstract void eat();			//抽象方法				
		}
		class Cat extends Animal {
			public void eat() {				//子类重写父类的抽象方法
				System.out.println("猫吃鱼");
			}
		}
  • 子类继承抽象类,要么子类是抽象类不用重写父类的抽象方法(因为子类是抽象类嘛),要么子类是非抽象类就必须全部重写父类的抽象方法。
  • 抽象类的成员特点:成员变量可以有变量也可以有常量;有构造方法,是为了给子类继承父类初始化父类用的,成员方法可以是抽象方法,也可以是非抽象方法。
  • abstract不能和哪些关键字共存呢?
    private:private修饰的方法是不能被继承的,所以不能被重写,而abstract强制要求子类重写,矛盾
    final:final表示最终的意思,修饰方法,不能被重写,而abstract强制要求子类重写,矛盾
    static:static是为了让所有对象共享,为了让类名调用,来执行一些方法里面的内容的,而abstract修饰方法是抽象方法 没有方法体, 那让对象共享一个没有方法体的方法没有意义。

接口

接口Interface,类与接口是实现关系类,实现接口用关键字 implements表示,接口中的方法全都是抽象方法,子类(非抽象的类)实现接口,必须全部重写里面的抽象方法。

class Demo1_Interface {
		public static void main(String[] args) {
			//Inter i = new Inter();	//接口不能被实例化,因为调用抽象方法没有意义
			Inter i = new Demo();		//父类引用指向子类对象
			i.print();
		}
	}
	interface Inter {
		public abstract void print();//接口中的方法都是抽象的
		public abstract void method();
	}

	class Demo implements Inter {
		public void print() {			//非抽象的类实现接口,必须全部重写里面的抽象方法
			System.out.println("print");
		}
		public void method(){
			System.out.println("method");
		}
	}
  • 接口中的成员特点
    成员变量: 接口里面的变量全都是常量,因为前面默认都加了 public static final
interface Inter {
	int a;				//报错 因为a是常量 必须显示初始化
	int b =10;			//b也是常量 因为前面有默认修饰符 public static final
}

构造方法:没有构造方法
成员方法:接口里面的方法都是抽象方法,前面都有默认修饰符 public abstract

  • 类与类,类与接口,接口与接口的关系
    类与类:继承关系 ,可以单继承,也可以多层继承,不能多继承
    类与接口:实现关系,可以单实现,也可以多实现
    接口与接口: 继承关系,可以单继承,也可以多继承

案例:

/*

动物类:姓名,年龄,吃饭,睡觉。

猫和狗

动物培训接口:跳高
*/

class Test1_Animal {
		public static void main(String[] args) {
			Cat c = new Cat("加菲",8);
			c.eat();
			c.sleep();

			JumpCat jc = new JumpCat("跳高猫",3);
			jc.eat();
			jc.sleep();
			jc.jump();
		}
	}

abstract class Animal {
	private String name;				//姓名
	private int age;				//年龄

	public Animal() {}				//空参构造

	public Animal(String name,int age) {		//有参构造
		this.name = name;
		this.age = age;
	}

	public void setName(String name) {		//设置姓名
		this.name = name;
	}

	public String getName() {			//获取姓名
		return name;
	}

	public void setAge(int age) {			//设置年龄
		this.age = age;
	}

	public int getAge() {				//获取年龄
		return age;
	}

	public abstract void eat();			//吃饭

	public abstract void sleep();			//睡觉
}

interface Jumping {					//跳高的接口
	public void jump();
}

class Cat extends Animal {
	public Cat() {}					//空参构造

	public Cat(String name,int age) {//有参构造
		super(name,age);
	}

	public void eat() {
		System.out.println("猫吃鱼");
	}

	public void sleep() {
		System.out.println("侧着睡");
	}
}

class JumpCat extends Cat implements Jumping {
	public JumpCat() {}				//空参构造

	public JumpCat(String name,int age) {		//有参构造
		super(name,age);
	}

	public void jump() {
		System.out.println("猫跳高");
	}
}