java:面向对象(接口(续),Compareble重写,Comparator接口:比较器的重写,内部类,垃圾回收机制)
接口:
*接口定义:使用interface关键字
* [修饰符] interface 接口名 [extends 父接口1,父接口2...]{
* //常量的声明
* //方法的声明
* }
*接口成员的特点:
*1.接口中所有的成员变量是常量,默认修饰符为public static final
*2.接口中所有的方法都是抽象方法,默认修饰符为:public abstract
*3.接口不能实例化,接口不能构造方法(抽象类不能实例化,但可以有构造方法)
*4.java类是单继承,但接口可以是多继承
*5.一个非抽象类实现实现接口,必须重写接口中的抽象方法,抽象类实现接口可以重写部分抽象方法。
*6.一个类只能继承一个父类,但可以实现多个接口
*7.接口中被重写N次的方法,最后调用,调用的都是最后一次被重写的方法。
*如果一个类继承父类并实现了接口如何编写?
* [修饰符] class 类名 [extends 父类名 implements 接口名1,接口名2..]{
* }
* eg:
* public class E extends D implements A,B{
*
* }
public interface A {
void m1();//public abstract void m();
}
public interface B {
void m2();
}
public interface C extends A,B{
// void m1();//从接口A继承而来
// void m2(); //从接口B继承而来
void m3();
}
public class D {
public void test(){
System.out.println("D类中的test方法.....");
}
}
/**
*因为抽象类中是可以存在抽象方法的,所以一个抽象类实现了接口,可以重写或不重新接口中的抽象方法。
*
*/
public abstract class F implements C{
// public abstract void m1();
// public abstract void m2();
// public abstract void m3();
}
/**
* 该类继承了父类D并实现了接口A和接口B
* 必须实现(重写)接口A和接口B的抽象方法
*
*/
public class E extends D implements A,B{ @Override
public void m2() {
System.out.println("实现了接口B中的m2抽象方法");
} @Override
public void m1() {
System.out.println("实现了接口A中m1抽象方法");
} public static void main(String[] args) {
E e = new E();//类本身进行new
e.m1();
e.m2();
e.test();
System.out.println("-------------------------");
D e2 = new E();//用父类new子类,向上转型,只能访问父类中的test方法
e2.test();
System.out.println("-------------------------");
A e3 = new E();//利用接口A创建实现类,向上转型,只能访问接口A中定义的m1方法
e3.m1();
System.out.println("--------------------------");
B e4 = new E();//利用接口B创建实现类,只能访问接口A中定义的m2方法
e4.m2(); } }
java.lang.Comparable接口:此接口强行对实现它的每个类的对象进行整体排序。
* 排序规则在compareTo()方法中定义。
* 当调用java.util.Arrays类中sort(Object[] objs)时,
* 程序会调用compareTo()方法对对象进行比较,
* 如果该方法返回正整数(1)时,代表当前对象大于待比较对象;
* 如果返回0,代表当前对象等于待比较对象
* 如果该方法返回负整数(-1)时,代表当前对象小于待比较对象;
*实现思路:
*1.实现Comparable接口,并重新其compareTo方法
*2.在compareTo方法中定义比较规则。返回值应该是正整数,零和负整数。
*3.在调用Arrays.sort(Object[] objs)方法的过程中,sort方法的内部对调用compareTo方法进行比较。
public class Student {
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
} }
public class TestArray {
/*
* 按照年龄进行排序,冒泡
* N个数字来排队,两两比较小靠前,
* 外层循环N-1(需要比较的轮数)
* 内存循环N-1-i(每轮需要比较的次数)
*/
public static void sort(Student[] stus){
for(int i=;i<stus.length-;i++){
for(int j=;j<stus.length--i;j++){
//先从学生对象中获取该学生的年龄
if(stus[j].getAge()>stus[j+].getAge()){
//交换位置
Student temp=stus[j];
stus[j]=stus[j+];
stus[j+]=temp;
}
}
}
} public static void main(String[] args) {
Student[] stus = new Student[];//保存学生信息的数组
stus[]=new Student("aa",,);
stus[]=new Student("bb",,);
stus[]=new Student("cc",,);
stus[]=new Student("dd",,);
stus[]=new Student("ee",,);
System.out.println("排序前:");
for (Student student : stus) {
System.out.println(student);
}
sort(stus);//排序
System.out.println("排序后:");
for (Student student : stus) {
System.out.println(student);
}
}
}
Comparable接口:
public class Student implements Comparable{
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
}
/**
* 制定比较规则:
* compareTo(Object o):比较当前对象与指定对象o之间的关系。
* 如果当前对象大于指定对象o返回值是正整数
* 如果当前对象等于指定对象o返回值是零
* 如果当前对象小于指定对象o返回值是负整数
*/
@Override
public int compareTo(Object o) {
Student stu = (Student)o;
// if(age>stu.getAge()){
// return 1;
// }else if(age==stu.getAge()){
// return 0;
// }else{
// return -1;
// }
return (age-stu.getAge());
} }
import java.util.Arrays;
/**
*java.util.Arrays类
*sort(Object[] objs):根据元素的自然顺序对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable接口
*
*/
public class TestArrays {
public static void main(String[] args) {
Student[] stus = new Student[];//保存学生信息的数组
stus[]=new Student("aa",,);
stus[]=new Student("bb",,);
stus[]=new Student("cc",,);
stus[]=new Student("dd",,);
stus[]=new Student("ee",,);
System.out.println("排序前:");
for (Student student : stus) {
System.out.println(student);
}
Arrays.sort(stus);
System.out.println("排序后:");
for (Student student : stus) {
System.out.println(student);
} }
}
Comparator接口:比较器:
import java.util.Comparator;
/**
* java.util.Comparator接口:比较器
* int compare(Object o1, Object o2):比较用来排序的两个参数。
* 根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
*
*/
public class ScoreComparator implements Comparator{ /**
* 定义比较规则:按照分数的降序进行排列
*/
@Override
public int compare(Object o1, Object o2) {
Student stu1=null;
Student stu2=null;
if(o1 instanceof Student){
stu1=(Student)o1;
}
if(o2 instanceof Student){
stu2=(Student)o2;
}
// if(stu1.getScore()>stu2.getScore()){
// return 1;
// }else if(stu1.getScore()==stu2.getScore()){
// return 0;
// }else{
// return -1;
// }
return -(stu1.getScore()-stu2.getScore());
} }
import java.util.Arrays; import cn.zzsxt.oop4.Student;
/**
* java.util.Arrays类
* sort(Object[] objs,Comparator c):按照指定的比较器对指定数组进行排序。
*
*/
public class TestArrays {
public static void main(String[] args) {
Student[] stus = new Student[];//保存学生信息的数组
stus[]=new Student("aa",,);
stus[]=new Student("bb",,);
stus[]=new Student("cc",,);
stus[]=new Student("dd",,);
stus[]=new Student("ee",,);
System.out.println("排序前:");
for (Student student : stus) {
System.out.println(student);
}
Arrays.sort(stus, new ScoreComparator());//利用指定的比较器完成比较
System.out.println("排序后:");
for (Student student : stus) {
System.out.println(student);
} }
}
*内部类:将一个类定义置入另一个类定义中就叫作“内部类”
*特点:
*1.内部类可以访问外部的成员,但外部类不能访问内部的成员。
*2.外部类的修饰符只有两种:public和默认,而内部类的修饰符可以是public,protected,默认,private
*3.内部类成员只有在内部类的范围之内是有效的。
*4.用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
*成员内部类:将一个类作为另外一个类的成员
*内部类的分类:成员内部类,静态内部类,方法内部类,匿名类。
*成员内部类:将一个类作为另外一个类的成员
*静态内部类:使用static修饰的内部类。静态内部只能访问外部的静态成员。
public class Outclass {//外部类
private String name="name";
private int num1=;
public void show1(){
System.out.println("外部方法");
}
public class intclass{//内部类
private int num1=;
public void show(){
System.out.println("内部方法");
System.out.println(num1);
System.out.println(name);//访问外部类的不同名成员
System.out.println(Outclass.this.num1);//访问外部类的同名成员
show1();//访问外部类的方法
}
}
public static void main(String[] args) {
Outclass o=new Outclass();
/*
* 创建内部类的实例:
* 外部类.内部类 对象名 = new 外部类().new 内部类();
*/
Outclass.intclass i=new Outclass().new intclass(); // i.show1(); 不能调用外部类的成员和方法
i.show();
}
}
静态内部类:
/*
*静态内部类:使用static修饰的内部类。静态内部只能访问外部的静态成员。
*
*/
//外部类
public class OuterClass2 {
//外部类的成员
private static String name="zhangsan";
private static int num=;
//外部类的方法
public void outerMethod(){
// System.out.println(a);//外部类不能访问内部类的成员
}
//内部类
public static class InnerClass{
//内部类的成员
private int num=;
private int a=;
//内部类的方法
public void innerMethod(){
System.out.println("OuterClass--->name="+name);//内部类可以访问外部类的成员
System.out.println("OuterClass--->num="+OuterClass2.num);//外部类的成员
System.out.println("InnerClass--->num="+this.num);//内部类的成员
}
} public static void main(String[] args) {
/*
* 创建静态内部类的实例:
* 外部类.内部类 对象名 = new 外部类.内部类();
*/
OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
innerClass.innerMethod(); } }
方法内部类:
1.在方法中定义的内部类。
2.如果该内部类需要访问方法中局部变量,该局部变量前必须加final。
3.方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
//外部类
public class HelloWorld { private String name = "考试课程"; // 外部类中的show方法
public void show() {
// 定义方法内部类
class MInner {
int score = ;
public int getScore() {
return score + ;
}
} // 创建方法内部类的对象
MInner mi = new MInner(); // 调用内部类的方法
int newScore = mi.getScore(); System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
} // 测试方法内部类
public static void main(String[] args) { // 创建外部类的对象 HelloWorld mo = new HelloWorld();
// 调用外部类的方法
mo.show();
}
}
匿名内部类:
/**
* 匿名内部类:没有名称的内部类
* 匿名内部类可以实现一个接口或继承一个父类.
*/
public class TestAnonymous {
public static void main(String[] args) {
//实现一个接口的匿名内部类
/*
* class MyClass implements MyInterface{
* public void test(){
* ..
* }
* }
* MyClass myClass = new MyClass();
* myClass.test();
*/
new MyInterface() {
public void test() {
System.out.println("测试匿名内部的test方法....");
}
}.test();
/*
* 继承的匿名类。
* class MyThread extends Thread{
* public void run(){
* ....
* }
* }
* MyThread myThread = new MyThread();
* myThread.start();
*/
new Thread(){
public void run() {
System.out.println("Thread....run方法...");
}
}.start();
}
}
* GC:
垃圾回收机制,有虚拟机自动调用,程序员无法精确控制。
其开销影响性能,java虚拟机必须跟踪程序中有用的对象,确定哪些无用的。
只回收JVM堆内存里的对象空间
* GC机制的优点:
* 1.提高编程效率,摈弃了C/C++中的指针,避免因遗忘释放内存而导致的内存泄漏。
* 2.保证了程序的完整性。
* GC原理:
JVM中有一个线程专门用于回收堆内存中不使用对象,常用的方法:
* 1.定时扫描堆中不使用的对象
* 2.通过计数控制回收时机。
* 什么数据会被垃圾回收?
* 垃圾回收机制回收的堆内存中的对象信息,不能回收物理连接,数据库连接,输入/输出和Socket。
* 当对象不再使用时推荐将该对象的引用更改null,暗示 垃圾回收器优先处理。
* 建议虚拟机进行垃圾回收的方法:
可以设置为null,暗示GC回收
System.gc()或Runtime.getRunTime().gc();
finalize()在垃圾回收前调用,可以在该方法中编写一些垃圾回收前想做事情的代码。
不建议程序员手工调用,该方法是由JVM自动调用GC
public class Student {
String name;
public Student(String name){
this.name=name;
}
/**
* finalize()在垃圾回收前调用,可以在该方法中编写一些垃圾回收前要做的事情的代码
* 不建议程序员手工调用,该方法是有JVM在垃圾回收前自动调用
*/
@Override
protected void finalize() throws Throwable {
System.out.println("finalize()被调用了");
} }
public class TestGc {
public static void main(String[] args) {
Student stu = new Student("张三");
System.out.println(stu);
stu=null;
//建议垃圾回收器回收垃圾
System.gc();
}
}
java:面向对象(接口(续),Compareble重写,Comparator接口:比较器的重写,内部类,垃圾回收机制)的更多相关文章
- 浅析 Java 与 C++ 的垃圾回收机制
Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
- Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)
笔记: //排序真麻烦!没有C++里的好用又方便!ORZ!ORZ!数组排序还还自己写个TreeSet()和( Comparable接口(自然排序) 或者 Comparator接口 (定制排序))imp ...
- Java精选笔记_面向对象(包、访问控制、内存机制、垃圾回收机制)
包 包的定义与使用 专门用来存放类的,通常功能相同的类存放在相同的包中. 包的声明只能位于Java源文件的第一行 Java语言中的常用包 java.lang:包含Java语言的核心类,如String. ...
- [Java] 理解JVM之三:垃圾回收机制
JVM内存中的各个区域都会回收吗? 首先我们知道 Java 栈和本地方法栈在方法执行完成后对应的栈帧就立刻出栈销毁,两者的回收率可以认为是100%:Java 堆中的对象在没有被引用后,即使用完成后会被 ...
- Java中的引用类型(强引用、弱引用)和垃圾回收
Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...
- 理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆.堆是运行时 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- Java虚拟机垃圾回收机制
在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...
随机推荐
- python+Appium自动化:Appium-desktop界面简介
Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,提供了更加优化的图形界面. Appium Desktop是由Simple.Advanced.Presets三个 ...
- AIDE入侵检测系统
一.AIDE简介 • AIDE(Advanced Intrusion Detection Environment)• 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那 ...
- Android Gradle 常用配置
Gradle:multiDexEnabled之DEX 方法超过64K限制和gradle编译OOM问题解决DEX 方法超过64K限制 UNEXPECTED TOP-LEVEL EXCEPTION: co ...
- Hadoop-No.12之数据采集的时效性
数据采集的时效性,指的是可进行数据采集的时间与Hadoop中工具可访问数量的时间之间的间隔.采集架构的时间分类会对存储媒介和采集方法造成很大的影响. 一般来说,在设计应用的采集构架之前建议使用以下分类 ...
- 对Sting类型的探讨
string类型经常和基本数据类型一起被我们熟练运用,但却不被归为基本数据类型,他是特殊的引用类型.引用数据类型还有类,接口.数组.枚举类型和注解类型. 我们来看下jdk对他的解释: String是在 ...
- C# 计算小数
private void button2_Click(object sender, EventArgs e) { ; List<string> list = new List<str ...
- 2019牛客暑期多校训练营(第二场)D bitset
题意 给一个n个结点的带点权的图,找到第k小的团的权值 分析 用bitset表示团的状态,一个结点必须和团里的每个结点都连边才能加进去,所以可以直接用\(\&\)运算来判断一个结点是否能加进去 ...
- (编程语言+python+变量名+垃圾回收机制)*知识点
编程语言 从低级到高级的发展的过程 1.机器语言 计算机是基于电工作的.(基于高.低电平 1010010101011) 如果用机器语言表现一个字符的意思需要多段代码的行.但是计算机读取的快. 所以机器 ...
- Spring——MyBatis整合
一.xml配置版 1.导入依赖 <!--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.myb ...
- 在Latex中,拉普拉斯算子的小写符号l怎么表示
如下图所示的小写字母l,在Latex中不知道该如何表示,试过用\mathcal但是发现不行,因为\mathcal只支持大写字母. 正确方法: \ell