java09基础(构造方法 继承)

目录

一. 构造方法

1. 构造方法

2. 构造代码块

二. 继承

1. 基本概念

2. protected 关键字

 3. 构造方法的访问特点

4. 成员变量的访问特点

5. 成员方法的访问特点

6. 向上向下转型

6.1 向上转型

6.2 向下转型


一. 构造方法

1. 构造方法

初始化一个新的对象 构建、创造对象的时候,所调用的方法

语法规则:

构造方法:修饰符  方法名-和类名相同(参数类型  参数名){方法体}

默认构造方法:

public class Phone {public Phone() {}
}

public class Phone {//品牌private String brand;//价格private double price;//颜色private char color;public Phone() {}public Phone(String brand) {this.brand = brand;}public Phone(String brand, double price, char color) {this.brand = brand;this.price = price;this.color = color;}

[注]:

●构造方法没有返回值,也无void

●如果一个类我们没有给手动的写构造方法,系统会赠送一个无参的构造方法

●如果自己手动的写构造方法,系统则不送构造方法

●一般情况下,构造方法 不能直接调用 配合new关键字使用

●构造方法支持方法的重载


快捷键:

alt+shift+s

2. 构造代码块

在Java的类中使用{}声明的构造代码块,构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。

 // 构造代码块{System.out.println("构造代码块");}

作用:

和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以实现诸如统计创建对象的次数等类似功能。


示例:

3.观察Payment类的定义,请对构造方法进行重构,减少冗余代码。public class Payment {// 构造代码块{System.out.println("[预加载]检查支付环境");System.out.println("[预加载]生成支付流水号");System.out.println("[预加载]启动支付插件");}// 构造方法public Payment() {System.out.println("默认支付金额¥0.01.");System.out.println("默认支付通道中国银联.");}public Payment(double pay) {System.out.println("支付金额¥" + pay);System.out.println("默认支付通道中国银联.");}public Payment(double pay, String way) {System.out.println("支付金额¥" + pay);System.out.println("支付通道" + way);}
}
public class Demo03 {public static void main(String[] args) {Payment p1 = new Payment();System.out.println("============");Payment p2 = new Payment(777);System.out.println("============");Payment p3 = new Payment(7788,"建设银行");}

二. 继承

1. 基本概念

我们在学习过程中所有的基础都是类和对象,在类和对象这里我们有延伸出来几个非常重要的点----继承

作用:

共性抽取,提高代码的复用性(即多个类中,有共同的一些成员信息(变量、方法)可以提取到一个公共的类中,被提取的类继承了这个类,可以直接使用这些成员信息)
语法格式:

 修饰符  class  子类  extends  父类{子类可以直接调用父类非private修饰的成员方法和成员变量}

[注]:

●使用 extends 指定父类.
●子类会继承父类的所有 public 的字段和方法.
●对于父类的 private 的字段和方法, 子类中是无法访问的.
●子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用.

//父类 超类
//protected --- 受保护的,子类中是可以访问
public class Person {protected String name;protected int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat() {System.out.println("我有吃饭的方法");}
}
//Student 子类
//修饰符 class 子类 extends 父类{
//	继承到父类非私有的方法和属性
//}public class Student extends Person {private int score;public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void study() {System.out.println(name + "正在认真的学习..");}}
public class Demo01 {public static void main(String[] args) {Person p1 = new Person();p1.eat();System.out.println("==========");Student s1 = new Student();s1.eat();s1.setName("zkt");s1.study();}
}


●Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承).

public class Demo02 {public static void main(String[] args) {C c = new C();c.eat();// A类的吃饭方法// 继承Object类System.out.println(c.toString());// zkt.knowledge02.C@15db9742}
}class A {public void eat() {System.out.println("A类的吃饭方法");}
}class B extends A {}//java中的继承是单继承,可以多级继承
class C extends A {}

●java中是单继承,一个子类只能有一个父类
●java中多重继承
●java中一父类可以有多个子类

2. protected 关键字

刚才我们发现, 如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 "封装" 的初衷. 两全其美的办法就是 protected 关键字.

protected --- 受保护的,子类中是可以访问

●protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问

class Person {protected String name;protected int age;
}class Student extends Person {public String hello() {return "Hello, " + name; }
}

