Day007
作者:互联网
继承 extend
满足什么条件的时候可以继承
凡是 采用 “is a ”能描述的,都可以继承
cat is a animal
子类继承父类之后,能使用子类对象来调用父类方法,因为,子类继承父类之后,这个方法就属于子类了。当然可以使用子类对象来调用。
object
任何一个类,没有显示继承任何类,默认继承object
源代码
文件夹 src src。zip
Java内置一套庞大的类库。可以基于这套庞大的类库来进行二次开发。
开发速度较快,因为jdk内置的这套库实现了很多基础功能。
system | 类名 |
---|---|
out | 静态变量 |
println | 实例方法 |
editplus中蓝色是关键字。黑色是标识符。
红色表示这个类是sun的jdk写好的一个类。
system out println 都是标识符
object 源码
当源码中一个方法以“;”结尾,并修饰符列表中有native关键字
表示底层调用c++写的dll程序(dll 动态链接库文件)
-
已有对象a,想创建一个和a一模一样的对象,可以使用克隆方法,clone
tostring
研究了一下object 中的很多方法,其中有一个tostring方法
如果 System.out.println("引用");
println方法会自动调用引用的tostring()方法。
类名@内存地址经过哈希算法,得出的十六进制结果
方法的覆盖
什么时候考虑使用方法覆盖
子类继承父类之后,有些行为可能面临着必须改进。
因为父类中继承过来的方法,已经无法满足子类的业务需求
这个覆盖叫做:方法重写,英语单词 override overwrite、
方法重载 overload
功能相似的话,建议将名字定义成一样的这样为了代码美观,并且方便编程。
满足方法重载的条件:
-
在同一个类中
-
方法名相同
-
参数列表不同(个数、顺序、类型)
方法重写
最好将父类的方法原封不动复制过来。
方法覆盖,就是将继承过来的方法覆盖掉了。继承过来的方法就没了。
在代码级别上构成了方法覆盖。
-
两个类必须要有继承关系
-
重写后的方法和之前的方法具有相同的返回值 相同的方法名 相同的形式参数列表
-
访问权限不能更低,可以更高
-
重写之后的方法不能比之前的方法抛出更多的异常,可以更少
注意事项
-
方法覆盖只是针对于方法,和属性无关
-
私有方法无法覆盖
-
构造方法不能被继承,所以构造方法也不能被覆盖
-
方法覆盖,只是针对于“实例方法”,静态方法覆盖没有意义
经典案例
public class speak {
public static void main(String[] args) {
Chinese c1=new Chinese();
c1.setName("张俊龙");
American a2=new American();
a2.setName("jack");
c1.Speak();
a2.Speak();
}
}
class People {
private String name;
//构造
public People(){}
public People(String name){
this.name =name;
}
//setter and getter
public void setName(String name)
{this.name = name;}
public String getName(){
return this.name;
}
public void Speak() {
System.out.println(name +"正在说");
}
}
class Chinese extends People{
public void Speak(){
System.out.println( this.getName() + "正在说汉语");
}
}
class American extends People{
public void Speak(){
System.out.println( this.getName() +"is speaking english");
}
}
再研究一下object的toString方法
tostring ()方法的作用的将Java对象转换成字符串的形式
tostring :方法名的意思是转换成string
含义:调用一个Java对象的toString()方法就可以将该Java对象转换成字符串的表示
-
当输出一个引用的时候,println方法会自动调用引用的toString方法
多态
多态的基础语法
Java中允许向上转型也允许向下转型
向上转型
子——》父(自动类型转换)
向下转型
父——》子(强制类型转换 ,需要加强制类型转换符)
-
(* )无论是向上转型还是向下转型,两种类型之间必须有继承关系
没有继承关系,编译器报错
什么是多态
多种形态,多种状态
编译期 叫做静态绑定
运行期 叫做动态绑定
多态的经典代码 :父类型的引用指向子类型的对象(Java中允许这样写)
分析: 先来分析编译阶段:
对于编译器来说,编译器只知道,a2的类型是animal
所以编译器在检查语法的时候,会去animal.class字节码文件中找move方法,找到了,绑定上move()方法,编译通过,静态绑定成功。(编译阶段属于静态绑定)
再来分析运行阶段:
运行阶段的时候,实际上是在堆内存中创建Java对象是cat对象,所以move的时候,真正参与move的对象是一只猫,所以在运行阶段会动态执行cat对象的move方法。这和过程属于运行阶段绑定。
-
多态表示多种形态
编译的时候是一种形态,运行的时候是一种形态。
1、父类型的引用允许指向子类型的对象
-
什么时候必须使用向下转型
当你访问的 子类特有的方法 才需要强制类型转换
-
向下转型有风险
没有继承关系的时候,运行时出现异常,这个异常和空指针异常一样非常重要也非常经典
java.lang.ClassscastException:类型转换异常
java.lang.NullPointerException:空指针异常
新内容 运算符 instanceof
第一:instanceof可以在运行阶段动态判断引用指向对象的类型
第二:instanceof的语法:
(引用 instanceof 类型)
第三: instanceof 运算符的运算结果只能是 true / false
第四: c是一个引用,c变量保存了内存地址指向了堆中对象
(c instanceof Cat)为true
表示 c引用指向 的堆内存中的Java对象是一个cat
为false 不是一个cat
-
程序员要养成一个好习惯:
-
任何时候,任何地点,对类型进行向下转型的时候,一定要使用instanceof 运算符来判断(Java规范中要求的)
多态在开发中的作用(非常重要)
软件开发原则 (这个开发原则属于整个软件业)
其中一条最基本的原则:OCP(开闭原则)
-
对扩展开放,对修改关闭
在软件的扩展过程中,修改的越少越好
不仅仅为了实现客户需求,还需要考虑扩展性
面向父类型编程 面对抽象编程,不建议面对具体编程
多态在开发中的作用
降低程序的耦合度,提高程序的扩展力
封装 继承 多态
解释之前遗留下来的问题
-
方法覆盖需要和多态机制联合起来使用才有意义。
-
多态自然就和对象有关系了。而静态方法执行不需要对象,所以一般来说,我们会说静态方法“不存在”方法覆盖;不讨论静态方法的覆盖。
-
私有方法无法覆盖。
私有不能覆盖,静态不谈覆盖
一般重写时 直接复制粘贴,可以变小返回值,但意义不大
super
super是一个关键字,全部小写
与this 对比:
-
this 能出现在实例方法中和构造方法中。
-
this的语法是“this.”、“this()”
-
this不能使用在静态方法中
-
this。大部分情况下是可以省略的
-
this。什么时候不能省略?在区分局部变量和实例变量的时候不能省略
public void setName(String name){
this.name = name;
}
this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其他的构造方法,目的是:代码复用
super
-
super 能出现在实例方法中和构造方法中。
-
super的语法是“super.”、“super()”
-
super不能使用在静态方法中
-
super。大部分情况下是可以省略的
-
super。什么时候不能省略??????????
-
super() 只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:创建子类对象的时候,先初始化父类型特征
super()
先有父再是子。
建议手动将无参构造写出来
-
-
重要结论: 当一个构造 方法中第一行:既没有this()也没有super()的话
默认会有一个super();
表示通过当前子类的构造方法调用父类的无参构造方法。所以必须要保证父类的无参数构造方法是存在的。
无论是怎么折腾 父类的构造方法都会执行
在java语言中 不管是new什么对象,最后老祖宗的object类的无参数构造 方法一定会执行的
(object的无参数构造一定是最先执行的)处于“栈顶部”后进先出最后调用,最先执行,最先结束
注意:一个类的无参数构造还是建议写出来,不然可能会影响后面子类的创建
super的应用
私有的属性,只能在本类中访问、
super 代表的是“当前对象this的父类型特征”
作用
super (实参)的作用是:初始化当前对象的父类型特征
并不是创建新对象,实际上对象只创建一个。
super 关键字代表的就是“当前对象”的那部分父类特征
super和this 都不能出现在静态方法中。
java中允许子类中出现和父类中的同名变量
super。 什么时候不能省略
如果父类和子类中有同名属性
父中有,子中又有。如果想在子中访问“父的特征。”super。 不能省。
输出“引用”的时候 ,自动调用引用的tostring()方法
-
super不是引用,super也不保存内存地址,super也不指向任何对象
-
只代表当前对象内部的那一块父类型的特征
-
在父和子中有同名的属性,或者说有相同的方法,
-
如果此时想在子类中访问父中的数据,必须使用“super。”加以区分】
super.属性名【访问父类属性 】
super.方法名 (实参)【访问父类的方法】
super(实参)【调用父类的构造方法】
在子类中访问父类私有的数据,你使用super是没有权限的
记住一点 : 私有的只能在本类中访问
一些作业题
输入
java.util.Scanner s = new java.util.Scanner(System.in);
while (ture){
System.out.println("请输入要猜测的数字")
int caicenum = s.nextInt();
//java 中输入
}
、
System.exit(0);
//强行退出jvm
学idea啦啦啦啦啦
进阶了
关于java的集成开发环境
intellij IDEA eclipse
eclipse
workspace ——》project
idea
project ——》 module
IDEA 快捷键
-
关于idea的快捷键和字体设置
快速生成main方法 psvm
快速生成system.out.println(); sout
ctrl + Y 删除一行
代码上的右键——》run 或者点击左侧的绿色箭头 来运行
不需要保存 自动保存
-
右侧的窗口列表展开和关闭 左箭头关,右箭头开,上下箭头移动
-
idea退出任何窗口都可以esc
-
任何新增|新建|添加的快捷键是 alt+insert
-
窗口变大变小 Ctrl shift f12
-
切换左右窗口 alt+左右箭头
-
Ctrl+shift +F10 快捷运行
-
alt + 数字 切换窗口 关闭打开
-
Ctrl + p 查看传什么参数,提示方法参数
-
Ctrl shift +/
-
定位方法、属性、变量
-
光标停到某个单词下面,这个单词可能是:方法名、变量名,停到单词下面之后,按Ctrl键,出现下划线,点击跳转。
-
idea复制一行是Ctrl+d
public class EasyCatulator {
public static void main(String[] args) {
Number a =new Number(50,0);
a.sub();
a.add();
a.chufa();
a.cheng();
}
}
class Number{
private int n1,n2;
public void setN1(int n1) {
this.n1 = n1;
}
public void setN2(int n2) {
this.n2 = n2;
}
public int getN1() {
return n1;
}
public int getN2() {
return n2;
}
public Number(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
public void add(){
int x=getN1()+getN2() ;
System.out.println("加起来"+x);
}
public int sub(){
System.out.println("减法"+(getN1()-getN2()));
return (getN1()-getN2());
}
public void cheng(){
int x = this.n1*this.n2;
System.out.println("乘法"+x);
}
public void chufa (){
if(this.n2==0){
System.out.println("分母不能为0");
}else {
double y = this.n1/n2;
System.out.println("相除的结果是"+y);
}}
}
学完之后多练一练吧,讲真的练的真的太少了
需要多练练,熟悉熟悉软件,以及敲代码
public class vehicle {
public static void main(String[] args) {
car qq = new car();
qq.setSize(19029);
qq.setSpeed(41);
qq.move();
qq.speeddown(10);
qq.move();
qq.speedup(20);
qq.move();
}
}
class chedezhong{
private int speed;
private int size;
public void move(){
System.out.println("这个车正在移动");
System.out.println("现在的速度是"+getSpeed());
}
public int getSpeed() {
return speed;
}
public chedezhong() {
}
public chedezhong(int speed, int size) {
this.speed = speed;
this.size = size;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public void speedup(int a){
setSpeed(getSpeed()+a);
}
public void speeddown(int a){
setSpeed(getSpeed()-a);
}
}
class car extends chedezhong{
public void move(){
System.out.println("小汽车正在乱开");
System.out.println("现在的速度是"+getSpeed());
}
}
java SE
final 关键字
-
final是java语句中的一个关键字
-
final表示最终的,不可变的
-
final可以修饰变量以及方法,还有类等
-
final修饰的变量
final表示最终的最后的,final修饰的类无法被继承
final修饰的方法无法被覆盖,无法被重写
final 修饰的变量,一旦赋值,不能被重新赋值。第一次赋值允许‘只能赋一次值。
标签:int,super,void,println,Day007,方法,public 来源: https://www.cnblogs.com/geren/p/14664709.html