JAVA学习 2021.6.3 2021.6.4 2021.6.5

学习内容

学生管理系统的制作

创建学生类

创建构造方法和set/get方法的快捷键:alt+insert,或者在类里面右键在这里插入图片描述
然后出现在这里插入图片描述
从上到下分别是:构造方法,get/set方法

switch(){}中的()可以是String类的变量//与c不同。如:

switch(scan.nextLine()){
case 1:..... 
case 2:..
}

退出JAVA虚拟机

System.exit(0);

\t就是输出tab键的位置

System.out.println("请输入需要添加的学生学号:\t");

注意比较字符串最好用.equals方法,“== ”用来比较字符串的话比较的是字符串的地址是否相同。

连续录入

下面代码按理说没有问题,但是实际运行发现setAdress不用输入就自动跳过了,应该是因为nextInt读取到了enter结束了,而enter留在了缓存区导致nextLine读取到了,详细见http://blog.sina.com.cn/s/blog_781d21190100terb.html

		temp.setAge(scan.nextInt());// enter键留在了缓存区
        System.out.println("请输入需要添加的学生地址:");
        temp.setAdress(scan.nextLine());

因此解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。

150 继承

两个类:学生类和老师类,两个类中有很多相同元素,比如姓名与年龄与对应的set/get方法等,也会有一些不一样的地方,那能不能有一种方法可以让学生类和老师类只写其不同的地方呢,相同的地方写在一起不用重复书写了?有,那就是继承:子继承父。
在这里插入图片描述

继承的好处与弊端

在这里插入图片描述

继承中变量的访问特点

打个比方就是:在小地方地头蛇说了算
在这里插入图片描述
其中子类局部范围指的比如是子类的方法里定义的变量。
但是就算同名也可以使用this.xxx来在子类的局部范围内调用子类成员范围的值。

153 super关键字

这是在子类中使用的,测试类中好像无法使用super关键词,如果在测试类中写

 Zi kk = new Zi();
        kk.this.show();
        kk.super.show();

上面第二句和第三句话都报错
在这里插入图片描述

154 继承中构造方法的访问特点

在这里插入图片描述
注意 153表格的第二列super();即可在子类中调用父类的构造方法,如果没有这一句子的构造方法中会默认在第一句写super();

155 继承中成员方法的访问特点

主要是子类和父类中有同名方法需要考虑访问顺序的问题。
在这里插入图片描述
有问题:如果子父类有同名方法,能否直接在测试类中调用父类的同名方法

156 super内存图

参考文章:https://www.cnblogs.com/homle/p/14232803.html,子类中访问父类用到关键词super,在内存中super也在this之中(声明子类时,先申请子类的内存,父类的内存也在子类当中)。

157 方法重写

在这里插入图片描述
小技巧:在子类方法重写中子类的方法名与父类的方法名要相同,否则就不是方法重写了,有两个小技巧可以检测是否是方法重写
在这里插入图片描述
1.在子类的方法重写前写@override,如果不是方法重写override下有红色波浪报错
2.方法重写后在左边会有一个向上的蓝圈圈,点一下就去往同名父类,在父类则有向下的蓝圈,分别指向子类和子类的同名方法在这里插入图片描述

158 方法重写注意事项

在这里插入图片描述
新学:2.原来以前学过的private和public都是访问权限修饰符,如果public和private都不写,那么就是默认的权限。
个人:对1.的理解方法以前学过的关键词private是访问权限修饰符,前面学过当变量权限修饰符为private时候,只有在本类中才能访问和修改(所以才会引入set/get方法),这条原则在子父类中也相似成立:如果在父类中方法的权限为private那么不能重写。

159 Java中继承的注意事项

1.类只能继承一个类不能继承多个类,即只能有一个父类。
2.java中支持多层继承,即儿子-父亲-爷爷.。方法和变量也是支持多层继承的,即儿子可以像使用父亲的方法那样直接使用爷爷的方法。

162 package 包

就是IDEA中创建的那个package,这教一下用记事本怎么创建包和执行

163导包

一个package中的测试类是无法直接调用另一个package中的类,但是可以通过两种方法来直接调用。
例子:方法1Scanner这个类在定义之后IDEA软件会自动帮忙导包,在类名前生成代码:import java.util.Scanner;格式为import 包名.类名导包完成后就可以用了。
方法2:导包后创建写Scanner kk创建变量,没导包可以写java.util.Scanner kk ==...来创建变量。
总结:导包就是为了简化书写。
技巧:按住alt+enter是idea的导包快捷键。比如:如果Scanner不会自动导包,那么写下Scanner … 后按下快捷键即可自动导包。

164 修饰符-权限修饰符

在这里插入图片描述
简而言之:访问权限:public>protected>默认>private。public没有关系都可以访问,protected可以穿包访问,但是必须有血缘关系(是另一个包中的子类,比如a包.父类,b包.子类),默认的不能穿包,private不能穿类(只能在本类中直接访问)。

