Java学习笔记-基础语法Ⅳ
多态:同一个对象,在不同时刻表现出来的不同形态
例如:
猫 cat = new 猫();
动物 animal = new 猫();
这里的猫在不同时刻表现出来不同的形态,这就是多态
多态的前提和体现:继承/实现方法、方法重写、父类引用指向子类对象
多态访问成员的特点:
- 成员变量:编译看左边,运行看左边
- 成员方法:编译看左边,运行看右边
// Animal类
public class Animal {
public int age = 30;
public void eat(){
System.out.println("动物吃东西");
}
}
// Cat类
public class Cat extends Animal{
public int age = 20;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃东西");
}
public void play(){
System.out.println("猫在玩");
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Animal cat = new Cat();
// 对于变量,编译看左边,运行看左边
System.out.println(cat.age);
cat.age = 50;
// 但是如果在测试类中修改了变量值,那么还是会变化的,这个和方法重写又有点不一样
System.out.println(cat.age);
// System.out.println(cat.weight);
// 对于方法,编译看左边,运行看右边,因为重写了
cat.eat();
// 报错
// cat.play();
}
}
多态的好处:提高程序的扩展性,定义方法的时候使用父类型作为参数,使用时使用具体子类型的内容
// 动物类
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
// Cat类
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
// Dog类
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
// 操作方法
public class AnimalOperator {
/*
public void useAnimal(Cat cat){
cat.eat();
}
public void useAnimal(Dog dog){
dog.eat();
}
*/
public void useAnimal(Animal a){
a.eat();
}
}
public class Demo {
public static void main(String[] args) {
Cat c = new Cat();
AnimalOperator ao = new AnimalOperator();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
}
}
可以看到,使用多态,在写操作方法时,不用再一个个写,而是直接写父类,然后后面根据具体子类的内容进行调用
多态转型,从父类到了子类,并且可以既使用父类变量和方法,也可以使用子类变量和方法
// 父类
public class Animal {
public int age = 10;
public int sex = 20;
public void eat(){
System.out.println("动物吃东西");
}
public void show(){
System.out.println("Hello World!");
}
}
// 子类
public class Cat extends Animal{
public int age = 30;
public int name = 40;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame(){
System.out.println("猫在玩");
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.age);
System.out.println(a.sex);
a.eat();
a.show();
System.out.println("---------");
Cat cc = (Cat)a;
System.out.println(cc.sex);
System.out.println(cc.age);
System.out.println(cc.name);
cc.eat();
cc.playGame();
cc.show();
}
}
Java中,没有方法体的方法应该被定义为抽象方法,类中如果有抽象方法,那么该类必须为抽象类
public void XXX(){System.out.prinln("xxxxx")}
上述方法包含方法声明和方法体
抽象类不能直接创建对象
抽象类的特点:
- 抽象类和抽象方法必须使用abstract关键字修饰
- 抽象类中不一定有抽象方法(吃饱了撑的),有抽象方法的一定是抽象类
- 抽象类不能直接实例化,可以通过子类对象实例化(抽象类多态)
- 抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类
抽象类可以有构造方法
// 动物类
public abstract class Animal {
private int age;
private String name;
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
public Animal() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void eat();
}
// 猫类
public class Cat extends Animal{
public Cat(int age, String name) {
super(age, name);
}
public Cat() {
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Animal cat1 = new Cat();
cat1.setAge(18);
cat1.setName("小猫");
cat1.eat();
Animal cat2 = new Cat(17, "小小猫");
cat2.eat();
}
}
抽象类用自己的话小结:其他的和正常类没什么不同(主要是与接口对比),但是一般来说要有抽象方法
接口:一种公共的规范标准,只要符合规范标准,就都可以用。Java的接口体现在对行为的抽象
public interface 接口名{}
public class 类名 implements 接口名 {}
接口实例化:抽象类多态、接口多态,前提是有继承或者实现关系,有方法重写,且有父(类/接口)引用指向(子/接口)类对象
// 接口
public interface Jumpping {
public abstract void jump();
}
// 实现
public class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("猫跳高");
}
}
// 测试类
public class Demo1 {
public static void main(String[] args) {
Jumpping j = new Cat();
j.jump();
}
}
public abstract class Dog implements Jumpping{
}
public class DogDemo extends Dog{
@Override
public void jump() {
System.out.println("狗跳高");
}
}
public class Demo2 {
public static void main(String[] args) {
Jumpping j = new DogDemo();
j.jump();
}
}
接口的成员特点:
- 成员变量:只能是常量,默认修饰符:public static final
- 构造方法:接口没有构造方法,接口主要对行为进行抽象,其子类默认继承Object类
- 成员方法:只能是抽象方法,默认修饰符:public abstract
下面将使用一个类继承抽象类并且实现接口

