概述
JAVA学习笔记
- 学习内容
- 学生管理系统的制作
- 创建学生类
- 连续录入
- 150 继承
- 继承的好处与弊端
- 继承中变量的访问特点
- 153 super关键字
- 154 继承中构造方法的访问特点
- 155 继承中成员方法的访问特点
- 156 super内存图
- 157 方法重写
- 158 方法重写注意事项
- 159 Java中继承的注意事项
- 162 package 包
- 163导包
- 164 修饰符-权限修饰符
- 165 修饰符-状态修饰符
- 166 final修饰引用类型的变量与基本类型的变量
- static
- 168 static访问特点
- 169 多态-对象的不同形态
- 170 多态中成员访问特点
- 171 多态的好处和弊端
- 172 多态的转型
- 173 多态的内存图
- 175 抽象类
- 176 抽象类特点
- 177 抽象类的成员特点
- 180 接口
- 181 接口的成员特点
- 182 猫和狗
- 183 类和接口的关系
- 184 抽象类和接口的区别
- 542 类名作为行参和返回值
- 187 抽象类名作为形参和返回值
- 188 接口名作为形参和返回值
- 189 内部类概述
- 190 内部类-成员内部类
- 191 内部类-局部内部类
- 192 内部类-局部内部类-匿名内部类
- 193 匿名内部类在开发中的应用
学习内容
学生管理系统的制作
创建学生类
创建构造方法和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文件才能实现接口里面方法的重写。
最后
以上就是舒心斑马为你收集整理的JAVA学习 2021.6.3 2021.6.4 2021.6.5学习内容的全部内容,希望文章能够帮你解决JAVA学习 2021.6.3 2021.6.4 2021.6.5学习内容所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复