第二章 类与继承
目录
一、基本语法
基础语法
//关键词:
对象:事物的数据化
类:属性和方法
继承:extends
对象:(对象名存储的是对象的引用地址;对象是事物的数据化,有属性和方法)
类名 对象名 = new 类名;
类:
public class 类名{
//属性的语法
权限修饰符 类名 属性名;
//方法的语法
权限修饰符 返回数据类型 函数名(输入数据类型 输入数据形参){
//函数主体
}
}
继承
public class 子类名称 extends 父类名称{}
重载(类底下的重名方法)
重写是只在同一个类里面存在相同的函数名称的情况
对于这种情况来说,唯一的要求就是,要求输入的值的形式不同
这样程序才能根据输入的参数的形式来调用正确的函数方法
二、权限修饰符:public、private、protected、default
在前面的基础语法中,我们发现无论是对于类里面的属性还是方法前面,Java都设计了一个权限修饰符,这个权限修饰符控制了怎么操作可以使用相关的变量和函数,怎么样的情况下不能调用到相应的属性和函数。为了方便回忆和理解,本篇文章将会按照一些详细的特征和情况进行描述而不是选择列出所有的情况,没有重点的进行阐述。
类内:你看到的一个程序里面
包内:和你的当前程序并肩的程序们
public、private和default(一般什么都不写)
情况 | 控制修饰符 |
---|---|
类内 | 都能够调用到(相当于你自己对于自己完全开放) |
包内 | 除了private其他都可以 |
public | 都可以,相当于是接口,但是记得包外的时候需要import一下 |
private | 只能在类内使用 |
default | 在包内都是可以的,其他不行 |
protected具体就四条规则
- 包内都能
- 包外可以通过子类继承得到调用
- 包外直接利用父类调用不能
- 加上static之后都能
一张图片直观的给你们总结一下
//关于为什么那个protected是粉红色的问题,参照上方文字说明,因为protected非常的调皮~
三、继承和强制转换
继承
继承和可以直接调用的区别
子类继承了父类所有的东西,但是因为父类设置了权限,所以子类不一定可以都直接进行调用
子类可以通过一些函数进行访问
这些函数就可以聪明的控制自己可以干的事情,保留了父类的权威
重写
//关键词
子类重写后覆盖
可用@Override来看是不是成功重写(函数名字输出错误会报错嗷)
!!! 你的Override会告诉你, 函数名 & 输入类型 都需要 一 致!!!
下面用代码来演示一下重写,省略报错的版本哈,自己动手试试就知道了
(我们这里让子类和父类在一个包里面,方便书写)
父类:
package com.cjx0929;
public class Student {
public String name;
private String adr;
protected int age;
int id;
//获得地址
public void get_adr() {
System.out.println(this.adr);
}
//根据学习时间返回学习效率
public int learning_rate(int time) {
if(time<20) {
System.out.println("这是父类的方法");
return 60;
}
else if(time<80) {
return 75;
}
else {return 100;}
}
}
子类:(展示的只是重写后的代码,这个时候的学习率函数已经发生了改变)
package com.cjx0929;
public class UNStudent extends Student{
//重写方法
@Override
public int learning_rate(int time) {
if(time<50) {
System.out.println("这是子类的方法!");
return 78;}
else if(time<80) {return 90;}
else {return 100;}
}
//主程序调用
public static void main(String[] args){
UNStudent Alice = new UNStudent();
Alice.name = "Alice";
Alice.age = 23;
Alice.id = 81021904;
System.out.println(Alice.learning_rate(15));
}
}
在子类重写前和重写后的两个输出:
这是父类的方法
60
这是子类的方法!
78
强制转换
我们先来看一个强制转换的实例
int i= (int)1.2;
可以看到,我们把1.2从一个浮点数转换成为了一个int,不过这样是不安全的
再来看一个例子
Student Bob = new UNStudent();
我们在上面的主程序中加入这些语句,运行一下看看
Student Bob = new UNStudent();
System.out.println(Bob.learning_rate(15));
System.out.println(Bob);
输出
这是子类的方法!
78
com.cjx0929.UNStudent@5594a1b5
可以看到,虽然我们给Bob的是Student类,但是实质上Bob在做的是UNStudent的事情
下面我们给UNstudent添加一个新的方法试一试,还是加入到上面第二块代码里面
//探究用眼时长和近视可能性的关系,时长是每天的市场,看近距离的事物叫做用眼
public double myopia_proba(int time)
{
if(time<6) {return 0.3;}
else if(time<8) {return 0.7;}
else {return 0.95;}
}
给主程序加入相应代码调用
Bob.myopia_proba(12);
结果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method myopia_proba(int) is undefined for the type Student
at Shapes/com.cjx0929.UNStudent.main(UNStudent.java:28)
证明Bob虽然是在计算机中识别类型是大学生子类,但是他并不能调用里面的全部方法
因为我们在创建的时候,认为他是Student类
下面我们看看Alice的调用和结果:
>>>System.out.println(Alice.myopia_proba(9));
>>>0.95
这说明,子类可以披上父类的皮(但是父类不能披上子类的),但是一旦被认定为父类类型后,子类将无法使用自己的差异于父类的方法,但是重写的方法,子类还是自己调用自己的
简单来说就是,因为类型转化,子类还是子类,但是因为父类的皮,再也没有办法去向大家展示,自己有但是父类没有的东西了,不过在做一些共同有的事情的时候,子类还是毅然决然的使用了自己的方式。