⭐️⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类
❤️例1:不使用继承,代码臃肿
⭐️下面两个类之间有很多代码都是重复的,这就造成代码的臃肿!代码没有得到重复利用;
在同一个类中:无参的构造方法,可以通过this()来调用有参的构造方法,让代码得到复用!
在不同类中:不同类之间让代码得到重复使用呢?这就需要继承!
public class ExtendsTest01{
public static void main(String[] args){
//3.1 创建普通账户
Account act = new Account();
act.setActno("1111111");
act.setBalance(10000);
System.out.println(act.getActno() + ",余额" + act.getBalance());
//3.2 创建信用账户
CreditAccount ca = new CreditAccount();
ca.setActno("2222222");
ca.setBalance(-10000);
ca.setCredit(0.99);
System.out.println(ca.getActno() + ",余额" + ca.getBalance() + ",信誉度" + ca.getCredit());
}
}
//1. 银行账户类;账户的属性:账号、余额,就比上面对一个属性
class Account{
//1.1 属性
private String actno;
private double balance;
//1.2 构造方法
public Account(){
}
public Account(String actno, double balance){
this.actno = actno;
this.balance = balance;
}
//1.3 setter and getter
public void setActno(String actno){
this.actno = actno;
}
public String getActno(){
return actno;
}
public void setBalance(double balance){
this.balance = balance;
}
public double getBalance(){
return balance;
}
}
//2. 其它类型的账户:信用卡账户;账号、余额、信誉度
class CreditAccount{
//2.1 属性
private String actno;
private double balance;
private double credit;
//2.2 构造方法
public CreditAccount(){
}
//2.3 setter and getter方法
public void setActno(String actno){
this.actno = actno;
}
public String getActno(){
return actno;
}
public void setBalance(double balance){
this.balance = balance;
}
public double getBalance(){
return balance;
}
public void setCredit(double credit){
this.credit = credit;
}
public double getCredit(){
return credit;
}
}
❤️例2:使用继承(extends)优化代码
⭐️使用继承机制来解决代码复用问题。
继承也是存在缺点的:耦合度高,父类修改,子类受牵连。使用继承,父类中被private修饰的实列变量子类就不能直接访问了!
只能用set和get方法接口访问!
public class ExtendsTest02{
public static void main(String[] args){
// 创建普通账户
Account act = new Account();
act.setActno("1111111");
act.setBalance(10000);
System.out.println(act.getActno() + ",余额" + act.getBalance());
// 创建信用账户
CreditAccount ca = new CreditAccount();
ca.setActno("2222222");
ca.setBalance(-10000);
ca.setCredit(0.99);
System.out.println(ca.getActno() + ",余额" + ca.getBalance() + ",信誉度" + ca.getCredit());
}
}
//1. 银行账户类;账户的属性:账号、余额
class Account{ // 父类
//1.1 属性
private String actno;
private double balance;
//1.2 构造方法
public Account(){
}
public Account(String actno, double balance){
this.actno = actno;
this.balance = balance;
}
//1.3 setter and getter
public void setActno(String actno){
this.actno = actno;
}
public String getActno(){
return actno;
}
public void setBalance(double balance){
this.balance = balance;
}
public double getBalance(){
return balance;
}
}
//2. 其它类型的账户:信用卡账户;账号、余额、信誉度
class CreditAccount extends Account{ //子类
//2.1 属性
private double credit;
//2.2 构造方法
public CreditAccount(){
}
public void doSome(){
//重点:使用继承,被private修饰的实列变量就不能直接访问了!只能用set和get方法接口访问!
System.out.println(actno);// 直接访问,是错误的
System.out.println(getActno());// 间接访问,可以,这里省略了this.
}
//2.3 setter and getter方法
public void setCredit(double credit){
this.credit = credit;
}
public double getCredit(){
return credit;
}
}
❤️例3:默认继承和间接继承
(1)默认继承Object类,例如:class A就代表class A extends Object。
(2)间接继承:Z直接继承了Y,Y又继承X,所以Z间接继承了X。
(3)一个子类只能有一个父类,但是一个父类可以被多个子类继承。
//1. 单继承
class A // 默认继承Object类class A extends Object
{
}
class C extends A
{
}
//2.多继承 语法错误
// java只允许单继承。不允许多继承。java是简单的。C++支持多重继承。
class E extends A, B //err
{
}
//3.间接继承:Z直接继承了Y,Y又继承X,所以Z间接继承了X
class X //默认继承Object类
{
}
class Y extends X
{
}
class Z extends Y
{
}
/*
Z继承了Y
Y继承了X
X继承了Object
Z对象具有Object对象的特征(基因)。
Object是所有类的超类。老祖宗。类体系结构中的根。
java这么庞大的一个继承结构,最顶点是:Object
*/
//4.一个父类可以被多个子类继承
class X //默认继承Object类
{
}
class Y extends X
{
}
class M extends X
{
}
🥅通过子类对象调用继承过来的方法
❤️例1:
测试:子类继承父类之后,能使用子类对象调用父类方法吗?
“能使用子类对象调用父类方法”;本质上,子类继承父类之后,是将父类继承过来的方法归为自己所有。实际上调用的也不是父类的方法,是他子类自己的方法(因为已经继承过来了就属于自己的)
public class ExtendsTest04{
public static void main(String[] args){
// 创建子类对象
Cat c = new Cat();
// 调用方法----没问题
c.move();
// 通过子类对象访问name----没问题
System.out.println(c.name);
}
}
// 父类
class Animal{
// 名字(先不封装)
String name = "XiaoHua"; //默认值不是null,给一个XiaoHua
// 提供一个动物移动的方法
public void move(){
System.out.println(name + "正在移动!");
}
}
// Cat子类
// Cat继承Animal,会将Animal中所有的全部继承过来。
class Cat extends Animal{
}
🥅什么时候使用继承
❤️测试:子类继承父类之后,能使用子类对象调用父类方法吗?
⭐️答:可以,因为子类继承了父类之后,这个方法就属于子类了❤️在实际开发中,满足什么条件的时候,我可以使用继承呢?
⭐️凡是采用“is a”能描述的,都可以继承。
例如:
Cat is a Animal:猫是一个动物
Dog is a Animal:狗是一个动物
CreditAccount is a Account:信用卡账户是一个银行账户
....
❤️假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,那么他们两个之间就可以继承吗?
答:不一定,还是要看一看它们之间是否能够使用is a来描述。例如:
class Customer{ // 客户
String name; // 名字
// setter and getter
}
class Product{ // 产品
String name; // 名字
// setter and getter
}
class Product extends Customer{ // 客户是一个产品(不对)
}
//以上的继承就属于很失败的。因为:Product is a Customer,是有违伦理的。
🥅println方法的解释
⭐️任何一个类,没有显示继承任何类,默认继承Object,那么Object类当中有哪些方法呢?老祖宗为我们提供了哪些方法?
⭐️java为什么比较好学呢?
是因为Java内置了一套庞大的类库,程序员不需要从0开始写代码,程序员可以基于这套庞大的类库进行“二次”开发。(开发速度较快,因为JDK内置的这套库实现了很多基础的功能)⭐️例如:String是SUN编写的字符串类、System是SUN编写的系统类,这些类都可以拿来直接使用。
⭐️JDK源代码在什么位置?例如我的:C:\Program Files\Java\jdk-13.0.2\lib\src.zip
⭐️你现在能看懂以下代码了吗?
System.out.println(“Hello World!”);
(1)System.out 中,out后面没有小括号,说明out是变量名。
(2)System是一个类名,直接使用类名System.out,说明out是一个静态变量。
(3)System.out 返回一个对象,然后采用“对象.”的方式访问println()方法
⭐️System.out.println(引用);当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后输出toString()方法的执行结果
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后输出toString()方法的执行结果
[外链图片转存中…(img-J1B4VhFa-1714703404484)]
[外链图片转存中…(img-fiecsqNx-1714703404485)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!