 3. 构造方法的访问特点

public class Fu {private int a;public Fu() {System.out.println("这是父类的无参构造方法");}public Fu(int a) {this.a = a;System.out.println("这是父类的有参构造方法");}}
public class Zi extends Fu {public Zi() {super();System.out.println("这是子类的无参构造方法");}public Zi(int a) {super(a);System.out.println("这是子类的有参构造方法");}
}
public class Demo03 {public static void main(String[] args) {Fu fu1 =new Fu();System.out.println("===========");Fu fu2 =new Fu(10);System.out.println("===========");Zi zi1 =new Zi();System.out.println("===========");Zi zi2 =new Zi(10);}
}

super--表示的是超类或者父类的意思
●super()    父类的构造方法


构造方法里面:
●默认调用父类无参构造方法super()
●如果显示的写了super(参数),默认的则不赠送
●super()一定是在第一行
●this()必须写在第一行,所以super()和this()不能同时出现

public class Person {protected String name;protected int age;public String getName() {return name;}public Person(String name, int age) {super();this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
public class Student extends Person {private int score;public Student() {//默认调用父类无参构造方法// super();//调用父类的有参构造方法super("zkt",18);}public Student(String name, int age, int score) {super(name, age);this.score = score;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void hello() {System.out.println(name + "的年龄为"+age+"正在给您打招呼..");}}
public class Demo01 {public static void main(String[] args) {Student s1 =new Student();s1.hello();System.out.println("===========");Student s2 =new Student("zkt2",20,99);s1.hello();}
}

4. 成员变量的访问特点

●=左边是谁,访问的就是谁

●就近原则 :局部>成员>父类的成员

public class Fu {protected	int a =5;protected	int b =10;	
}
public class Zi extends Fu {public int a = 10000;public String b = "这是子类的b";public int c = 999;//就近原则//局部>成员>父类的成员public void sayHello() {System.out.printf("hello,a的值为%s,b的值为%s,c的值为%s\n", a, b, c);System.out.printf("hello,a的值为%s,b的值为%s,c的值为%s\n", this.a, this.b, this.c);System.out.printf("hello,a的值为%s,b的值为%s,c的值为%s\n", super.a, super.b, c);}
}
public class Demo01 {public static void main(String[] args) {Fu fu = new Fu();System.out.println(fu.a);System.out.println(fu.b);System.out.println("=========");Zi zi = new Zi();System.out.println(zi.a);System.out.println(zi.b);System.out.println("**********");zi.sayHello();System.out.println("**********");System.out.println("=========");// 父父new子 , =左边是谁,访问的就是谁Fu fu1 = new Zi();System.out.println(fu1.a);System.out.println(fu1.b);
//		System.out.println(fu1.c); 父类中没有此成员变量System.out.println("***********");}
}

5. 成员方法的访问特点

●new的是谁,访问就是谁

●编译看左边运行看右边 new出来的是谁就是谁

public class Fu {public void sayHello() {System.out.println("这个是父类的sayHello方法");}
}

方法的重写:

●发生在子类和父类中,如果父类所提供的方法不能满足子类的需求,则子类可以重写
●方法名相同,参数项相同,返回值也相同,子类的修饰符>=父类的修饰符,方法体不同

public class Zi extends Fu {public void test() {System.out.println("这个是子类独有的方法");}//方法的重写://发生在子类和父类中,如果父类所提供的方法不能满足子类的需求,则子类可以重写//方法名相同,参数项相同,返回值也相同,子类的修饰符>=父类的修饰符,方法体不同public void sayHello() {System.out.println("这个是子类的sayHello方法");}
}
public class Demo01 {public static void main(String[] args) {//new出来的是谁 调用就是谁Fu fu = new Fu();fu.sayHello();//new出来的是谁 调用就是谁Zi zi = new Zi();zi.test();zi.sayHello();//编译看左边运行看右边 new出来的是谁就是谁Fu fu1 = new Zi();fu1.sayHello();
//		fu1.test(); 父类中没有声明此方法}
}

6. 向上向下转型

6.1 向上转型

父类的引用指向子类的对象,一定是安全的

语法格式:

向上转型 ---直接赋值父类 对象名 =new 子类();
public class Animal {protected String name;public void eat() {System.out.println("这个是父类的吃饭方法");}public Animal(String name) {this.name = name;}
}
public class Bird extends Animal {public String name = "扁扁";public String age;public Bird(String name) {super(name);}public void fly() {System.out.println("我是一直小小鸟,我在飞");}
}
public class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void eat() {System.out.println(name + "小狗正在吃饭");}
}
public class Demo01 {public static void main(String[] args) {// 1.向上转型 ---直接赋值// 父类 对象名 =new 子类();父类的引用指向子类Animal a1 = new Bird("圆圆");System.out.println(a1.name);//成员变量看左边a1.eat(); //方法编译看左边,运行看右边
//		a1.fly();Bird bird =new Bird("方方");Animal a2 = bird;}}

用途:

public class Demo02 {public static void main(String[] args) {Bird b1=new Bird("小鸟");Dog d1 =new Dog("小狗");eat(b1);eat(d1);}//2.向上转型,方法的参数public static void eat(Animal a1) {a1.eat();}//3.向上转型,方法的返回值public static Animal aaa() {return new Bird("小鸟1号");}//3.向上转型,方法的返回值public static Animal bbb() {return new Dog("小狗1");}}

6.2 向下转型

父类引用转为子类对象 可能会出现问题

语法格式:

子类类名 对象名 =(子类类名)父类的对象名;

可能会出现的问题:CalssCastException

解决上述问题:

使用instanceOf关键字先判断是否是子类类型
boolean  b = 父类类型的对象 instance of 子类;
boolean b = 接口类型的对象 instance of 子类;

public class Demo03 {public static void main(String[] args) {Animal a1 =new Dog("小狗");
//		a1.fly();//		ClassCastException--向下转型的时候,转的父类的对象一定要是目前真正的子类类型
//		子类类名 对象名 =(子类类名)父类的对象名;if(a1 instanceof Bird) {Bird b1 = (Bird) a1;b1.fly();}else {System.out.println("哎呦,你不是这种类型");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年03月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共10题,共30分) 第1题 圆点角色的程序如下图1所示(角色默认方向90),运行程序,输入“HLHLHLHL”后得到的结果如下图2所示,如果想得到下图3中的结果,应该输入的字符串是?( ) A:HLLLHLLL B:LLLLLLL…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

C语言—控制语句

控制语句就是用来实现对流程的选择、循环、转向和返回等控制行为。 分支语句 if语句 基本结构 if(表达式) { 语句块1&#xff1b; } else { 语句块2&#xff1b; } 执行顺序&#xff1a; 如果表达式判断成立&#xff08;即表达式为真&#xff09;&#xff0c;则执行语句块…

Python量化炒股的统计数据图

Python量化炒股的统计数据图 单只股票的收益统计图 查看单只股票的收盘价信息 单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令&#xff0c;进入Jupyter Notebook的研究平台。然后单击“新建”按钮&#xff0c;创建Python3文件&#xff0c;输入如下代码如下&am…

面试集中营—Spring篇

Spring 框架的好处 1、轻量&#xff1a;spring是轻量的&#xff0c;基本的版本大约2MB&#xff1b; 2、IOC&#xff1a;控制反转&#xff0c;Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了&#xff0c;而是由容易来控制&#xff0c;一个字&#xff1a;爽&#xf…

Docker——consul的容器服务更新与发现

一、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初的解决手段…

【学习AI-相关路程-工具使用-自我学习-cudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 &#xff08;2&#xff09;】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

Rust Postgres实例

Rust Postgres介绍 Rust Postgres是一个纯Rust实现的PostgreSQL客户端库&#xff0c;无需依赖任何外部二进制文件2。这意味着它可以轻松集成到你的Rust项目中&#xff0c;提供对PostgreSQL的支持。 特点 高性能&#xff1a;Rust Postgres提供了高性能的数据库交互功能&#…

js api part4

其他事件 页面加载事件 外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 原因&#xff1a;有些时候需要等页面资源全部处理完了做一些事情&#xff0c;老代码喜欢把 script 写在 head 中&#xff0c;这时候直接找 dom 元素找不到。 事件…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例&#xff0c;仅是个人日常学习研究的部分成果。 如有不当&#xff0c;请联系删除。 在研究完阿里的算法以后&#xff08;其实很难说研究完&#xff0c;还有很多内容没有研究透&#xff0c;只能说暂时告一段落&#xff09;&…

服务智能化公共生活场景人员检测计数,基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建公共生活场景下人员检测计数识别系统

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各种智能化系统已广泛应用于各个领域&#xff0c;特别是在人员密集、流动性大的场合&#xff0c;如商场、火车站、景区等&#xff0c;智能人员检测计数系统发挥着至关重要的作用。特别是在特殊时期&#xff0c;如节假日、…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域说明一&#xff08;从函数作用域方面&#xff09;-CSDN博客cmake进阶&#xff1a;变量的作用域说明二&#xff08;从函数作用域方面&#xff09;-CSDN博客…

C++:多继承虚继承

在C中&#xff0c;虚继承&#xff08;Virtual Inheritance&#xff09;是一种特殊的继承方式&#xff0c;用于解决菱形继承&#xff08;Diamond Inheritance&#xff09;问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类&#xff0c;从而导致了多个实例同一个…

Problem 5: Whack-A-Mole打地鼠

实战题&#xff1a;打地鼠 内容如附件所示&#xff1a; 测试数据为:1,2,4,8,9,10,11,14 答案为&#xff1a;10,2,4 原始分布&#xff1a; 击打10号 击打2号 击打4号 要求&#xff0c;所示实例解以图示的方式给出&#xff0c;并且5组测试数据都需要测试&#xff0c;…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

青春送温暖 立夏寄真情

&#xff08;通讯员&#xff1a;赵灿飞 图&#xff1a;杨美、孙红浪&#xff09; 在青春洋溢的五月&#xff0c;为传承中华民族尊老敬老的传统美德&#xff0c;促进当代青年与老人的跨代交流&#xff0c;增强青年的社会责任感和使命感&#xff0c;传递正能量和关爱困难群体…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获&#xff1a; 二叉树的递归遍历二叉树的迭代遍历&#xff0c;中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现&#xff08;要处理的节点放入栈之后&#xff0c;紧接着放入一个空指针作为标记&#xff09; 二叉树理论基础篇 题目分类 题目分…