随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。 用abstract关键字来修饰一个类,这个类叫做抽象类。 用abstract来修饰一个方法,该方法叫做抽象方法。 以下代码中的Person类是一个抽象类 ① 非匿名的类非匿名的对象 ② 非匿名的类匿名的对象 ③ 匿名子类的对象 ④ 匿名子类的匿名对象 即使子类的父类是具体的,这个子类也可以是抽象的。 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类 关于构造器与静态方法的代码如下: 输出结果: 接口是一种与类相似的结构,它在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个”是不是”的关系,而接口实现则是 “能不能”的关系。 定义Java类的语法格式:先写extends,后写implements 除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法 输出结果: 输出结果: 题目: 输出结果: 分类: java局部内部类就是在方法中定义的类,它仅在该方法中有效。 匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。 注意 输出结果:目录
一 .抽象类
1. 介绍
1.1基本用法
比如:abstract class A{ }
public abstract void talk();
1.2 抽象类的匿名子类
Worker worker = new Worker(); method1(worker);//非匿名的类非匿名的对象
method1(new Worker());
Person p = new Person(){//Person是一个抽象类,不能实例化,这儿运用了多态的性质 @Override public void eat() { System.out.println("吃东西"); } }; method1(p);
method1(new Person(){ @Override public void eat() { System.out.println("吃好吃东西"); } });
2. 注意事项
Person p = new Student("John");
型。因此,下面的语句创建一个元素是 CeometricObject 类型的数组是正确的:GeometricObject[] objects = new CeometricObject[10];
然后可以创建一个 CeometricObject 的实例,并将它的引用陚值给数组,如下所示:
objects[0] =new Circle();
abstract class AbstractClass{ /** * 输出 */ abstract void print(); /** * */ public AbstractClass() {//抽象类中可以定义构造器,虽然不能初始化,可以被子类继承 System.out.println("abstract class"); } public static void staticAbstractMethod() { System.out.println("I am static method"); } } /** * @author sir */ public class AbstractClassTest extends AbstractClass{ public AbstractClassTest() { System.out.println("子类构造器"); } @Override void print() { System.out.println("test"); } public static void main(String[] args) { AbstractClassTest.staticAbstractMethod();//抽象类中可以定义静态方法,可直接由类名调用 AbstractClass.staticAbstractMethod(); new AbstractClassTest().print(); } }
二. 接口
1.介绍
1.1 基本用法
语法:修饰符 interface 接口名 { /** 常量声明 */ /** 方法签名 */ }
class SubClass extends SuperClass implements InterfaceA{ }
格式:class AA extends BB implements CC,DD,EE
1.2接口和抽象类之间的对比
接口示例:
public class USBTest { public static void main(String[] args) { Computer computer = new Computer(); //1.创建了接口的非匿名实现类的非匿名对象 Flash flash = new Flash(); computer.transferData(flash); //2. 创建了接口的非匿名实现类的匿名对象 computer.transferData(new Printer()); //3. 创建了接口的匿名实现类的非匿名对象 USB phone = new USB(){ @Override public void start() { System.out.println("手机开始工作"); } @Override public void stop() { System.out.println("手机结束工作"); } }; computer.transferData(phone); //4. 创建了接口的匿名实现类的匿名对象 computer.transferData(new USB(){ @Override public void start() { System.out.println("mp3开始工作"); } @Override public void stop() { System.out.println("mp3结束工作"); } }); } } class Computer{ public void transferData(USB usb){//USB usb = new Flash(); usb.start(); System.out.println("具体传输数据的细节"); usb.stop(); } } interface USB{ //常量:定义了长、宽、最大最小的传输速度等 void start(); void stop(); } class Flash implements USB{ @Override public void start() { System.out.println("U盘开启工作"); } @Override public void stop() { System.out.println("U盘结束工作"); } } class Printer implements USB{ @Override public void start() { System.out.println("打印机开启工作"); } @Override public void stop() { System.out.println("打印机结束工作"); } }
1.3JDK8接口新特性
Java 8中,你可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念。
public interface CompareA { //静态方法 public static void method1(){ System.out.println("CompareA:北京"); } //默认方法 public default void method2(){ System.out.println("CompareA:上海"); } default void method3(){ System.out.println("CompareA:上海"); } } ********************************************** public interface CompareB { default void method3(){ System.out.println("CompareB:上海"); } } public class SuperClass { public void method3(){ System.out.println("SuperClass:北京"); } } ********************************************** public class SubClassTest { public static void main(String[] args) { SubClass s = new SubClass(); // s.method1(); // SubClass.method1(); //知识点1:接口中定义的静态方法,只能通过接口来调用。 CompareA.method1(); //知识点2:通过实现类的对象,可以调用接口中的默认方法。 //如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法 s.method2(); //知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法, //那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-->类优先原则 //知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法, //那么在实现类没有重写此方法的情况下,报错。-->接口冲突。 //这就需要我们必须在实现类中重写此方法 s.method3(); } } ************************************************************* class SubClass extends SuperClass implements CompareA,CompareB{ public void method2(){ System.out.println("SubClass:上海"); } public void method3(){ System.out.println("SubClass:深圳"); } //知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法 public void myMethod(){ method3();//调用自己定义的重写的方法 super.method3();//调用的是父类中声明的 //调用接口中的默认方法 CompareA.super.method3(); CompareB.super.method3(); } }
2. Comparable接口
2.1 用法
import java.util.Date; /** * @author mazouri * @create 2020-04-12 17:40 */ public class CompareTest { public static void main(String[] args) { System.out.println((new Integer(3).compareTo(new Integer(5)))); // System.out.println((Integer.compare(3, 5)));当然可以用这个更好的方法 System.out.println("ABC".compareTo("ABE")); Date date1 = new Date(1990, 1, 1); Date date2 = new Date(1989, 6, 4); System.out.println(date1.compareTo(date2)); } }
2.2 自定义实现Comparable的类进行比较
定义一个接口用来实现两个对象的比较。 interface CompareObject{ public int
compareTo(Object o);
//若返回值是 0 , 代表相等; 若为正数,代表当 前对象大;负数代表当前对象小 }
定义一个Circle类,声明width,height属性,提供getter和setter方法
定义一个ComparableRectangle.类,继承Rectangle类并且实现CompareObject接口。在
ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个长方形面积大小。
定义一个测试类ComparableRectangleTest,创建两个ComparableRectangle对象,调用compareTo 方法比较两个类的面积大小。public interface CompareObject<C extends Rectangle> { /** * @return 若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小 */ int compareTo(Object o); } ****************************************************************** public class Rectangle { private double width; private double height; public Rectangle() { } public Rectangle(double width, double height) { this.width = width; this.height = height; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getArea() { return height * width; } } ****************************************************************** public class ComparableRectangle extends Rectangle implements CompareObject { public ComparableRectangle() { } public ComparableRectangle(double width, double height) { super(width, height); } @Override public int compareTo(Object o) { if (this == o) { return 0; } if (o instanceof ComparableRectangle) { ComparableRectangle c = (ComparableRectangle) o; // return Double.compare(getArea(), c.getArea()); if (getArea() > c.getArea()) { return 1; } else if (getArea() < c.getArea()) { return -1; } else { return 0; } } else { throw new RuntimeException("传入的数据类型不匹配"); } } } ****************************************************************** public class ComparableRectangleTest { public static void main(String[] args) { ComparableRectangle c1 = new ComparableRectangle(2.2, 3.4); ComparableRectangle c2 = new ComparableRectangle(2.3, 3.4); int compareValue = c1.compareTo(c2); if (compareValue > 0) { System.out.println("c1对象大"); } else if (compareValue < 0) { System.out.println("c2对象大"); } else { System.out.println("c1与c2一样大"); } } }
三. 内部类
1. 介绍
① 成员内部类(static成员内部类和非static成员内部类)
② 局部内部类(不谈修饰符)、匿名内部类
2.局部内部类
2.1 基本用法
class 外部类{ 方法(){ class 局部内部类{ } } { class 局部内部类{ } } }
2.2 如何使用局部内部类:
2.3 局部内部类的特点
3.匿名内部类
3.1 基本用法
格式:new 父类构造器(实参列表)实现接口(){ //匿名内部类的类体部分 }
interface A{ public abstract void fun1(); } public class Outer{ public static void main(String[] args) { new Outer().callInner(new A(){ //接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名 public void fun1() { System.out.println(“implement for fun1"); } });// 两步写成一步了 } public void callInner(A a) { a.fun1(); } }
3.2匿名内部类的特点
4.成员内部类
4.1 成员内部类作为类的成员的角色:
4.2 成员内部类作为类的角色:
public class InnerClassTest { public static void main(String[] args) { //创建Dog实例(静态的成员内部类): Person.Dog dog = new Person.Dog(); dog.show(); //创建Bird实例(非静态的成员内部类): // Person.Bird bird = new Person.Bird();//错误的 Person p = new Person(); Person.Bird bird = p.new Bird(); bird.sing(); System.out.println(); bird.display("黄鹂"); } } class Person{ String name = "小明"; int age; public void eat(){ System.out.println("人:吃饭"); } //静态成员内部类 static class Dog{ String name; int age; public void show(){ System.out.println("卡拉是条狗"); // eat(); } } //非静态成员内部类 class Bird{ String name = "杜鹃"; public Bird(){ } public void sing(){ System.out.println("我是一只小小鸟"); Person.this.eat();//调用外部类的非静态属性 eat(); System.out.println(age); } public void display(String name){ System.out.println(name);//方法的形参 System.out.println(this.name);//内部类的属性 System.out.println(Person.this.name);//外部类的属性 } } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算