165 修饰符-状态修饰符

  • final(最终态)
  • static(静态)
    final:可以修饰成员变量,成员方法,类
    方法中:如果父类中的方法使用final修饰,那么表示其是最终方法,在子类中不允许此方法的重写!!
    变量中:如果final修饰变量,那么变量值不允许再修改了,变成常量了。如:
    public final int aa = 10;那么aa就代表10了不能再修改了。
    类中:使用final修饰的类不能当父类了,因为是“最终”类,只可能当儿子,当不了父亲了。

166 final修饰引用类型的变量与基本类型的变量

在这里插入图片描述
对于2,比如:

final Student s = new Student();
s.age = 100;//正常运行
s.age = 20;//正常运行
s = new Student();//报错

static

static是静态的意思,可以修饰成员方法,成员变量(为何没有类,static作用本来就是方便在没有创建对象的情况下调用方法/变量:https://www.cnblogs.com/dolphin0520/p/3799052.html
虽然博文static有很多用法,但是目前视频里就学了static具有共享的功能,如:
在Student类里面定义:static int age;,在下列代码中,修改语句1和修改语句2都会修改全部成员的年龄

public static void main(String[] args) {
        Student.age = 30;//修改语句1
        Student s1 = new Student();
        Student s2 = new Student();

        Student s3 = new Student();
        s3.age = 50;//修改语句2
        System.out.println(s1.age+"     "+s2.age+"     "+s3.age+"     ");
    }

特殊用法:注意修改语句1直接通过类名调用年龄进行修改,而这正是“static”的特点。

168 static访问特点

在这里插入图片描述

169 多态-对象的不同形态

同一个对象,在不同时刻表现出来的不同形态。
在这里插入图片描述
1.实现后面学习
2.父类引用指向子类对象,就比如红字的第二排

170 多态中成员访问特点

在这里插入图片描述

171 多态的好处和弊端

具体案例见171,讲解的很好。个人理解:多态就是定义的父类却申请的子类的空间(父类引用指向子类对象,或者说子类对象赋值给父类引用),好处是这样的话在子类众多时直接调用一个父类的重写方法,却可以调用不同子类的重写方法,这样就可以体现出不同子类的特点。在这里插入图片描述

172 多态的转型

由于多态中创建的父类只能使用父类子类共有的方法,那么调取子类特有的方法呢?这就涉及到了多态的转型。
多态的转型分为向上转型和向下转型两种

  • 向上转型:多态本身就是向上转型过的过程
    使用格式:父类类型 变量名=new 子类类型();
    适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
  • 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
    使用格式:子类类型 变量名=(子类类型) 父类类型的变量;//与格式的强制转换写法相似。
    适用场景:当要使用子类特有功能时。

原文链接:https://blog.csdn.net/qq_41679818/article/details/90523285

173 多态的内存图

175 抽象类

抽象类的由来:比如猫和狗都是具体的类,而动物则应该是一个抽象的概念,是抽象类,在猫和狗中:eat方法都是具体方法,比如吃肉,吃骨头,在动物类中eat也应该是一个抽象的方法(不知道吃什么,怎么吃)。因此引入抽象类:

普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。
那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。

而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
范例:定义一个抽象类

abstract class A{//定义一个抽象类
	
	public void fun(){//普通方法
		System.out.println("存在方法体的方法");
	}
	
	public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
	
}

176 抽象类特点

1 .抽象类和抽象方法都用abstract定义
2.抽象类中可以拥有非抽象方法,甚至可以只有非抽象方法(但是这样毫无意义,一般不这么用)。
3.抽象类不能直接创建对象
根据特点3,抽象类不能直接房间对象,既然抽象类里面可以拥有非抽象方法,那么如何访问到抽象类里面的抽象方法呢?多态!
如Animal为抽象类,内部定义了抽象方法eat和非抽象方法sleep,cat为非抽象类,继承了Animal(注意既然要用继承,那么此时需要用cat重写Animal的抽象方法eat)。那么:

Animal a = new cat();
a.eat();
a.sleep

这样就访问到了抽象类Animal里面的非抽象方法sleep。
4.抽象类的子类要么也是抽象类,要么必须重写全部的抽象方法。因为继承的特点子类会继承父类的方法,要么重写全部抽象方法。如果不重写全部的抽象方法,那么抽象方法继承过来,继承后由于抽象方法必须在抽象类中的特点,必须把子类也定义为抽象类。
由4,抽象方法可以用来限定子类必须完成某些动作。

177 抽象类的成员特点

180 接口

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
Java中的接口更多的体现在对行为的抽象上
在这里插入图片描述

181 接口的成员特点

1.接口中定义的变量不管写不写final默认都用final修饰,即接口中没有“成员变量”,只有常量。而且不只有final,成员变量的默认修饰符是public static final,即可以共享(使用类名直接访问变量)与不可改变变量值两个特点
2.接口没有构造方法,但是在实现接口的类中可以写super();,其实不矛盾,要注意此时接口实现类没有写父类,但是有一个默认的父类Object,super();其实调用的是Object的构造方法
3.接口里面不能有非抽象方法,只能有抽象方法。(与抽象类不同之处(抽象类可以有非抽象方法),注意区别),此时也需要在接口的实现类中重写。
在这里插入图片描述

182 猫和狗

定义猫:public class Cat extends Animal implements Jump 此时在测试类中写:

 Animal kk = new Cat();
    kk.eat();
    Jump k2= new Cat();
    k2.jump();

那么kk只能使用Animal类有的方法eat,k2只能使用Jump接口里面的方法jump。不能都用,如果想多用,那么可以Cat kk =new Cat();。疑问:此时接口不接没什么意义了吗?,因为Cat可以继承Animal的方法(set/get方法没重写,是继承过来的),但是接口里面所有的方法在Cat里面都重写了,那有没有接口不就无所谓了吗?

183 类和接口的关系

在这里插入图片描述
注意:2.接口与继承不同的是接口可以同时实现多个接口。
3.接口可以多继承。

184 抽象类和接口的区别

在这里插入图片描述
注意最后一排的设计理念的区别:抽象类可以抽象“属性”,而接口类一般是行为。比如说:
乒乓球运动员:
抽象类可以分两层:首先乒乓球运动员属于运动员(训练乒乓球方法),运动员属于人(变量:姓名,年龄 方法:吃饭)。
定义接口可以为:参加集训去学习英语口语。
分析的时候从具体到抽象,代码实现从抽象到具体。

542 类名作为行参和返回值

在这里插入图片描述

187 抽象类名作为形参和返回值

与上一条的区别主要是抽象类名不能直接创建对象(不能直接实例化),因此如果是抽象类名作为形参和返回值的话得调用多态的方法。类似于:

Animal a = new Cat();
return a;

在这里插入图片描述

188 接口名作为形参和返回值

与抽象类类似,由于不能直接实例化,所以也需要用多态的形式。
在这里插入图片描述

189 内部类概述

在一个类内部定义另一个类。在一个类A的内部定义一个类B,类B就被称为内部类,类A就被称为外部类。
在这里插入图片描述
在这里插入图片描述
必须创建对象指的是必须创建内部类的对象。

190 内部类-成员内部类

在这里插入图片描述
类的局部位置指的是类的方法里面。
在这里插入图片描述
这种方法使用的特别少,了解即可,因为内部类定义出来大概率是想隐藏内部类的处理过程,不会让你直接生成。如:
在这里插入图片描述
内部类的访问权限直接是private,(注意这写private值得是内部类在外部类内部可以访问到,类比于在外部类写private int i;),因此只能在外部类的内部才能调用,下面写的method方法里面生成了内部类对象,并调用了show();方法,这样就使得内部类无法在测试类中直接访问到,与此同时还可以通过调用外部类的method方法使用内部类的输出结果。

191 内部类-局部内部类

注意是方法内部创建对象,不是类中创建对象。个人:因为局部内部在方法内部定义的,出了方法之后可能就已经在内存中销毁了。
在这里插入图片描述

192 内部类-局部内部类-匿名内部类

在这里插入图片描述
如果是类的话抽象类居多。如果是存在接口写匿名内部类的话,匿名内部类也是写在外部类的方法里面的,不是写在接口里面的,只是此时这个匿名内部类的名字就是接口的名字,其内部也要重写接口里面的方法。
在这里插入图片描述
注意书写格式:new代表这是创建了一个对象对象,只是这个对象没有名字“匿名”,这个对象继承了类或者是实现了接口。同时注意匿名内部类是局部内部类的一种,因此匿名内部类也需要写在类方法内部。 (注意对象不是类,对象不是接口)
在这里插入图片描述
三点需要注意:1.名字与类名或者接口名相同 2.范例是接口类,需要在匿名内部类里面重写接口方法。3.大括号结尾的分号。
对3的说明,有分号感觉很怪,但其实其实不违反以前学的语法,创建对象是本来就是..... = new .....();分号肯定是存在的。
上面图片代码运行之后只是创建对象了,那怎么才能执行里面的show方法呢?方法:因为这么创建了一个类,类想执行方法:类名.方法名();,因此吧最后的分号改为.show()即可执行show方法。
想调用两边怎么办呢?方法:由于new Inter创建了一个对象,猜测这个对象就是Inter类型,在代码前加上Inter i,写作:Inter i = new Inter(){............};,这样以后就可以反复调用啦!

193 匿名内部类在开发中的应用

匿名内部类是一个对象,这个对象继承了类或者是实现了接口。快捷实现接口正是匿名内部类在开发中的作用!!因为如果不用匿名内部类想实现接口还得新创建一个class文件才能实现接口里面方法的重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值