Java学习笔记-基础语法Ⅲ
继承:子类使用extends来继承父类,子类可以有父类的内容,还可以有子类自己特有的内容
继承的好处:
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承的弊端:
- 继承让类的耦合性增强了,父类发生变化时,子类页发生变化,削弱子类的独立性
继承中变量访问特点:
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 都没有就报错
// 父类
public class Fu {
public int age = 30;
}
// 子类
public class Zi extends Fu{
public String name = "kkk";
public int age = 40;
public void show(){
// age = 50;
System.out.println(name+age);
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
super关键字的用法和this关键字的用法相似:
- this代表本类对象的引用
- super代表父类存储空间的标识,可以理解为父类对象引用
父类构造方法不会被继承,构造方法是用来初始化对象的
构造方法前面是不能加void之类的返回值,加了就不是构造方法,系统会识别成普通方法
子类所有构造方法都会默认访问父类中无参的构造方法
子类会继承父类中的数据,还可能使用父类的数据,所有子类初始化之前会完成父类的初始化,每个子类构造方法的第一条语句默认都是super()
// 父类
public class Fu {
// 注意,这里的无参构造方法如果不写,那么子类不能直接super(),或者无法直接继承父类的无参构造方法
public Fu(){
System.out.println("父中无参构造方法被调用");
}
public Fu(int age){
System.out.println("父中带参构造方法被调用");
}
}
// 子类
public class Zi extends Fu{
public Zi(){
// super();
// 要么调用父类无参构造方法,要么调用父类带参构造方法
// 只能调用其中一个,多了会报错
super(30);
System.out.println("子中无参构造方法被调用");
}
public Zi(int age){
System.out.println("子中带参构造方法被调用");
}
}
// 测试类
public class Super_Demo {
public static void main(String[] args) {
Zi z1 = new Zi();
Zi z2 = new Zi(30);
}
}
// 结果
父中带参构造方法被调用
子中无参构造方法被调用
父中无参构造方法被调用
子中带参构造方法被调用
方法重写:子类中出现了和父类中一模一样的方法声明
@Override
可以帮助检查方法重写
Java有四种访问权限
同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 | |
---|---|---|---|---|
Private | √ | |||
√ | √ | |||
Protected | √ | √ | √ | |
Public | √ | √ | √ | √ |
方法重写的时候要注意,私有方法不能被重写,且子类方法访问权限不能更低,public>protected>默认>private
Java支持多层继承,但不支持多继承
包,其实就是文件夹,作用是对类进行分类管理,格式为
- package 包名;
- package 一级包.二级包;
要弄清楚四种访问权限的话,需要耐心把代码敲一遍
// 注意这里的包,demo1下有Fu、Zi、Demo三个Java文件
package demo1;
public class Fu {
private void show1(){
System.out.println("private 方法可以被调用");
}
void show2(){
System.out.println("默认的方法可以被调用");
}
protected void show3(){
System.out.println("protected 方法可以被调用");
}
public void show4(){
System.out.println("public 方法可以被调用");
}
public static void main(String[] args) {
Fu d1 = new Fu();
d1.show1();
d1.show2();
d1.show3();
d1.show4();
}
}
// 这里的意思是同一个类下,四种访问权限的方法都可以访问
// 还是demo1的包,Zi继承Fu,现在不能调用private修饰的方法了
package demo1;
public class Zi extends Fu{
public static void main(String[] args) {
Fu f = new Fu();
f.show2();
f.show3();
f.show4();
}
}
package demo1;
public class Demo {
public static void main(String[] args) {
Fu f = new Fu();
f.show4();
f.show3();
f.show2();
}
}
// 这里表示,只要是同一个包下,继承不继承,都是可以调用除private权限外的3种访问权限
现在到别的包下,看看访问权限
package demo2;
import demo1.Fu;
public class Zi extends Fu {
public static void main(String[] args) {
Zi z = new Zi();
z.show3();
z.show4();
Fu f = new Fu();
f.show4();
}
}
// 其他包下,继承关系,只能调用public和protected
// 没有关系的对象,只能调用public
package demo2;
import demo1.Fu;
public class Demo {
public static void main(String[] args) {
Fu f = new Fu();
f.show4();
}
}
这上面是黑马视频讲的内容,但是可能读者还有疑问,如果是不同包下,进行多层继承呢?也就是如果demo2
下的包继承demo1
中的Zi
,又是什么情况呢?
package demo2;
import demo1.Zi;
public class zz extends Zi {
public static void main(String[] args) {
zz zz2 = new zz();
zz2.show3();
zz2.show4();
}
}
// 结果还是只有protected和public两种权限
修饰符final
final可以修饰成员方法,成员变量,类
final修饰的特点,对方法则不能被重写,对变量则不能被再次赋值,对类则不能被继承
对于变量,final修饰基本类型时数据值不能改变,修饰引用类型的地址值不能改变,但是地址里面的值可以改变
// java类
public class Student {
public int age;
public String name;
public void show(){
System.out.println(age+name);
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
final int age = 20;
// final修饰基本数据类型,其值不能改变
// age = 30;
System.out.println(age);
final Student s = new Student();
s.age = 40;
s.show();
s.age = 50;
s.show();
}
}
static
修饰符修饰成员方法、成员变量
static
修饰的对象共享
// 学生类
public class Student {
public int age;
public String name;
public static String school;
public void show(){
System.out.println(name+", "+age+", "+school);
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Student s1 = new Student();
// Student.school = "浙江大学";
s1.age = 18;
s1.name = "林青霞";
s1.school = "浙江大学";
s1.show();
Student s2 = new Student();
s2.age = 28;
s2.name = "张曼玉";
s2.show();
s2.school = "华科";
s2.show();
s1.show();
}
}
林青霞, 18, 浙江大学
张曼玉, 28, 浙江大学
张曼玉, 28, 华科
林青霞, 18, 华科
static修饰的变量,推荐使用类名调用,也可以使用对象名调用
静态的只能调用静态的,非静态的都可以进行调用
public class Demo {
public String name;
public static String age;
// 非静态
public void show1(){}
// 静态
public static void show2(){}
// 非静态的都能调用
public void show3(){
System.out.println(name);
System.out.println(age);
show1();
show2();
}
// 静态的只能调用静态的
public static void show4(){
System.out.println(name);
System.out.println(age);
show1();
show2();
}
public static void main(String[] args) {
Demo de = new Demo();
de.show3();
de.show4();
}
}
Java学习笔记-基础语法Ⅲ的更多相关文章
- Java学习笔记-基础语法Ⅳ
多态:同一个对象,在不同时刻表现出来的不同形态 例如: 猫 cat = new 猫(); 动物 animal = new 猫(); 这里的猫在不同时刻表现出来不同的形态,这就是多态 多态的前提和体现: ...
- 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 ...
随机推荐
- elasticsearch 了解多少,说说你们公司 es 的集群架构,索 引数据大小,分片有多少,以及一些调优手段 。
面试官:想了解应聘者之前公司接触的 ES 使用场景.规模,有没有做过比较大 规模的索引设计.规划.调优. 解答: 如实结合自己的实践场景回答即可. 比如:ES 集群架构 13 个节点,索引根据通道不同 ...
- 利用事件的冒泡特性,为子标签添加Onclick事件
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Cadence 错误合集
1.原理图DRC出现如下错误"Duplicate Pin Name "GND" found on Packag" 解决方案:原因是元件引脚重复定义,可以进行重新 ...
- UP9616移动电源快充案例
第一版的UP9616快充(地址在此 ),从选料到线路板的布局走线都还算不错,实现了当初定下的设计目标,但也有一点小小的遗憾,就是在输出滤波电容这里有点随便了,为了弥补这个遗憾,秉着工程师的" ...
- WordPress 网站开发“微信小程序“实战(二)
原文链接:https://devework.com/wordpres...,转载请用明链注明来源,谢谢! 本文是"WordPress 开发微信小程序"系列的第二篇,本文记录的是开发 ...
- github 上有趣又实用的前端项目(持续更新,欢迎补充)
github 上有趣又实用的前端项目(持续更新,欢迎补充) 1. reveal.js: 幻灯片展示框架 一个专门用来做 HTML 幻灯片的框架,支持 HTML 和 Markdown 语法. githu ...
- Android普通工具类获取Context
在普通工具类中定义一个构造方法,类成员context,用于接收传过来的context 在activity中定义: 将context传过去. 在工具类中也可以使用SharePreferences,get ...
- Blazor组件自做四 : 使用JS隔离封装signature_pad签名组件
运行截图 演示地址 响应式演示 感谢szimek写的棒棒的signature_pad.js项目, 来源: https://github.com/szimek/signature_pad 正式开始 1. ...
- FastAPI(七十二)实战开发《在线课程学习系统》接口开发-- 留言列表开发
之前我们分享了FastAPI(七十一)实战开发<在线课程学习系统>接口开发-- 查看留言,这次我们分享留言列表开发. 列表获取,也需要登录,根据登录用户来获取对应的留言.逻辑梳理如下. 1 ...
- 使用Socket实现HttpServer(一)
使用Socket实现HttpServer(一) Socket 编程 socket 翻译过来叫插槽,一张图你就明白 socket 就插在 TCP 也就是传输层上,对用户的请求和服务器的响应进行处理. 下 ...