Apublic
B.protected
C.默认
D.private
(解析:所有子类会先用super()方法调用父类构造方法,再调用自己的构造方法)
class Person {
public Person() {
System.out.println("execute Person()");
}
}
class Student extends Person {
public Student() {
System.out.println("execute Student() ");
}
}
class PostGraduate extends Student {
public PostGraduate() {
System.out.println("execute PostGraduate()");
}
}
public class TestInherit {
public static void main(String[] args) {
new PostGraduate();
}
}
A.execute Person()
execute Student()
execute PostGraduate()
B.execute PostGraduate()
C.execute PostGraduate()
execute Student()
execute Person()
D.没有结果输出
(解析:上转型对象无法使用对象的新增方法,只能使用继承或重写的方法)
class Base {
public void method(){
System.out.print ("Base method");
}
}
class Child extends Base{
public void methodB(){
System.out.print ("Child methodB");
}
}
class Sample {
public static void main(String[] args) {
Base base= new Child();
base.methodB();
}
}
A.Base method
B.Child methodB
C.hild methodB
D.编译错误
A.abstract类中可以没有抽象方法
B.abstract类的子类也可以是抽象类
C.abstract方法可以有方法体
D.abstract类可以创建对象
(C(百度百科):java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现)
(D:抽象类不能实例化,即不能用new来实例化抽象类。)
A.public void aMethod( );
B.final void aMethod( );
C.void aMethod();
D.private void aMethod( );
(B:final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口。因为接口的方法是是抽象方法,必须通过子类继承重写来实现)
(D:接口的方法只能是public)
(1)public:可以被所有其他类所访问。
(2)private:只能被自己访问和修改。
(3)protected:自身,子类及同一个包中类可以访问。
(4)default(默认):同一包中的类可以访问,声明时没有加修饰符,认为是friendly。
(图片和内容来自https://blog.csdn.net/claram/article/details/48002833)
https://blog.csdn.net/smileflyinsky/article/details/62052722
(1)如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的;
(2)如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法;
(3)如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则;
(4)特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止;
https://blog.csdn.net/sheepmu/article/details/38327205
https://blog.csdn.net/razespirit/article/details/41248247
final:是一个修饰符
1.final可以修饰类,函数,变量(成员变量,局部变量)
2.被final修饰后的类不可以被其他类继承
3.被final修饰后的函数不可以被重写
4.被final修饰后的变量不允许被再次赋值,final在对变量进行修饰时一定赋值,
被public final static多个修饰符修饰的的变量我们称它为常量
abstract:是一个修饰符可以修饰方法,类。当我们多个类存在相同的功能,但是功能的主体不同,这时我进行向上抽取只抽取功能的定义不抽取功能的主体
1.抽象方法一定要在抽象类中
2.抽象类和抽象方法必须要被abstract关键字修饰
3.抽象的类是不能被创建对象,因为调用抽象的方法没意义
4.抽象类的中方法要被使用,必须由子类重写抽象类中的方法。
然后创建子类对象来调用
5.抽象类中可以定义非抽象的方法,有时我们需要此类不能被new关键
字创建对象时,可以用abstract将此类变成抽象类。
6.子类如果只重写一部分的抽象类方法,那么该子类还是一个抽象类,
如果抽象类的方法要被使用,子类必须重写抽象类中的所有方法。
https://blog.csdn.net/dianmomanxue/article/details/81300570
相同点:
都可以做比较;返回值均是布尔型boolean
不同点:
==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,比较的是地址值;重写后的equals方法比较的是对象中的属性
实现思路及关键代码:
1) 编写一个圆类Circle,该类拥有:
a) 一个成员变量,radius(私有,浮点型);//存放圆的半径
b) 两个构造方法(无参、有参);
c) 三个成员方法
double getArea() //获取圆的面积
double getPerimeter() //获取圆的周长
void show() //将圆的关径、周长、面积输出到屏幕
2) 编写一个圆柱体类Cylinder,它继承于上面的Circle类。还拥有:
a) 一个成员变量,double hight (私有,浮点型); //圆柱体的高;
b) 构造方法
c) 成员方法
double getVolume() //获取圆柱体的体积
void showVolume() //将圆柱体的体积输出到屏幕
比较复杂的版本:
package cn.sxt.homework05;
import java.util.Scanner;
/**
* 编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。
* @author Nirvana
*
*/
public class Homework01 {
public static void main(String[]args) {
Scanner input_r = new Scanner(System.in);
System.out.println("请输入半径");
double r = input_r.nextDouble();
Scanner input_h = new Scanner(System.in);
System.out.println("请输入高");
double h = input_h.nextDouble();
Circle c1 = new Cylinder();
c1.setRadius(r);
c1.show();
Cylinder c2 = (Cylinder) c1;
c2.setHight(h);
c2.showVolume();
}
}
class Circle{
private double radius; //存放圆的半径
final double pi = 3.14;
public Circle() {
}
public Circle(int radius) {
this.radius=radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() { //获取圆的面积
double area = getRadius()*getRadius()*pi;
return area;
}
public double getPerimeter() { //获取圆的周长
double perimeter = 2*pi*getRadius();
return perimeter;
}
public void show() { //将圆的关径、周长、面积输出到屏幕
System.out.println("圆的半径为:"+getRadius()+",圆的面积为:"+getArea()+"。圆的周长为"+getPerimeter());
}
}
class Cylinder extends Circle{
private double height; //圆柱体的高
public Cylinder() {
}
public Cylinder(double hight) {
this.height=hight;
}
public double getHight() {
return height;
}
public void setHight(double hight) {
this.height = hight;
}
public double getVolume() { //获取圆柱体的体积
double volume = getArea()*getHight();
return volume;
}
public void showVolume() {
System.out.println("圆柱体的体积为:"+getVolume());
}
}
改良后版本(省略了get和set方法)
import java.util.Scanner;
/**
* 编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。
* @author Nirvana
*
*/
public class Homework01 {
public static void main(String[]args) {
double r;
double h;
Scanner input_r = new Scanner(System.in);
System.out.println("请输入半径");
r = input_r.nextDouble();
Scanner input_h = new Scanner(System.in);
System.out.println("请输入高");
h = input_h.nextDouble();
Circle c1 = new Cylinder(r,h);
c1.show();
Cylinder c2 = (Cylinder) c1;
c2.showVolume();
}
}
class Circle{
private double radius; //存放圆的半径
final double pi = 3.14;
public Circle() {
}
public Circle(double r) {
this.radius=r;
}
public double getArea() { //获取圆的面积
double area = radius*radius*pi;
return area;
}
public double getPerimeter() { //获取圆的周长
double perimeter = 2*pi*radius;
return perimeter;
}
public void show() { //将圆的关径、周长、面积输出到屏幕
System.out.println("圆的半径为:"+radius+",圆的面积为:"+getArea()+"。圆的周长为"+getPerimeter());
}
}
class Cylinder extends Circle{
private double height; //圆柱体的高
public Cylinder() {
}
public Cylinder(double r,double hight) {
super(r);
this.height=hight;
}
public double getVolume() { //获取圆柱体的体积
double volume = getArea()*height;
return volume;
}
public void showVolume() {
System.out.println("圆柱体的体积为:"+getVolume());
}
}
实现思路及关键代码:
1) 定义乐器类Instrument,包括方法makeSound();
2) 定义乐器类的子类:二胡Erhu、钢琴Piano和小提琴Violin;
3) 定义乐手类Musician,可以弹奏各种乐器play(Instrument i);
4) 定义测试类,给乐手不同的乐器让他弹奏。
package cn.sxt.homework05;
/**
* 编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶
* @author Nirvana
*
*/
public class Homework02 {
public static void main(String[]args) {
Instrument e = new Erhu();
Instrument p = new Piano();
Instrument v = new Violin();
Musician m = new Musician();
m.play(e);
m.play(p);
m.play(v);
}
}
abstract class Instrument{ //定义抽象乐器类Instrument
String name;
String sound;
abstract public String makeSound(); //定义抽象方法makeSound()
}
class Erhu extends Instrument{
String name = "二胡";
String sound = "二胡声";
public String makeSound() {
return sound;
}
}
class Piano extends Instrument{
String name = "钢琴";
String sound = "钢琴声";
public String makeSound() {
return sound;
}
}
class Violin extends Instrument{
String name = "小提琴";
String sound = "小提琴声";
public String makeSound() {
return sound;
}
}
class Musician{
public void play(Instrument i) {
System.out.println(i.makeSound());
}
}
实现思路:
1) 分析影视歌三栖艺人的特性:可以演电影,可以演电视剧,可以唱歌
2) 定义多个接口描述特性
a) 演电影的接口-----方法:演电影
b) 演电视剧的接口-----方法:演电视剧
c) 唱歌的接口-----方法:唱歌
3) 定义艺人类实现多个接口
package cn.sxt.homework05;
/**
* 编写程序描述影视歌三栖艺人
* @author Nirvana
*
*/
public class Homework03 {
public static void main(String[]args) {
TriArtist a = new TriArtist("杨幂");
a.hello();
a.actMovie();
a.actTeleplay();
a.sing();
}
}
/**演电影接口*/
interface ActMovie{
void actMovie();
}
/**演电视剧接口*/
interface ActTeleplay{
void actTeleplay();
}
/**唱歌接口*/
interface Sing{
void sing();
}
class TriArtist implements ActMovie,ActTeleplay,Sing{ //定义艺人类实现多个接口
String name;
public TriArtist(String name) {
this.name=name;
}
@Override
public void actMovie() {
System.out.println("我能演电影");
}
@Override
public void actTeleplay() {
System.out.println("我能演电视剧");
}
@Override
public void sing() {
System.out.println("我会唱歌");
}
public void hello() {
System.out.println("大家好,我是"+name);
}
}