昨天的学习回顾
方法,方法重载
构造,构造方法重载
如何调用构造方法和父类的构造方法(this构造和super构造)
奇特的析构(这析构是继承于Object类的)
何时析构?用C++的话来说就是一块内存丢失,就会调用析构。
某块内存的地址丢失,导致内存泄漏。
protected void finalize() throws Throwable
system.gc(); //立即回收垃圾
继承,全体父类Object还要多了解
对象转换,子类可以存储父类?不太能理解
可能是这样?父类如果存储子类会造成空缺?
而反过来就可以对应上?
猫是动物,动物不是猫;
重写,真*重写
1. 多态基于昨天学的,转换对象的特性,因此,方法也可以根据不同类型的对象,产生不同的结果。称之为多态
实际上:重载子类的方法,也可以称作多态
执行以下代码,我们可以看到,根据构造函数构造的对象不同,所调用的方法也不一样
public class test01 {
public static void main(String[] args) {
c1 test01 = new c2();
test01.function();
c1 test02 = new c1();
test02.function();
}
}
class c1 {
int a = 10;
void function() {
System.out.println(a);
}
}
class c2 extends c1 {
void function() {
System.out.println("this is c2");
}
}
2. Java 包
Java语言规定,一个编译单元中只能有一个public类
且该类名与文件名相同,也就是第一篇时所讲到的
编译后——>每个类生成一个.class——>解释器解释执行
不同类中的方法和变量名不会混淆,唯一要注意的是类名的不同
不同包中类名可以相同,包是用于分隔类的
类是用于分隔方法和变量
包是分隔类的,包可以嵌套
- import导入包
导入scanner和arrys包,然后就可以使用这两个包中的类了
和文件夹路径一样
import java.util.Arrays; import java.util.Scanner; // 导入util下的全部包 import java.util.* // 从util包中导入Data类,直接用到程序中 java.util.Date =new java.util.Date();
静态导入,静态导入后就不用写前缀了
import static java.lang.System.out;;
public class use {
public static void main(String[] args) {
out.println("this is test static");
}
}
2. 类加入包,包的制作与使用
文件夹结构
// 要打包的类
public class test1 {
int number = 0;
public test1(int number) {
this.number = number;
}
public void getNumber() {
System.out.println(number);
}
}
运行,生成类包
注意删除掉test1.java
usepackage.java运行
import test.test1; // 从相对路径导入test1类
public class usepackage {
public static void main(String[] args) {
test1 t1 = new test1(10);
t1.getNumber();
}
}
封装…把方法和变量归结到一块,组成一个类
类变量…类里面的变量
类方法…类里面的方法
值得注意的是静态的,静态方法或变量为一整个类共享
final修饰:让该类失去生育能力,不可再派生子类,也称为终极类
也有终极变量(常量const),终极方法(不可重写)
就是c++中的虚基类
基类和方法都是给后续继承做准备
如果继承这个类,必须重写方法,或者照父类,只声明
public abstract class c1{
public void function(){
// 这是抽象方法
}
//这就是一个抽象类
}
4. 接口
由于java不支持多重继承,所以,有了接口这个东西
不过多重继承哪个东西确实花,烧脑汁
-
接口的定义
定义和类没两样,但是要注意,方法不能实现,变量必须初始化,且为常量
public class classname extends fathername{}
public interface interfacename extends fathername{} -
接口的使用
同样,接口也需要实现,但不同的是,一个类可以继承多个接口,实现了多继承
实现接口的类,必须实现接口中所有抽象方法
public class usepackage {
public static void main(String[] args) {
c1 test01 = new c1();
test01.function();
}
}
// implements 后面跟接口名,可以多个
class c1 implements i1 {
@Override
public void function() {
System.out.println("this is i1 function");
}
}
// 接口中的方法默认就是抽象的
interface i1 {
public void function();
}
5. 内部类
在一个文件中写几个类,运行后就会生成多少个.class文件,这就使得项目架构复杂
内部类可以访问外部类所有成员,包括私有权限
public class usepackage {
int num = 10;
public static void main(String[] args) {
c2 test1 = new c2();
test1.print();
}
}
class c2 {
int num = 10;
c1 test01 = new c1();
// print方法调用内部类方法
public void print() {
test01.function();
}
// 这就是内部类,可以为抽象类型,可以是接口类型
public class c1 {
public void function() {
System.out.println("this is inner class");
System.out.println("一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量" + num);
}
}
}
匿名类
一个局部类只需要使用一次的时候
由于匿名类没有类名,那么除了定义它的地方,其他地方无法调用,所以匿名类也可以叫匿名内部类
这匿名类我咋越看越像继承多态?就是一个类不确定它是子类还是父类,给他不同的参数,执行不同操作
包装类
java面向对象,方法参数也都是对象,基本数据类型却不是“对象”
所以提供了拆箱和装箱,也就是对象和基本类型的互转
java有着自动拆装箱功能
遇到运算符号,就拆箱
当遇到对象运算,对象列表,装箱