// 接口
public interface Inter {
void jumping();
// 验证调用,写在接口中的变量可以调用,但是不可以修改
int sex = 1;
}
// 抽象类
public abstract class Animal {
private String name;
private int age;
// 验证调用
public static int height = 10;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
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 abstract void eat();
}
// 猫类
public class Cat extends Animal implements Inter{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void jumping() {
System.out.println("猫跳高");
}
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.setAge(18);
cat1.setName("加菲");
cat1.eat();
cat1.jumping();
Cat cat2 = new Cat("布偶",16);
System.out.println(cat2.getAge()+" "+cat2.getName());
System.out.println(cat2.sex);
System.out.println(cat2.height);
}
}
类和接口的关系:
- 类和类:继承关系,只能单继承,但不能多继承
- 类和接口:类实现接口,可以单实现,也可以多实现
- 接口和接口:可以单继承,也可以多继承
抽象类和接口的区别:
- 成员区别:接口只有常量和抽象方法,抽象类几乎没什么限制
- 关系区别:接口可以实现多继承
- 设计理念:接口主要是行为上,抽象类主要是对象抽象,包括属性、行为

// 接口
public interface English {
void speak_english();
}
// 人的抽象类
public abstract class Person {
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void eat();
}
// 教练的抽象类
public abstract class Coach extends Person{
public abstract void teach();
public Coach() {
}
public Coach(int age, String name) {
super(age, name);
}
}
// 运动员抽象类
public abstract class Athlete extends Person{
public abstract void study();
public Athlete() {
}
public Athlete(int age, String name) {
super(age, name);
}
}
// 乒乓教练具体类
public class PinPonCoach extends Coach implements English{
public PinPonCoach() {
}
public PinPonCoach(int age, String name) {
super(age, name);
}
@Override
public void teach() {
System.out.println("乒乓教练教评判");
}
@Override
public void eat() {
System.out.println("乒乓教练吃肉");
}
@Override
public void speak_english() {
System.out.println("乒乓教练学英语");
}
}
// 篮球运动员具体类
public class BasketBallAthlete extends Athlete {
public BasketBallAthlete() {
}
public BasketBallAthlete(int age, String name) {
super(age, name);
}
@Override
public void eat() {
System.out.println("篮球运动员吃饭");
}
@Override
public void study() {
System.out.println("篮球运动员学篮球");
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
PinPonCoach pc = new PinPonCoach();
pc.setAge(18);
pc.setName("lll");
System.out.println(pc.getAge()+" "+pc.getName());
pc.speak_english();
pc.eat();
pc.teach();
System.out.println("----------");
BasketBallAthlete bba = new BasketBallAthlete(18,"kkk");
bba.eat();
bba.study();
System.out.println(bba.getAge()+" "+bba.getName());
}
}
接口方法调用(抽象类)
// 接口
public interface Jumping {
void jump();
}
// 操作类
public class JumpOperator {
public void jump(Jumping j){
j.jump();
}
public Jumping getJump(){
Jumping j = new Cat();
return j;
}
}
// 用于接口实例化的猫类
public class Cat implements Jumping{
@Override
public void jump() {
System.out.println("猫跳高");
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
JumpOperator jo = new JumpOperator();
Jumping j = new Cat();
jo.jump(j);
Jumping jump = jo.getJump();
jump.jump();
}
}
内部类:在类中定义一个类
内部类可以直接访问外部类的成员,包括私有,外部类若想访问内部类的成员,必须创建对象
在自己写代码的过程中,还遇到了一点问题,也记录下来
public class Outer {
private static int num = 10;
public static class Inner{
public void show(){
System.out.println("Hello");
System.out.println(num);
}
}
public void method(){
Inner i = new Inner();
i.show();
}
public static void main(String[] args) {
Inner i = new Inner();
i.show();
}
public int x = 1;
public int y = x+2;
// x = x+3;
public int age = 10+x;
Inner i = new Inner();
// 不能直接实例话后调用
// i.show();
}
想在类中直接创建另一个类的对象,然后调用方法,但是报错了,并且这时候试了下对变量进行运算也报错
查了下资料,发现类中只能出现5中内容:
属性、方法、构造方法、块以及内部类
但是初始化默认值时,可以进行一些运算操作(现在不是很懂这样的逻辑,先记录下来)
成员内部类,可以用private修饰,然后通过方法调用,这样外部使用的时候就看不到类中细节
成员内部类
public class Outer {
private int age = 20;
private class Inner{
public void show(){
System.out.println(age);
}
}
public void method(){
Inner i = new Inner();
System.out.println(age);
}
}
public class Demo {
public static void main(String[] args) {
// Outer.Inner oi = new Outer().new Inner();
// oi.show();
Outer o = new Outer();
o.method();
}
}
局部变量前面不加修饰符
方法内部类
public class Outer {
private int age = 18;
public void method(){
// 局部变量不加修饰符
class Inner{
public void show() {
String name = "Hello";
System.out.println(age);
}
}
Inner i = new Inner();
i.show();
}
}
public class Demo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名内部类
public class Outer {
public void show1() {
/*
new Inter(){
@Override
public void show() {
super.show();
// System.out.println("World");
}
}.show();
*/
Inter i = new Inter(){
@Override
public void show() {
super.show();
}
};
i.show();
}
}
public class Inter {
public void show(){
System.out.println("Hello");
}
}
public class Demo {
public static void main(String[] args) {
Outer o = new Outer();
o.show1();
}
}
匿名内部类在实际开发中的应用:
// 接口
public interface Inter {
void jump();
}
// 方法
public class InterImplements {
public void show(Inter i){
i.jump();
}
}
// 测试
public class Demo {
public static void main(String[] args) {
InterImplements ii = new InterImplements();
ii.show(new Inter() {
@Override
public void jump() {
System.out.println("狗跳高");
}
});
}
}
到此,Java学习中的基本编程思想告一段落,下面将是常用API
Java学习笔记-基础语法Ⅳ的更多相关文章
- Java学习笔记-基础语法
Java基础包含关键字,标识符,注释,常量和变量,运算符 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 Java的关键字 用于定义数据类型的关键 ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- Java学习笔记-基础语法Ⅷ-泛型、Map
泛型 泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类.方法和接口中,分别为泛型类.泛型方法 ...
- Java学习笔记-基础语法Ⅴ
学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...
- JAVA 学习笔记 - 基础语法 2
---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null; //在堆栈中申明变量名称 数组名称 = new 数据类型[10]; // ...
- JAVA 学习笔记 - 基础语法1
1. 类的定义 public class 与 class的区别 一个java文件只有一个public class, 而且类名必须与文件名一致. 一个java文件可以有多个class定义,javac ...
- Java学习笔记-基础语法ⅩⅠ-UDP、TCP
网络编程 三要素:IP地址.端口.协议 IP地址:使用ipconfig查看,如果装了VM的话,会有VMnet1.VMnet8和WLAN,net1不能从虚拟机到主机,net8不能从主机到虚拟机,net0 ...
- Java学习笔记-基础语法Ⅸ-文件
File File是文件和路径名的抽象表示,File封装的并不是一个真正存在的文件,是一个路径名,可以存在也可以不存在 常用方法: 创建文件:createNewFile() 创建目录:mkdir() ...
- Java学习笔记-基础语法Ⅶ-集合
集合 集合类特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 这里需要回顾一下,因为数组和字符串一旦创建,就不可改变,需要区分一下 import java.util.ArrayLi ...
随机推荐
- ACL 权限控制机制 ?
UGO(User/Group/Others) 目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式.是一种粗 粒度的文件系统权限控制模式. ACL(Access Control ...
- html实体编码遇上js代码
单双引号 在js代码中 在js中单.双引号引起来的是字符串,如果我们要在字符串中使用单.双引号,需要反斜杠进行转义 let str='user\'s name'; // or let str=&quo ...
- pydev+eclipse写python代码
首先,下载pydev:PyDev for Eclipse - Browse /pydev at SourceForge.net (建议下载到本地,之前看其他文章时,进行了如下安装: 启动 Eclips ...
- Linux磁盘之inode
什么是 inode ? 文件储存在硬盘上,硬盘的最小存储单位叫作"扇区"(Sector).每一个扇区储存512字节(至关于0.5KB).操作系统读取硬盘的时候,不会一个个扇区地读取 ...
- Sql递归查询,Sqlserver、Oracle、PG、Mysql
递归分两种:一种由父项向下级递归,另一种是由子项向上级递归.下面就这两种情况做个简单的处理. 假设有一个表treeview,包含字段 id,parentid,text 分别代表id,上级id,描述字段 ...
- Unity中制作血条2.0
##1.血量显示 不必像之前那样添加Slider组件 直接创建Image 在添加Source Image之后,将Image Type 修改为Filled 通过修改Fill Mode就可以显示不同效果 ...
- python 面试题汇总
1丶元组(list)和列表(tuple)的区别: 一:共同点: ①: 可以放置任意数据类型的有序集合,都是可以存放数字,字符串,对象等. ②:都支持 负索引,切片,随意嵌套等操作 二:不同点: ①: ...
- Edu Cf Round 105 (Div. 2) B. Berland Crossword 1.读懂题, 2. 思维
一. 原题链接 https://codeforces.com/contest/1494/problem/B 二. 题意 + 题解: 没看懂题目, 懵了好久, 先狡辩一下当时误解的句子, 英语是硬伤 ...
- iNeuOS工业互联网操作系统,三维(3D)模型在线编辑应用和实时数据统计(和值、均值、众数、方差、中位数等)
目 录 1. 概述... 1 2. 三维(3D)模型在线编辑与应用... 2 3. 实时数据统计... 4 1. 概述 此次,iNeuOS工业互联网操作系 ...
- 2021.08.01 P4359 伪光滑数(二叉堆)
2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...