Java基础(三)

1.抽象类

类:现实世界不存在的,人类大脑思考总结的结 果。
对象:是现实世界中存在的。

抽象类无法被实例化:抽象类是类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类,由于类本身是不存在的,所以抽象类无法创建对象。所以,抽象类是用来被子类继承的

  • 抽象类属于引用类型
  • 抽象类无法被实例化,无法创建对象,所以抽象类是用来被子类继承的。
  • 抽象类虽然无法被实例化,但是抽象类有构造方法,这个构造方法是供子类使用的(子类的构造方法第一行默认有个super())
  • final 和 abstruct 不能联合使用,这两个关键字是对立的
  • 抽象类的子类可以是抽象类,也可以是非抽象类
  • 抽象方法:没有方法体,以分号结尾;前面修饰符有abstract关键字
  • 抽象类可以没有抽象方法,但是抽象方法必须出现在抽象类中。
  • 一个非抽象类继承抽象类,必须将抽象类的抽象方法实现(重写/覆盖 );
  • 面向抽象编程
//抽象类
 abstract class Animal{
 	//抽象方法
 	public abstract void move();
 }
 
 //普通类继承抽象类
 class Bird extends Animal{
 	//重写抽象方法
 	public void move(){
 		System.out.println("Bird_Move");
 	}
 }
 
 public class Test{
 	public static void main(String[] args){
 		//能使用多态,向上自动类型转换
 		Animal animal = new Bird();
 		//animal 类型是Animal,Animal是抽象的
 		//父类引用指向子类对象,编译时父类方法,运行时子类方法。
 		animal.move();//out:Bird_Move
 	}
 }

Java语言凡是没有方法体的方法都是抽象方法?
答: 错误,Object类中就有很多方法都没有方法体,以 " ;" 结尾,但他们都不是抽象方法,例如:public native int hashCode(); 这个方法底层调用了C++写的动态链接库程序。native表示调用JVM本地程序。

2.接口

  • 接口属于引用类型,编译以后也是一个.class字节码文件
  • 接口无法被实例化,无法创建对象,所以接口是用来被类实现或被接口继承的。
  • 完全抽象的,可以说是一种特殊的抽象类
  • 当一个非抽象类实现这个接口时,要把接口中的方法全部重写,访问修饰符补全,注意重写方法的规则。
  • 接口间支持多继承,一个类支持多实现
    弥补了单继承带来的缺陷。
  • 接口中所有的元素都是public修饰的
  • 接口中只能有抽象方法和常量

抽象方法:public abstract 修饰的方法
常量:public static final 修饰的变量

  • 抽象方法的public abstract 可以忽略,即:接口中定义的方法实际上都是抽象方法。
  • 常量的public static final可以忽略,即:接口中定义的变量实际上都是常量。
//接口间的多继承
 interface C extends A,B,D,E{
 	//C自己的
 	public static final double PI_1 = 3.14;
 	double PI_2 = 3.15;//省略了 public static final
 	public abstract void test1();
 	void test2();//省略了 public abstract
 	//不用管A,B,D,E
 }

 //一个普通类的多实现
 class X implements A,B,D,E{
 //重写A,B,D,E内的所有方法
 }
 
 //一个抽象类的多实现
 abstract class Y implements A,B,D,E{
 	//不用管A,B,D,E
 }
//接口使用例子
 interface Animal{
 	void move();
 }
 
 //普通类实现接口
 class AnimalImpl1 implements Animal{
 	//重写Animal内的方法
 	public void move(){
 		System.out.println("AnimalImpl_1");
 	}
 }
 
  //普通类实现接口
 class AnimalImpl2 implements Animal{
 	//重写Animal内的方法
 	public void move(){
 		System.out.println("AnimalImpl_2");
 	}
 }
 
 public class Test{
 	public static void main(String[] args){
 		//能使用多态,向上自动类型转换
 		//animal 类型是Animal,Animal是抽象的
 		//父类引用指向子类对象,编译时父类方法,运行时子类方法。
 		Animal animal = new AnimalImpl1();
 		animal.move();//out:AnimalImpl_1
 		
 		animal = new AnimalImpl2();
 		animal.move();//out:AnimalImpl_2
 	}
 }

3.抽象类和接口的区别

  • 抽象类:半抽象;接口:完全抽象
  • 抽象类:有构造方法;接口:没有构造方法
  • 抽象类(类):支持单继承,实现多接口;接口:支持多继承
  • 抽象类:都有;接口:只出现常量和抽象方法

4.final

修饰的类不能被继承
修饰的方法不能被重写
修饰的基础变量只能赋值一次
修饰的引用不能改变指向(被指向的对象内部可以修改)
实例变量必须手动初始化,不能采用系统默认值
final与static一起使用修饰的变量称为常量

5.重载和重写

重载和重写

6.文本编译器下的Package包机制

目的:为了管理更方便
使用:放在Java源代码的第一行

例如 :
com文件夹下的cy文件夹下的emy文件夹下的HelloWorld.java文件

此时类名不再是HelloWorld,类名:com.cy.emy.HelloWorld
在com文件夹编译和运行:
编译:javac -d . HelloWorld.java

  • javac : 负责编译的命令
  • -d : 带包编译
  • . : 代表编译后生成的东西放在当前目录下(" . "代表当前目录)
  • HelloWorld.java :被编译的java文件名

运行:java com.cy.emy.HelloWorld

有包的情况下不能 cd 进入到emy文件夹下去运行 java HelloWorld
会报错:找不到这个类。

如果说类名的时候,带着包名描述,表示完整类名。如果没有带包,表示简类名。

7.import

A类中使用B类
A 和 B在同一包下,不需要import,A 和 B不在同一包下,需要导入。
java.lang.* ;这个包下的类不需要使用import 导入。eg.String.java,System.java,StringBuilder.java…

使用:在package 下 class 上
import 完整类名;eg.import java.util.Scanner;
import 包名. * ; eg.import java.util.* ;

注意:* 只能代表类这一级别,所以,类似 import java. *;,import * ;都是错误的。

8.访问控制权限

访问控制权限

public > protected > default > private

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值