why的JAVA学习笔记4 -w-

==============================================================

继承 Extends

继承,extends
基础用法

class A{}
class B extends A{}
如上,B类继承A类

继承的特性如下:

① B类继承A类,则称A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。我们平时聊天说的比较多的是:父类和子类
② java 中的继承只支持单继承,不支持多继承,C++中支持多继承,这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:

class B extends A,C{}
这是错误的。

③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,例如:class C extends B,class B extends A,也就是说,C 直接继承 B,其实 C 还间接继承 A。
④ java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。可以通过间接的手段来访问。)
⑤ java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是 java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 Object类型中所有的特征。
⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类。

具体继承的解释用法

首先建立一个 银行账户类,包含账户的账号和余额

// 银行账户类
// 账户的属性:账号、余额
class Account{//父类
	// 属性
	private String actno;
	private double balance;
	// 构造方法
	public Account(){}
	public Account(String actno, double balance){
		this.actno = actno;
		this.balance = balance;
	}
	// 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;
 	}	
}

再建立一个新的类:信用卡账户类
除了上述银行账户类所含的属性外,还包含“信誉度”属性

//新的类:信用卡账户
//除了上述银行账户类所含的属性外,还包含“信誉度”属性
class CreditAccount extends Account{//子类
	// 属性
	private double credit;
	// 构造方法
	public CreditAccount(){}
	// setter and getter方法
	public void setCredit(double credit){
  		this.credit = credit;
 	}
 	public double getCredit(){
 		 return credit;
 	}
}

由继承可知,在CreditAccount中,同样包含了Account中的actno和balance,且包含了Account中的所有setter和getter。
所以可以在主类对他们操作时,这样写:

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());
}

可以看到,在上述代码中,明明在CreditAccount类中没有写setActno和setBalance等方法,但是由于继承,可以去调用写在父类的这类方法。

但是注意:构造方法不能继承,并且在子类中是无法直接访问父类中的private修饰的变量的。

例如,如下写法是错误

System.out.println(actno);
错误: actno 在 Account 中是 private 访问控制

因为 引用 ca是CreditAccount类创建的,其中并没有actno,actno是在父类之中且属于private修饰的私有变量,所以这样使无法直接访问的。

那么要如何去访问呢?
答案是:通过继承的setter和getter方法去访问

System.out.println(getActno());

如此,便可以对父类中的私有变量进行访问和修改了。

==============================================================

在实际开发中,满足什么条件的时候,我可以使用继承呢?

凡是采用“is a”能描述的,都可以继承。
例如:
Cat is a Animal:猫是一个动物(Cat类继承Animal类)
Dog is a Animal:狗是一个动物(Dog类继承Animal类)
CreditAccount is a Account:信用卡账户是一个银行账户(CreditAccount 继承Account类)
注意:并不是两个类有相同的代码就要继承,一定要有"is a"的关系!

==============================================================

对System.out.println(“Hello World!”);的解读

System.out.println("Hello World!");

现在再来看这段代码,可以理解到:
System是一个类名
out是一个变量名
println是一个方法名
类名.变量名.方法名 说明这个变量是一个静态变量。
例如下串代码

public class Test{
	static Student stu = new Student();
	public static void main(String[] args){
  		Student s = Test.stu;
  		s.exam();
  		//上2行合并为1行
  		Test.stu.exam();
  		//类比于
  		System.out.println("Hello World!");
}

class Student{
	public void exam(){
		System.out.println("EXAM");
	}
}

==============================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值