一、什么是继承
1.继承体现的是一种父子关系
2.由一个已有的类创建出新类的机制。【扩展】
已有的类----父类
新类-----------子类
3.面向对象的特征
二、如何完成一个继承关系
已有的类----父类
新类-----------子类
通过extends关键字实现继承关系
继承格式:
public class 新类 extends 父类{
}
例如:
public class Person{
}
public class Student extends Person{
}
Student----子类,Person----父类,Student子类是对Person父类的扩展。
三、子类对象的创建过程
对象创建----需要依赖于构造方法
子类对象创建—需要依赖于子类的构造方法,子类的构造方法中会默认调用父类的构造方法【没有父就没有子】,如果一定要强制访问调用父类有参数的构造方法,就需要在子类的构造方法中的第一行通过“super(参数值)”,就可以指定调用父类的任意一个构造方法。
例如:
package jicheng_1;
public class Person {
public Person() {
System.out.println("父类无参数的构造方法");
}
public Person(String name) {
System.out.println("父类有参数的构造方法--参数name=="+name);
}
}
package jicheng_1;
public class Student extends Person{
//子类对象创建--需要依赖与籽类的构造方法,子类的构造方法中会默认调用弗雷德无参数构造方法【没有父就没有子】
public Student() {
//super();//弗雷德无参数构造方法【默认可以省略】
super("zhangsan"); //父类的有参数构造方法
System.out.println("子类Student的无参数构造方法");
}
}
package jicheng_1;
public class Test1 {
public static void main(String[] args) {
//子类对象创建---需要依赖于子类的构造方法,子类的构造方法中会默认调用父类的无参数构造方法【没有父就没有子】
new Student();
}
}
运行结果:
四、java 中如何创建一个包
通过package关键字+【空格】+包名;[首行]
五、java中包的作用是什么?
方便管理java类,区分名称相同的java类/接口。
六、java中包的具体用法?
import 包名+类名/*;【次行】
Java.lang包不需要导入。
七、java中的访问限制修饰符的区别和用法?
Java中有四种权限修饰符,分别是public,protected,default【缺省的/友好的】,private
Java类–public【任何位置,不用担心跨包】/ default【缺省的/友好的】【跨包不能访问】
Java类中的成员变量—public,protected,default【缺省的/友好的】,private
Java类中的方法---------public,protected,default【缺省的/友好的】,private
public【公共的】/protected【受保护的】/default【缺省的/友好的】/private【私有的】
例:
同一个类中
package com.xianzhi.Test1;
public class MyClass {
public static String publicop="public";
protected static String protectedop="protected";
static String defaultop = "default";
private static String privateop = "private";
public MyClass() {
System.out.println("publicop=="+publicop);
System.out.println("protectedop=="+protectedop);
System.out.println("defaultop=="+defaultop);
System.out.println("privateop=="+privateop);
System.out.println("-------------------");
}
public void myClassMethod() {
System.out.println("publicop=="+publicop);
System.out.println("protectedop=="+protectedop);
System.out.println("defaultop=="+defaultop);
System.out.println("privateop=="+privateop);
System.out.println("-------------------");
}
public static void myClassstaticMethod() {
System.out.println("publicop=="+publicop);
System.out.println("protectedop=="+protectedop);
System.out.println("defaultop=="+defaultop);
System.out.println("privateop=="+privateop);
}
}
package com.xianzhi.Test1;
public class Test1 {
public static void main(String[] args) {
MyClass mc=new MyClass();
mc.myClassMethod();
MyClass.myClassstaticMethod();
}
}
运行结果
同一个包中
package com.xianzhi.Test2;
public class DemoClass {
public void publicMethod() {
System.out.println("public--实例方法");
}
protected void protectedMethod() {
System.out.println("protected--实例方法");
}
void defaultMethod() {
System.out.println("default--实例方法");
}
private void privateMethod() {
System.out.println("private--实例方法");
}
}
package com.xianzhi.Test2;
public class DemoSunClass extends DemoClass {
public void demoSunMethod1() {
DemoClass dc=new DemoClass();
dc.publicMethod();
dc.protectedMethod();
dc.defaultMethod();
//dc.privateMethod();
}
//同一个包中子类可以继承父类中除过private修饰的变量/方法
public void demoSunMethod2() {
publicMethod();
protectedMethod();
defaultMethod();
//privateMethod();
demoSunMethod1();
}
}
package com.xianzhi.Test2;
public class MyTestClass {
public void myTestMethod() {
DemoClass dc = new DemoClass();
dc.publicMethod();
dc.protectedMethod();
dc.defaultMethod();
//dc.privateMethod
}
}
package com.xianzhi.Test2;
public class Test2 {
public static void main(String[] args) {
MyTestClass mtc = new MyTestClass();
mtc.myTestMethod();
}
}
运行结果
不同包子类
package com.xianzhi.Test3;
public class Person {
public static void publicMethod() {
System.out.println("public--类方法");
}
public static void protectedMethod() {
System.out.println("public--类方法");
}
public void defaultMethod() {
System.out.println("public--类方法");
}
public static void privateMethod() {
System.out.println("public--类方法");
}
}
不同包非子类
package com.xianzhi.Test4;
import com.xianzhi.Test3.Person;
public class Student extends Person{
public void studentMehtod1() {
Person.privateMethod();
Person.protectedMethod();
//Person.defaultMethod();
//Person.privareMethod();
}
public void studentMehtod2() {
Person person=new Person();
Person.privateMethod();
Person.protectedMethod();
//Person.defaultMethod();
//Person.privareMethod();
}
//不同包中子类可以继承父类中public/protected修饰的变量/方法
public void studentMehtod3() {
Person.privateMethod();
Person.protectedMethod();
//Person.defaultMethod();
//Person.privareMethod();
studentMehtod1();
}
}
package com.xianzhi.Test4;
import com.xianzhi.Test3.Person;
public class TestClass {
public void testtMehtod1() {
Person person=new Person();
person.publicMethod();
//person.protectedMethod();
//person.defaultMethod();
//person.privateMethod();
}
public void testtMehtod2() {
Person.publicMethod();
//Person.protectedMethod();
//Person.defaultMethod();
//Person.privateMethod();
}
}
八、Java中子类的继承性
1.java中的类是单继承。
2.同一个包中子类可以继承父类中除过private修饰的变量/方法。
3.不同包中子类可以继承父类中public/protected修饰的变量/方法。
4.子类中的变量和方法,有一部分是子类从父类继承的,还有一部分是子类自己创建。
九、成员变量的隐藏
1.在同一个类中,局部变量的名称与某一个成员变量的名称相同
2.在子类中的某一个成员变量的名称与父类某一个成员变量的名称相同
例如:
package com.lx.yc_1;
public class Person {
public char name='A';
public void test() {
String name ="lisi";
System.out.println("name=="+name);
//如果需要强制输出被隐藏的成员变量的值"this"
//System.out.println("name=="+this.name);
}
}
package com.lx.yc_1;
public class Student extends Person {
public String name="wangwu";
public void testStudent() {
System.out.println("name=="+name);
//如果需要在籽类中强制输出被隐藏的成员变量的值“super”
System.out.println("name=="+super.name);
}
}
package com.lx.yc_1;
public class Test1 {
public static void main(String[] args) {
//Person person=new Person();
//person.test();
Student stu = new Student();
stu.testStudent();
}
}
十、什么是方法重写
在子类中某一个方法与父类中的某一个方法相同,此时就是子类重写父类的方法。
【被子类重写的方法一定是能够被子类继承】
例如:
package com.lx1;
public class Person {
public void info() {
System.out.println("父类Person的实例方法");
}
}
package com.lx1;
public class Student extends Person{
public void info() {
System.out.println("子类Student类重写父类的info实例方法");
//如果强制使用被重写的父类方法
super.info();
}
}
package com.lx1;
public class TestMain {
public static void main(String[] args) {
Student stu = new Student();
stu.info();
}
}
十一、方法重载与方法重写的区别